关于“ java是通过值传递还是通过引用传递?”,存在大量争论。好吧,让我们最后一次结束,Java是通过值传递而不是通过引用传递。如果它已通过引用传递,我们应该能够像交换对象一样C,但我们不能在java中这样做。我们已经知道了,对吗?
将实例传递给方法时,其内存地址会逐位复制到新的引用变量,因此都指向同一实例。但是如果更改内部方法的引用,原始引用将不会更改。如果它是通过引用传递,那么它也会改变。
为了证明这一点,让我们看看内存分配在运行时是如何发生的。它应该解决一丝疑虑,如果有的话。我正在使用以下程序来演示这个概念。
|
让我们一步一步看看运行时会发生什么:
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指向它的相同对象。
我希望这个解释足以让你的理解更好,如果还没有的话。