求问Java的值传递和引用传递??
今天试验了一个例子想要证明Java只有值传递但是没有引用传递,代码如下
class cat{ public int age; public String name; public cat(){ this.age = 0; this.name = "haha"; } public void setAge(int age){ this.age = age; } } public class test { public static void main(String[] args) { cat cat1 = new cat(); s1(cat1); System.out.println(cat1.age); } public static void s1(cat c){ c.age=2; } }
然后输出的年龄值为2,这貌似就是引用传递,然而搜索了知乎得到了下图,据楼主解释这种属于值传递,但是他传的是引用地址值的拷贝??只不过原对象和副本指向的那个值内存块相同(这不就是引用传递的定义吗??)。那这种值传递和引用传递有啥区别??
然后又看了一个知乎帖子,想要用这段代码来证明不是引用传递,代码如下:
private static void change(Student stu1) { stu1 = new Student(); stu1.setAge(99); }
传入的stu1原本年龄是12,走了这个函数之后年龄没改,楼主的意思是如果是引用传递的话值应该被修改,当时有点蒙比,于是打开C++,写了这段代码,我可以保证这段C++肯定是引用传递:
void seti(int *p) { p = (int*)malloc(sizeof(int)); *p = 2; } int main(void) { int h = 1; int *p = &h; seti(p); printf("%d", *p); }
结果p的值是1,后来才发现引用传递在函数里面不会改变原本的指向
附上值传递和引用传递的定义(应该是对的吧)
所以这两个帖子都不能很好的说明Java没有引用传递,我甚至觉得这两个帖子是在证明Java有引用传递(才疏学浅不喜勿喷本人玻璃心呜呜)
所以想问问大家Java的值传递应该怎么理解??就是像第一个帖子说的一样要把引用传递理解成地址值的拷贝??
上述两个帖子按照先后顺序如下:
[1].https://zhuanlan.zhihu.com/p/388486387
[2].https://zhuanlan.zhihu.com/p/104371706
#互联网没坑了,还能去哪里?#