Java原语中的类类型参数传递



我知道,如果你传递一个类类型作为一个方法的参数,指针将被传递,如果你在方法中编辑参数,你也编辑你传递的原始对象实例(例如,如果一个名为public void changeColor(Color color)的方法执行以下代码:

public void changeColor(Color color)
{
    color = new Color(20, 100, 50);
}

,你像这样调用这个值:

Color color = new Color(10, 20, 30);
System.out.println(color.toString());
changeColor(color);
System.out.println(color.toString());

控制台的两行应该不同(java.awt.Color[r=10,g=20,b=30]java.awt.Color[r=20,g=100,b=50]),因此值被更改并传递指针。另一方面,如果使用int值,这是一个基本类型,则会得到不同的结果:

public void changeNumber(int i)
{
    i = 10;
}

,你像这样调用这个值:

int n = 5;
System.out.println(n);
changeNumber(n);
System.out.println(n);

控制台不打印510,但两行都显示5。话虽如此,如果我有这个:

public class A
{
    public int i;
    public Color c;
    public A(int n, Color color)
    {
        i = n;
        c = color;
    }
}

在可运行类中…

public static void main(String[] args)
{
    A a = new A(10, new Color(10, 40, 23));
    changeA(a);
}
public static changeA(A varA)
{
    varA.i = 54;
    varA.c = new Color(40, 30, 264)
}

A类中的i是否也会像它是A指针的一部分一样,或者在运行changeA(A)后,主方法中的a.i的值是否不会改变?如果不是,我该怎么做才能让它改变?

您希望在Java中通过引用传递。这不可能。

A类中的i是否也像它是A指针的一部分一样,或者在运行changeA(A)

后,主方法中的a.i的值是否不会改变?

作为参数传递给AA实例中i的值会发生变化。

但我不会说它的行为"好像它是A的指针的一部分"。对A的引用是一个单一的不可变值。您正在更改它所引用的对象的状态。

顺便说一下,这不是"按引用传递"的意思,它不类似于c#和c++等语言中实现的按引用传递,也不类似于C中传递变量/成员/其他内容的地址。

这已经被解释过很多次了,但这是我想解释的:

(请注意,我对"内部细节"进行了修饰:我发现它们不需要讨论语义,但是它们应该在一天结束时被理解。)事实上,我甚至不打算讨论所使用的求值策略,只是说Java使用call-by-value并且传递的对象具有call-by-object-sharing语义,这是通过将对象的引用作为值传递在内部实现的。

  • 当传递一个原始值时,生成一个拷贝。(尽管这与下一点有些无关,因为原始值不能改变。)

  • 当一个对象被传递(或分配)时,同样的对象被传递(或分配)。不复制对象:除非重新赋值相关的形参变量,否则将与传入的对象(或null)计算相同的对象。因为对象本身就是,那么在一个位置改变对象——不管它当前的"变量名"是什么——都会使在所有位置改变相同的对象。

如果你想要一个新的,独立的对象,然后创建一个:)

快乐编码。

最新更新