2

我已经阅读了论坛并浏览了一些链接,发现 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

有人可以建议吗?

4

5 回答 5

4

您传递了按值的引用BirthDate,因此您的方法与您的主要方法中的引用相同 BirthDate

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

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

于 2013-08-02T09:56:13.173 回答
2

当您传递时,BirthDate bd您传递的是对该对象的引用。

如果在你的表演年你会做:

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

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

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

但是您的:

bd.lear=400;

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

于 2013-08-02T09:57:27.590 回答
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.
}
于 2013-08-02T10:07:02.707 回答
0

在这两种情况下,您都只是在传递价值。U 将对象 ID 的值传递给新的参考变量 bd,在这种情况下它是本地的。所以当你打电话时

     bd.lear=400; 

它改变了对象的李尔变量的值。现在当函数完成时,堆栈被销毁。参考变量 bd 也是如此。但是由于 main 函数 bd 包含 object 的 id,所以 object 不会被销毁。

来到原始类型,您在此更改了 showYear 函数的局部变量 a 的值

   a=59;

它打印它并与对象堆栈一起销毁。但是主函数局部变量仍然存在,值为 56。

制作对象的一部分,然后尝试

  bd.a=59; 

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

于 2013-08-02T10:07:37.153 回答
0

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

于 2013-08-02T10:02:35.133 回答