java传递值原始vs对象

时间:2013-08-02 09:51:56

标签: java pass-by-value

我已经阅读了论坛并浏览了一些链接,发现Java全部都是通过值传递的,我认为我确实理解了引用的工作方式,而不是原语是如何工作的。据说,对于基元和对象,传递值都以相同的方式工作。

我创建了一个示例程序

public class BirthDate {
int lear;
int year; // Instance variable
public static void main(String [] args) {
    BirthDate bd = new BirthDate();
    bd.lear=200;
    bd.year=300;
    int a=56;
    bd.showYear(a,bd);
    System.out.println(a);
    System.out.println(bd.lear);
}
public void showYear(int a, BirthDate bd) {
        a=59;
        System.out.println(bd.lear);
        bd.lear=400;
        System.out.println(bd.lear);
        System.out.println(a);
}

}

上述程序的输出为200 400 59 56 400

现在,如果在原语和引用的情况下传递了比特,那么为什么showYear方法中参考值的变化反映了原始bd对象的变化(值变为400)而不是原始数据类型iea

有人可以建议吗?

5 个答案:

答案 0 :(得分:4)

您按值传递BirthDate引用,因此您的方法引用与主方法中的相同的 BirthDate。< / p>

但是,然后您将该对象(lear)的成员从200更改为400.

因为您已经传递了对原始对象的引用,所以它没有被复制,并且您始终在处理同一个对象。

答案 1 :(得分:2)

当您传递BirthDate bd时,您正在传递对此对象的引用。

如果你的演出年份你会这样做:

public void showYear(int a, BirthDate bd) {
        bd = new BirthdayDate();
}

bd = new BirthdayDate();相当于a= 59;的性质。这一点很重要。

你不会改变它之外的bd-你只是重新分配不同的参考。

然而你的:

bd.lear=400;

访问此引用指向的对象并更改其值。这样您就可以编辑对象了。这也可以看作只是一个原语的赋值 - 但它发生在bd指向的地方。

答案 2 :(得分:2)

它们都是通过值传递的。作为参考,对象引用按值传递。当你说 -

bd.showYear(a,bd);

您正在将bd的地址传递给showYear方法。让我们分解吧 -

BirthDate bd = new BirthDate(); // Let's say a new object bd is created at address 10.

我将参数bd更改为下面的bd2,所以我们不会将它误认为是上面的Brithday bd

public void showYear(int a, BirthDate bd2) { // Parameter bd2 is pointing to address 10       

    bd2.lear=400; // bd2 followed the address 10 and changed bd's leap property. This doesn't change the fact that bd still is at address 10.
}

答案 3 :(得分:0)

您可以在方法中更改引用引用的Object字段,但不能将其重新分配给另一个Object。基元虽然是“不可变的”,但你不能在方法中改变它们的值。这就是java参数在方法中的行为方式。

答案 4 :(得分:0)

在这两种情况下,您只传递价值。 U将Object ID的值传递给新的引用变量bd,在这种情况下是本地的。 所以,当你打电话

     bd.lear=400; 

它改变了Object的lear变量的值。 现在,当函数完成时,堆栈被破坏。参考变量bd也是如此。 但由于主函数bd包含对象的id,因此对象不会被破坏。

来到原始类型,你在这个

中改变了showYear函数的局部变量a的值
   a=59;

它打印它并用对象的堆栈销毁。但主要功能局部变量仍然存在,值为56。

成为Object的一部分,然后尝试

  bd.a=59; 

你会看到价值在变化。阅读局部变量,实例变量和类变量..!