为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

慕森王 2023-02-23 16:07:33
我最初理解引用的方式是,它们只是内存引用,保存着它们所持有的实际对象的内存位置。不过,下面的代码及其输出让我感到困惑。在这里您可以看到一个简单类 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;   }}
查看完整描述

6 回答

?
慕容3067478

TA贡献1773条经验 获得超3个赞

这里:

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不会更改您创建的初始对象。


查看完整回答
反对 回复 2023-02-23
?
ABOUTYOU

TA贡献1812条经验 获得超5个赞

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


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


查看完整回答
反对 回复 2023-02-23
?
千万里不及你

TA贡献1784条经验 获得超9个赞

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

如果您想将 nam 值显示为 Leonardm,请在下面添加行赋值

人 = 彼得;

System.out.println(person.name);


查看完整回答
反对 回复 2023-02-23
?
慕沐林林

TA贡献2016条经验 获得超9个赞

当你使用

= new Man

您创建一个新对象。所以 peter 在看 Man 1,person 在看新的 Man 2



查看完整回答
反对 回复 2023-02-23
?
至尊宝的传说

TA贡献1789条经验 获得超10个赞

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



查看完整回答
反对 回复 2023-02-23
?
繁星coding

TA贡献1797条经验 获得超4个赞

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";


查看完整回答
反对 回复 2023-02-23
  • 6 回答
  • 0 关注
  • 127 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信