JAVA基础知识回顾之---方法中的参数传递

时间:2021-11-18 21:26:35
关于JAVA中方法的参数传递,到底是传递的地址还是引用的值,这个困惑了笔者很久,现在总算弄明白了, 首先,对于基本数据类型,传递参数时作为形参,传递的肯定是引用值,纠结的就在于引用数据类型 
首先来看看,数组作为参数传递时,传递的到底是地址还是值,这个笔者开始真心没弄明白,就是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

从上面的结果可看出,对象数组作为形参传递时也是传递的地址.