1.什么是值传递?

值传递:方法调用时,会创建副本,传递的是值的副本。也就是说传递后就不相关了。

代码示例:

public static void main(String[] args) {
    int i = 666;
    System.out.println("调用changeInt方法前main方法中的i:"+i); // 666
    changeInt(i);
    System.out.println("调用changeInt方法后main方法中的i:"+i); // 666
}
public static void changeInt(int i) {
    // 这里我们改变i的值并不会对原来的i造成影响
    i = 888;
    System.out.println("changeInt方法中的i:"+i); // 888
}

2.什么是引用传递?

引用:引用可以理解为对象的别名,也可以理解为指向。这个概念很重要
Student student; // 声明一个指向null的引用
student = new Student(); // 引用指向一个学生对象
引用传递:方法调用时,不会创建副本,传递的是引用。也就是说传递后对形参进行重新赋值会改变引用的指向。

形象举例:

引用传递:你有一把钥匙,当你的朋友想要去你家的时候,如果你直接把你的钥匙给他了,这就是引用传递。这种情况下,如果他对这把钥匙做了什么事情,比如他在钥匙上刻下了自己名字,那么这把钥匙还给你的时候,你自己的钥匙上也会多出他刻的名字。

值传递:你有一把钥匙,当你的朋友想要去你家的时候,你复刻了一把新钥匙给他,自己的还在自己手里,这就是值传递。这种情况下,他对新钥匙做什么都不会影响你手里的钥匙。

3.Java中对象做参数传递时产生的引用传递的错觉

错觉原因:

不管是值传递还是引用传递,你的朋友拿着你给他的钥匙,进到你的家里,把你家的电视砸了,你都会受到影响。

Java对象做参数传递时,传递的是地址值的拷贝,这个时候形参和实参的都指向了同一个对象,对对象的属性进行操作当然会有影响。

错觉代码:

public static void main(String[] args) {
    Student student = new Student(12, "猪");
    System.out.println(student); // Student(age=12, name=猪)
    changeStudent(student);
    System.out.println(student); // Student(age=21, name=大白菜)
}
public static void changeStudent(Student student) {
    student.setAge(21);
    student.setName("大白菜");
    System.out.println(student); // Student(age=21, name=大白菜)
}

验证对象做参数传递是值传递的正确代码:

public static void main(String[] args) {
    Student student = new Student(12, "猪");
    System.out.println(student); // Student(age=12, name=猪)
    changeStudent(student);
    System.out.println(student); // Student(age=12, name=猪)

}
public static void changeStudent(Student student) {
    // 这个地方如果传递的是引用(即指向猪学生的student),那改变他的指向应该会影响到原来的引用student,但是并没有
    student = new Student(21, "大白菜");
    System.out.println(student); // Student(age=21, name=大白菜)
}

4.Java中值传递的现象

  1. 基本类型参数,方法体内对参数进行重新赋值或者运算,不会改变原有变量的值。
  2. 引用类型参数,方法体内对参数进行重新实例化,不会改变原引用的指向
  3. 引用类型参数,方法体内对参数的属性进行操作,会改变原引用指向对象的属性值

5.结论

Java中的参数传递都是值传递
基本数据类型传递的是值的拷贝
引用数据类型传递的是地址值的拷贝(引用所指向对象的地址值)

爪哇咿
1 声望0 粉丝

Java是世界上最好的语言


下一篇 »
Redis初始