哪位大神知道下面结果是为什么这样的吗?和想象中不一样?四个结果哦 都和我讲一下呗,大神~~~
要区分
改变对象本身的状态,比如
obj.字段 = 123;
obj.setXXX(123);
xxx.add(123);
这些是修改对象状态本身
和改变对象引用对对象的指向
obj = new XXX();
obj = obj2;
这些事让obj指向一个新的对象。
在函数里,通过参数修改一个对象状态,那么会反应到实参上
将参数指向一个新的对象,不会。
值传递不改变值,因为在内存中就没有开辟一个新的空间,所以还是原来的值。那么引用传递反之
在 Java 应用程序中永远不会传递对象,而只传递对象引用。因此是按引用传递对象。但重要的是要区分参数是如何传递的,这才是该节选的意图。Java 应用程序按引用传递对象这一事实并不意味着 Java 应用程序按引用传递参数。参数可以是对象引用,而 Java 应用程序是按值传递对象引用的。
Java 应用程序中的变量可以为以下两种类型之一:引用类型或基本类型。当作为参数传递给一个方法时,处理这两种类型的方式是相同的。两种类型都是按值传递的;没有一种按引用传递。
按 值传递意味着当将一个参数传递给一个函数时,函数接收的是原始值的一个副本。因此,如果函数修改了该参数,仅改变副本,而原始值保持不变。按引用传递意味 着当将一个参数传递给一个函数时,函数接收的是原始值的内存地址,而不是值的副本。因此,如果函数修改了该参数,调用代码中的原始值也随之改变。
当传递给函数的参数不是引用时,传递的都是该值的一个副本(按值传递)。区别在于引用。在 C++ 中当传递给函数的参数是引用时,您传递的就是这个引用,或者内存地址(按引用传递)。在 Java 应用程序中,当对象引用是传递给方法的一个参数时,您传递的是该引用的一个副本(按值传递),而不是引用本身。
Java 应用程序按值传递所有参数,这样就制作所有参数的副本,而不管它们的类型。
值传递:改变的恶事change方法中新声明的变量s1和s2的值。而不改变原始的s1和s2的值。change方法中s1和s2作用范围只在方法内有效。
引用传递:是直接将sb1和sb2的内存地址传递给change方法,这时change方法内的sb1和sb2也指向这个内存地址,改变的也是这个内存地址中的值,所以会改变。
补充一下,这个其实还和java中String、StringBuffer 有关。String不可变字符串,所有的修改都是创建新对象。StringBuffer是可变字符串,
修改都是在原对象基础上的。
java中String就是个奇葩。别看声明、修改像个基本数据类型,这其实是个引用类型。实际上String s1="hello",应该是String s1 = new String("hello")
这种表达方式。而s2=s1+s2这种是不能用于其他引用类型的,除了String。java把一个引用类型,弄得像个基本类型,还把算术运算符+用于字符串拼接,也是6得不行·······