最近看c#时看到c#中对象都是引用传递,想到了java。
先说下结论,java是值传递的,没有引用传递这一说。
public static void main(String[] args) {
List<String> list = new ArrayList<>();
changeList(list);
System.out.println(list.size());
}
public static void changeList(List<String> list) {
List<String> a = new ArrayList<>();
a.add("123");
list = a;
}
这个例子,假如有人认为是引用传递的话,那么main方法中的list的值是会改变的,也就是说list的引用(栈中的地址值)发生了变化,对用到heep发生了变化,可是 事实是没有发生变化,为什么呢? 因为ava是值传递的,传递的只是list这个变量也就是引用的值,对应到内存就是栈的那串地址。然后在changeList中传入的是原来list的引用值,所以在changeList‘中改变形参的值,值不会影响原来的对象的。值传递我感觉也就是这么个意思。基本变量就不说了,网上很多例子。
public static void changeList2(List<String> list) {
list.add("123");
}
将方法修改下,此时main中的list发生了变化,其实很好理解,因为虽然传的是引用的值,但是传入changeList2的形参和main中的list值是一样的,也就是对应堆中的对象是同一个。无论谁改变它的值,指向它的引用去查询的时候都是同一份对象。
写的很粗糙,我比较懒。。