先看代码
class MyObj {
public int b = 99;
}
class Test{
public static void main(String[] args) {
Test t = new Test();
int a = 99;
MyObj obj1 = new MyObj();
t.test2(obj1);// 这里传递的参数obj就是引用传递
System.out.println(obj1.b);
}
public void test2(MyObj obj) {
obj = new MyObj(); //纠结在这一行
obj.b = 100;
System.out.println(obj.b);
}
}
1.我在搜索java值传递和引用传递时,发现了巨大的矛盾,一部分人说全部是值传递,另一部分人说分值传递和引用传递
,现在问题纠结在 运行搭配 test2方法的参数obj 是否是拷贝了对象obj1 ,又分配了一块内存地址都指向堆内存obj1对象。
2.我希望获得一个工具能够让我查看执行到test2的方法时的内存 ,我尝试jvisualvm并不能看到
首先,Java对象的方法调用时值传递不存在拷贝这种说法,它是传递了引用地址。所以test2方法的参数obj 只是使用了对象obj1句柄,指向内存中同一片内存区域。
Java中数据类型分为两大类,基本类型和对象类型。相应的,变量也有两种类型:基本类型和引用类型。java传递参数时,基本类型的是值传递,引用类型是引用传递
A1是分配了新的一块内存,因为A1本身是一个引用,在new一个对象时,虚拟机在内存中创建了一个空间,由A1来指向这个空间的内存地址,而你在这行上新new一个,代表重新开辟一个内存空间,此时A1的指向的内存地址,变成了新的开辟的内存的空间地址
这个链接作者说得很清楚了:https://blog.csdn.net/FastThinking/article/details/14120113
java对象传递时只是个引用地址,也就是两个变量指向同一内存。