java是通过值传递还是通过引用传递?

关于“ java是通过值传递还是通过引用传递?”,存在大量争论。好吧,让我们最后一次结束,Java是通过值传递而不是通过引用传递。如果它已通过引用传递,我们应该能够像交换对象一样C,但我们不能在java中这样做。我们已经知道了,对吗?

将实例传递给方法时,其内存地址会逐位复制到新的引用变量,因此都指向同一实例。但是如果更改内部方法的引用,原始引用将不会更改。如果它是通过引用传递,那么它也会改变。

为了证明这一点,让我们看看内存分配在运行时是如何发生的。它应该解决一丝疑虑,如果有的话。我正在使用以下程序来演示这个概念。

public class Foo

{

    private String attribute;

 

    public Foo (String a){

        this.attribute = a;

    }

    public String getAttribute() {

        return attribute;

    }

    public void setAttribute(String attribute) {

        this.attribute = attribute;

    }

}

 

public class Main

{

     public static void main(String[] args){

          Foo f = new Foo("f");

          changeReference(f); // It won't change the reference!

          modifyReference(f); // It will change the object that the reference variable "f" refers to!

     }

     public static void changeReference(Foo a) {

          Foo b = new Foo("b");

          a = b;

     }

     public static void modifyReference(Foo c) {

          c.setAttribute("c");

     }

}

让我们一步一步看看运行时会发生什么:

1)Foo f = new Foo(“f”);

该语句将创建一个类Foo的实例,其中'attribute'被初始化为'f'。对此创建实例的引用分配给变量f;

创造天赋

2)public static void changeReference(Foo a)

当执行此操作时,将声明具有名称a的类型为Foo的引用,并且它最初被指定为null。

空引用

3)changeReference(f);

当您调用方法changeReference时,引用a将被分配给作为参数传递的对象。

参考作业

4)Foo b = new Foo(“b”); 在第一种方法中

这将与第一步完全相同,并将创建一个新的Foo实例,并将其分配给b;

新实例

5)a = b;

这是重点。这里,我们有三个引用变量,当语句执行时,a和b将指向在方法内创建的同一个实例。注意:f不变,它不断指向实例,它最初是指向的。没变 !!

分配

6)modifyReference(Foo c);

现在,当此语句执行引用时,将创建c并将其分配给具有属性“f”的对象。

新参考

7)c.setAttribute(“c”);

这将更改引用c指向它的对象的属性,以及引用f指向它的相同对象。

修改参考

我希望这个解释足以让你的理解更好,如果还没有的话。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值