Java编程那些事儿55—方法重载和参数传递
副标题#e#
7.5 要领沟通
在Java语言中,要领沟通的观念和其它措施设计语言不尽沟通,Java语言中的要领沟通指要领名称和参数列表都沟通,个中参数列表沟通指参数个数、参数范例和参数分列顺序等沟通,参数名称可以不沟通。沟通的要了解见节制符、返回值范例可以不沟通。
以下是一下沟通的要领:
public void test(int a,double[] d)
private int test(int i,double[] d1)
在同一个类内部,不能声明沟通的要领,不然将呈现语法错误。
7.6 要领重载
要领重载(overload)是一种语法现象,指在一个类内部呈现了多个要领名沟通,可是参数列表差异的要领。
要领重载的浸染是将成果沟通,可是参数列表差异的要领回收沟通的要领名称,便于措施员利用。按照要领沟通的观念,重载的要领都是不沟通的要领。
在Java提供的API中,大量应用重载的观念,利便措施员对付系统成果要领的实际利用。
得当的利用重载,可以加强代码的可维护性。
以下是要领重载的示例:
public void a(int a){}
public int a(){}
public void a(int a,String s){}
在以上示例要领中,要领的名称都是a,而参数列表却各不沟通,这些要领实现了重载的观念。可是仔细调查可以发明,这些重载的要领的返回值不尽沟通,因为返回值范例和要领的重载无关。
凡是环境下,重载的要领在会见节制符、修饰符和返回值范例上都保持沟通,这个不是语法的要求,只是将这些建造成一致今后,便于实际利用。
7.7 参数通报
在要领挪用时,需要按照要领声明传入适当的参数,通过每次挪用要领时传参,极大的加强了要领的统一性,制止了要领内部成果代码的反复。可是在实际通报参数时,假如在要领内部修改了参数的值,则挪用时利用的变量是否产生改变呢?
譬喻如下代码:
/**
* 参数通报代码示例
*/
public class TransferValueDemo {
public static void main(String[] args) {
int m = 10;
int[] a = {1,2,34};
test(m,a);
System.out.println(m);
System.out.println(a[0]);
}
public static void test(int n,int[] t){
n = 0;
t[0] = 123;
}}
则执行该措施今后,措施的输出功效是:10 123。则在挪用test要领时,同样都是传入参数,为什么变量m的值未改变,而a[0]的值产生了改变呢?下面就来说明该问题。
#p#副标题#e#
在参数通报时,一般存在两种参数通报的法则,在Java语言中也是这样,这两种方法依次是:
l 按值通报(by value)
按值通报指每次通报参数时,把参数的原始数值拷贝一份新的,把新拷贝出来的数值通报到要领内部,在要领内部修改时,则修改的时拷贝出来的值,而原始的值不产生改变。
说明:利用该方法通报的参数,参数原始的值不产生改变。
l 按址通报(by address)
按址通报指每次通报参数时,把参数在内存中的存储地点通报到要领内部,在要领内部通过存储地点改变对应存储区域的内容。由于在内存中牢靠地点的值只有一个,所以当要领内部修改了参数的值今后,参数原始的值产生改变。
说明:利用该方法通报的参数,在要领内部修改参数的值时,参数原始的值也产生改变。
在Java语言中,对付那些数据范例是按值通报,那些数据范例是按址通报都作出了硬性划定,如下所示:
l 按值通报的数据范例:八种根基数据范例和String
l 按址通报的数据范例:除String以外的所有复合数据范例,包罗数组、类和接口
凭据这里的语礼貌则,则上面的代码中变量m的范例是int,属于按值通报,所以在要领内部修改参数的值时m的值不产生改变,而a的范例是数组,属于按址通报,所以在要领内部修改参数的值时,原始的值产生了改变。
按值通报和按址通报在实际利用时,需要小心,出格是在要领内部需要修改参数的值时。有些时候,对付按值通报的参数需要修改参数的值,可能按址通报时,不想修改参数的值,下面是实现这两种方法时的示例代码。
按值通报时通过返回值修改参数的值:
/**
* 按值通报的范例通过返回值修改参数的值
*/
public class TransferValueDemo1 {
public static void main(String[] args) {
int m = 10;
m = test1(m); //手动赋值
System.out.println(m);
}
public static int test1(int n){
n = 15;
return n;
}}
在该示例代码中,通过把修改今后的参数n的值返回,来为变量m赋值,强制修改按值通报参数的值,从而到达批改参数值的目标。
按址通报时通过从头生成变量制止修改参数的值:
#p#分页标题#e#
/**
* 按址通报时通过从头生成变量制止修改参数的值
*/
public class TransferValueDemo2 {
public static void main(String[] args) {
int[] a = {1,2,3};
test2(a);
System.out.println(a[0]);
}
public static void test2(int[] m){
int[] n = new int[m.length];
for(int i = 0;i < m.length;i++){
n[i] = m[i];
}
n[0] = 10;
}}
在该示例代码中,通过在要领内部创新建设一个数组,而且把传入数组中每个参数的值都赋值给新建设的数组,从而实现复制数组内容,然后再修改复制后数组中的值时,本来的参数内容就不产生改变了。
这里系统先容了Java语言中参数通报的法则,深刻领略这些法则将可以越发机动的举办措施设计。譬喻利用复合数据范例按址通报的特性可以很利便的实现多参数的返回,代码示譬喻下:
public int test3(int[] m,int[] n){……}
则该要领中,实际上返回了三种值,一个int的返回值,数组m的值,数组n的值,这只是参数通报的一种根基利用,在JDK提供的API文档中也大量的存在该要领。
7.8 小结
本部门系统的先容了要领的观念,要领的语法,要领的挪用以及和要领有关的一些其它语法常识,深刻领略这些语法是举办措施设计的基本。