求问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

#互联网没坑了,还能去哪里?#
全部评论
Java是值传递,只不过传的的引用类型
点赞 回复 分享
发布于 02-24 21:27 北京
确实这是个一直不理解的点
点赞 回复 分享
发布于 02-24 23:46 广东

相关推荐

评论
1
收藏
分享
牛客网
牛客企业服务