首先来看看,数组作为参数传递时,传递的到底是地址还是值,这个笔者开始真心没弄明白,就是JAVA基础知识不够牢固。
首先我们来看下面的代码:
public static void testArray(int[] a){
for(int i = 0;i<a.length;i++){
a[i] = 1;
}
System.out.println("In the method:");
for(int i = 0;i<a.length;i++){
System.out.print(" "+a[i]);
}
}
public static void main(String[] args) {
int[] a = {2,3,4,5};
System.out.println("Before the method...");
for(int i =0 ;i<a.length;i++){
System.out.print(" "+a[i]);
}
System.out.println();
Operator.testArray(a);
System.out.println();
System.out.println("After the method...");
for(int i =0 ;i<a.length;i++){
System.out.print(" "+a[i]);
}
}
这三个位置分别在数组作为参数传递之前、方法中、方法后进行了输出,下面是得到的结果:Before the method...
2 3 4 5
In the method:
1 1 1 1
After the method...
1 1 1 1
从上面的输出结果可以看出,数组作为参数传递的时候传递的是引用地址而不是值,所以当在方法中修改了其中的值之后,对应地址的值也会跟着改变,所以输出的就是修改之后的值。
2、到了这里,笔者又思考一个问题,是不是对象作为参数传递时都是传递的地址呢,来看下面的代码:
public static void testObject(Person person){
person.setName("11");
person.setNumebr(123);
}
Person p = new Person();
p.setName("22");
p.setNumebr(456);
System.out.println("Before:"+p.getName()+" "+p.getNumebr());
Operator.testObject(p);
System.out.println("After:"+p.getName()+" "+p.getNumebr());
下面来看输出结果:Before:22 456
After:11 123
从上面的输出可以看出,对象作为参数传递时,传递的也是地址
3、最后,再来看看对象数组作为参数传递时传递的是什么
来看下面的代码:
public static void testListObject(List<Person> persons){
for(Person person : persons){
person.setName("zhangsan");
person.setNumebr(000);
}
}
List<Person> persons = new ArrayList<Person>();
persons.add(new Person("1",123));
persons.add(new Person("2",456));
persons.add(new Person("3",789));
persons.add(new Person("4",012));
System.out.println("Before...");
for(Person person : persons){
System.out.println(person.getName()+" "+person.getNumebr());
}
System.out.println();
Operator.testListObject(persons);
System.out.println("After...");
for(Person person : persons){
System.out.println(person.getName()+" "+person.getNumebr());
}
下面来看输出结果: Before...
1 123
2 456
3 789
4 10
After...
zhangsan 0
zhangsan 0
zhangsan 0
zhangsan 0
从上面的结果可看出,对象数组作为形参传递时也是传递的地址.