方法(可变参数,参数绑定)面对面编程基础
可变参数
可变参数是用“类型...”定义,相当于数组类型:
class Group {
private String[] names;
public void setNames(String... names) {
this.names = names;
}
}
上面代码,就是定义了一个名为setNames的可变参数
下面是调用可变参数的方法
Group g = new Group();
g.setNames("Xiao Ming", "Xiao Hong", "Xiao Jun"); // 传入3个String
g.setNames("Xiao Ming", "Xiao Hong"); // 传入2个String
g.setNames(); // 传入0个String
也有第二个方法定义可变参数,但是调用方法就会麻烦一些
class Group {
private String[] names;
public void setNames(String[] names) {
this.names = names;
}
}
麻烦在这里,调用时需要自己先构造String[]
Group g = new Group();
g.setNames(new String[] {"Xiao Ming", "Xiao Hong", "Xiao Jun"}); // 传入1个String[]
参数绑定
What?调用方把参数传给实例方法时,调用时传递的值会按调用位置一一绑定
先看一组基本类型参数的传递
public class Main {
public static void main(String[] args) {
Person p = new Person();
int n = 15; //n的值为15
p.setAge(n);
System.out.println(p.getAge()); // 15
n = 20; // n的值改为20
System.out.println(p.getAge()); // 15还是20?
}
}
class Person {
private int age;
public int getAge() {
return this.age;
}
public void setAge(int age) {
this.age = age;
}
}
运行代码结果显示,修改外部的局部变量n,不影响实例p的age字段。
原因是setAge()方法获得的参数,复制了n的值,因此,p.age和局部变量n互不影响。
现在看一个传递引用参数的例子
public class Main {
public static void main(String[] args) {
Person p = new Person();
String[] fullname = new String[] { "Homer", "Simpson" };//使用了上面介绍的第二种定义可变参数的方法
p.setName(fullname);
System.out.println(p.getName()); // "Homer Simpson"
fullname[0] = "Bart"; // fullname数组的第一个元素修改为"Bart"
System.out.println(p.getName()); // "Homer Simpson"还是"Bart Simpson"?
}
}
class Person {
private String[] name;
public String getName() {
return this.name[0] + " " + this.name[1];
}
public void setName(String[] name) {
this.name = name;
}
}
注意到setName()的参数现在是一个数组。
一开始,把fullname数组传进去,然后,修改fullname数组的内容,结果发现,实例p的字段p.name也被修改了!
浙公网安备 33010602011771号