java的传值与传引用
2018-02-03 12:57
134 查看
对于基本类型,java都是传值。而对于引用类型,其实java也是通过值传递的,只是传递的值不是实例本身,而是实例的引用的副本。
将num传入genericFunc中时,会生成一个num的副本,副本中保存的也是1。所以无论genericFunc怎样对形参a操作,都不会影响到num原本的值。
而obj传入referenceFunc时,也会生成obj的副本。由于obj中保存的是new Object()出来的引用地址,假设为address,所以生成的副本也同样保存的是address。
所以在referenceFunc对a操作时会有两种表现情况:
改变形参指向的实例的成员变量,会真正改变传入的实参中的成员变量值。
在方法中改变形参的引用,不会改变传入的实参的任何信息。
具体看下面的例子
调用changeStudentName时,虽然在changeStudentName使用的是副本,但是副本中的引用仍然指向在main中new出来的Student的实例,所以调用changeStudentName,更改student的成员变量,会在main中生效。
调用changeStudent时,将new出来的name3的Student的引用改变形参,不会影响到main中的student。原因是,student = new Student(“name3”)改变的是副本的引用指向,所以不会在main中生效。
public void genericFunc(int a){ //do something } public void referenceFunc(Object a){ //do something } public void test(){ int num = 1; Object obj = new Object(); genericFunc(num); referenceFunc(obj); }
将num传入genericFunc中时,会生成一个num的副本,副本中保存的也是1。所以无论genericFunc怎样对形参a操作,都不会影响到num原本的值。
而obj传入referenceFunc时,也会生成obj的副本。由于obj中保存的是new Object()出来的引用地址,假设为address,所以生成的副本也同样保存的是address。
所以在referenceFunc对a操作时会有两种表现情况:
改变形参指向的实例的成员变量,会真正改变传入的实参中的成员变量值。
在方法中改变形参的引用,不会改变传入的实参的任何信息。
具体看下面的例子
public class Reference { public static void main(String[] args) { Student student = new Student("name1"); System.out.println(student.name); //output: name1 changeStudentName(student); System.out.println(student.name); //output: name2 changeStudent(student); System.out.println(student.name); //output: name2 } private static class Student { public String name; public Student(String name) { this.name = name; } } //情况1 private static void changeStudentName(Student student) { student.name = "name2"; } //情况2 private static void changeStudent(Student student) { student = new Student("name3"); } }
调用changeStudentName时,虽然在changeStudentName使用的是副本,但是副本中的引用仍然指向在main中new出来的Student的实例,所以调用changeStudentName,更改student的成员变量,会在main中生效。
调用changeStudent时,将new出来的name3的Student的引用改变形参,不会影响到main中的student。原因是,student = new Student(“name3”)改变的是副本的引用指向,所以不会在main中生效。
相关文章推荐
- java 基本数据类型和引用数据类型
- Java对象的强、软、弱和虚引用原理+结合ReferenceQueue对象构造Java对象的高速缓存器
- java引用
- 转 java中引用及对象的clone
- Java 中的引用和指针
- Java中引用的详解
- Java中只有按值传递,没有按引用传递!
- Java传值还是传引用
- java 引用传递,还是值传递 之坑
- Java中的软引用,弱引用和虚引用
- java中强、软、弱和虚引用应用
- java 考察引用的一个例子
- [jvm解析系列][三]Java的垃圾回收(一)如何鉴别垃圾,四种引用类型
- JAVA传参数到底是值传递还是引用
- Java当中的四种引用
- Java的四种引用
- java-StringBuffer涉及引用传值操作探讨
- java引用类型的应用
- 4种Java引用浅解
- java中protected 继承 父类引用指向子类对象