值传递,引用传递。

先看结论:

值传递:将实参的,复制了一份给形参。

引用传递:将实参的地址值,复制了一份给形参。

所以不管是值传递还是引用传递,形参拿到的都只是实参的副本,而不是实参本身。

基本数据类型都是值传递,类,数组,接口都是引用传递,可以这么理解。

看例子:

change方法复制了p的引用,然后在方法内把本方法内p的引用的引用改为了person的引用,但是main方法内的引用不会变,因为change方法只是拷贝了引用而已。change方法进栈到弹栈整个过程改的只是这个栈中的内容,所以main方法的输出还是18.


这个和上面的类似,change也是拷贝了引用,但是在方法内把引用指向堆内存中的对象的age改为了20,main方法内p的引用和change方法内的引用是同样的,所以change中改了,main中也是一样的。所以输出20.


但是:

String比较特殊,先来看String的api介绍。


个人理解:String和其他类也是一样的,只是他是final修饰,且内部存数据的value是private final。所以像下面这种change内修改和上面例子中p = new Person();其实是一样的。那如果内部有修改String内部有修改value值的,像上面p.name = "李四";是不是就可以修改成功呢?


但是显然String是没有提供的,那我们用反射试试,下图,修改成功。

所以其实String和其他类并没有什么不同,通过修改引用对象内的域也是可以的。


个人理解,有错误请指正。

猜你喜欢

转载自blog.csdn.net/ch_show/article/details/79458878