我无法理解对象引用在 Java 中的工作方式?

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


我在第一行创建了一个 Man 对象,引用名为 peter。peter 本身只是一个内存位置,对吧?所以人应该只是将对象存储在它所在的内存位置。


但是当我将另一个 Man 引用分配给 peter 并稍后更改 peter 的名字时,person 不知道这一点并打印名字。这怎么可能,因为它存储了 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;

   }

}


慕森王
浏览 102回答 6
6回答

慕容3067478

这里:Man peter = new Man("brown", 182, 78000, "Peter");创建一个名为“Peter”的 Man对象。Man person = peter;创建另一个变量“指向”上面创建的对象。peter = new Man("brown", 182, 78000, "Leonard");创建另一个名为 Leonard 的 Man,然后peter变量“指向”那个新的第二个对象。注意:person没有“指向”到peter. 它指向内存中的 Man “对象”。将另一个 “内存地址”放入变量中peter不会更改您创建的初始对象。

ABOUTYOU

将引用视为内存地址。我希望这个例子解释: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 peterMan 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 peterSystem.out.println(person.name);// person still contains 100, so this prints out the details of the first object

千万里不及你

使用 peter=new Man() 创建新的内存位置。现在已经创建了 2 个内存位置,比如说 100 和 200。仍然有人指向 peter 内存位置 100。因此它显示第一个构造函数名称 peter。如果您想将 nam 值显示为 Leonardm,请在下面添加行赋值人 = 彼得;System.out.println(person.name);

慕沐林林

当你使用= new Man您创建一个新对象。所以 peter 在看 Man 1,person 在看新的 Man 2

至尊宝的传说

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

繁星coding

Man peter = new Man("brown", 182, 78000, "Peter");Man person = peter;peter = new Man("brown", 182, 78000, "Leonard");第一行将引用分配给名称为“Peter”的对象,第二行将先前的对象引用分配给变量person。在第三行中,您创建了一个新对象并将对它的引用分配给变量peter,这是一个全新的引用,而变量person仍然保留前一个对象的引用。如果你想在两个变量中都有名字“Leonard”,而不是创建一个新对象,你可以在第三行person.name = "Leonard";
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Java