java的值传递和引用传递

java的值传递和引用传递,第1张

java的值传递和引用传递

结论: 基本类型 值传递
非基本类型(包括基本类型的封装类型Integer类似于这种) 引用传递
可以看下面的测试流程,然后斟酌。

测试:
jdk 1.8
idea
插件:JclassLib
1.测试int 型


上述图片可以看到 setInt()方法是接受的int型的数据的,那么我把Integer的类型传进去的时候,他做了一个自动拆箱也就是调用了intValue的方法。(intValue的方法就是,Integer有一个int成员变量,他把这个变量给了这个方法)
所以我们可以看到,这其实传了一个int的数值进去了。
于是我测试了一下 我把int的数值传入Integer的参数的方法里面怎么办?实际上他做了一个自动封箱,也就是传入了一个Integer的对象进去!
自动封箱:Integer有一个内部类,内部类里面有一个静态成员变量Integer[],可以看作是一个数据缓存池,有的话就会返回一个Integer 没有就new一个出来。
总是如果我们的参数需要的是Integer 那么我一定会传给你一个对象进去,也就是一个对象的引用地址而非一个数值。


测试 自定义Bean
这部分其实根本用不着看java的局部变量表,或者方法的code了。
传的一定是这个对象的引用。
我们改变了这个对象内部的一些东西,比如

public class Bean {
    int a;
    
    public Bean() {
    }

    public int getA() {
        return a;
    }

    public void setA(int a) {
        this.a = a;
    }
}

我们在方法里面修改了传入进来的这个类的对象的a,那么无论在哪,这个对象的a都是被改变的。这就是引用传递。

更改一些某些人的错误观点
引用传递 指的是传递的是地址,一个方法new出来的对象传递到了另外一个方法里面的时候,是把这个对象的堆中的内存地址传过去了。
我们无论在哪个方法里面更改这个对象的成员变量都是可以成功修改的,改成员变量不叫值传递。
所谓的值传递是指:
我把我new出来的对象传给另外一个方法的时候,我是在堆里面copy了一个新的对象给你了,那么后续我 *** 作这个新的copy的对象,对原对象没有任何影响,这叫值传递。
显然,java不是这样的。
下面这样的 *** 作 是干了什么?
传进来的这个bean对象实际上是在这个方法里面的局部变量表里面的0位置
也就是说在我的这个方法如果使用这个对象那么一定是要把他从局部变量表里面拿出来放到我的栈顶。
也就是我的方法栈里面有一个引用指向了这个对象的堆内存地址。
所以bean = new Bean();
是将原本我这个栈里面指向传入的这个堆内存地址的指针指向了一个新的堆内存地址!
所以 这绝对不能叫值传递。谁这么说 直接打死。

 private static Bean setOther(Bean bean) {
        bean = new Bean();
       return bean;
    }

如果是基本类型 方法的局部变量表存的就是直接的值
如果是引用类型 方法的局部变量表存的是这个对象的对内存地址。

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/zaji/5709408.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-12-17
下一篇 2022-12-17

发表评论

登录后才能评论

评论列表(0条)

保存