我在理解对象引用如何在Java中工作时遇到麻烦?

时间:2019-06-27 06:58:24

标签: java oop reference

我最初理解引用的方式是,它们只是内存引用,用于保存它们所持有的实际对象的内存位置。不过,下面的代码及其输出使我感到困惑。在这里,您可以看到简单类Man的实现。

我在第一行中创建一个Man对象,引用称为peter。彼得本身只是一个存储位置,对吗?因此,人应该将对象存储在其所在的存储位置中。

但是,当我将另一个Man参考分配给peter并随后更改peter的名称时,人员不知道此信息并打印名字。因为它存储了peter的内存引用,怎么可能呢?它不应该能够跟踪对其所做的更改吗?

public class Testing {

  public static void main(String[] args) {
    Man peter = new Man("brown", 182, 78000, "Peter");
    Man person = peter;
    peter = new Man("brown", 182, 78000, "Leonard");
    System.out.println(person.name);
  }
}

class Man {

   String hairColor;
   int height;
   double salary;
   String name;

   public Man()
   {
     hairColor = "brown";
     height = 180;
     salary = 50500.5;
     name = "John";
   }
   public Man(String hair, int high, double pay, String nam)
   {
        this.height = high;
        this.hairColor = hair;
        this.salary = pay;
        this.name = nam;
   }
}

7 个答案:

答案 0 :(得分:4)

这里:

Man peter = new Man("brown", 182, 78000, "Peter");

创建一个名为“ Peter”的Man 对象

Man person = peter;

创建另一个变量“指向”上面创建的对象。

peter = new Man("brown", 182, 78000, "Leonard");

创建另一个名为Leonard的人,然后将peter变量“指向”该新的第二个对象。

注意:person没有“指向” peter。它指向内存中的Man “对象”

另一个 “内存地址” 放入peter变量中不会更改您创建的初始对象。

答案 1 :(得分:1)

将引用视为内存地址。我希望这个例子能解释:

Man peter = new Man("brown", 182, 78000, "Peter");
// Create a new Man object which is placed in (for example) memory location 100
// Assign 100 to peter


Man person = peter;
// Assign 100 to person (copying it from peter)

peter = new Man("brown", 182, 78000, "Leonard");
// Create a new Man object which is placed in memory location 120
// 120 is assigned to peter

System.out.println(person.name);
// person still contains 100, so this prints out the details of the first object

答案 2 :(得分:0)

它是这样的:

Man peter = new Man("brown", 182, 78000, "Peter");

意味着您在内存中拥有这些值的新位置。

Man person = peter;

表示人对彼得的记忆具有相同的指针。

peter = new Man("brown", 182, 78000, "Leonard");

您将指针区域更改为具有新值的新位置。

答案 3 :(得分:0)

Man peter = new Man("brown", 182, 78000, "Peter");
Man person = peter;
peter = new Man("brown", 182, 78000, "Leonard");

第一行为名称为“ Peter”的对象分配引用,第二行为变量 person 分配之前的对象引用。

第三行中,创建一个新对象,并将对该对象的引用分配给变量 peter ,这是全新的引用,而变量 person < / em>仍保留先前对象的引用。

如果您想在两个变量中都使用“ Leonard”作为名称,而不是创建一个新对象,则只需在第三行中输入

person.name = "Leonard";

答案 4 :(得分:0)

使用时

= new Man

您创建一个新对象。彼得正在看第一个男人2,一个人正在看一个新男人2

答案 5 :(得分:0)

您将两个对象都指向相同的内存/位置,然后将另一个引用分配给第一个对象,这样它就不会影响旧的内存数据。

答案 6 :(得分:0)

使用peter = new Man()创建新的存储位置。现在已经创建了2个存储位置,比如说100和200。 仍然有人指向彼得存储位置100。因此它显示第一个构造函数名称彼得。

如果要将nam值显示为Leonardm,请在行分配下方添加

person = Peter;

System.out.println(person.name);