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

时间:2011-12-15 04:10:15

标签: java pointers parameters primitive

我知道如果你传递一个Class类型作为方法的参数,那么指针将被传递,如果你在方法中编辑参数,你也可以编辑你传递的原始对象实例(例如,如果一个名为{{的方法) 1}}执行以下代码:

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]),因此值会更改并传递指针。另一方面,如果使用int值(原始值),则会得到不同的结果:

java.awt.Color[r=20,g=100,b=50]

并且您调用了这样的值:

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

控制台无法打印int n = 5; System.out.println(n); changeNumber(n); System.out.println(n); 5,但两行都显示10。话虽如此,如果我有这个:

5

在可运行的班级......

public class A
{
    public int i;
    public Color c;

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

我是否会在A类内部表现得好像它是A指针的一部分,或者如果在运行changeA(a)之后main方法中的a.i没有改变,那么该值是否为值;如果没有,我该怎么做才会改变呢?

3 个答案:

答案 0 :(得分:1)

您希望通过Java中的引用传递。这是不可能的。有关详细信息,请参阅this问题的答案。

答案 1 :(得分:0)

  

我是否会在A类内部表现得好像它是A的指针的一部分,或者如果在运行changeA(a)后主方法中的a.i没有改变,那么该值是否为

作为i参数传递的A实例中A的值将发生变化。

但我不会说它正在扮演“,好像它是A”指针的一部分。对A的引用是单个不可变值。您正在更改它引用的对象的状态。

顺便说一句,这不是“通过引用传递”的意思,它与通过C#和C ++等语言实现的引用或者传递变量/成员的地址的C hack类似。 /无论如何。

答案 2 :(得分:0)

之前已经解释了这么多次,以上两次,但这就是我喜欢解释它的方式:

(请注意我点亮了“内部细节”:我发现他们不需要讨论语义,但他们应该在一天结束时被理解。事实上,我甚至不讨论evaluation strategies used,除了说Java使用call-by-value并且传递的对象具有call-by-object-sharing语义,这是通过传递引用在内部实现的将对象作为值。)

  • 传递原始值时制作副本。 (虽然这与下一点有点无关,因为原始值不能改变。)

  • 当传递(或分配)对象时,传递(或分配)相同的对象。 没有对象的副本发生:除非重新分配相关参数变量,否则将评估为与传入的内容相同的对象(或null,也许)。由于一个对象本身就是,然后在一个位置改变对象 - 无论它当前具有什么“变量名” - 在任何地方都改变相同的对象。

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

快乐的编码。