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

标签 java oop reference

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

最佳答案

这里:

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

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

Man person = peter;

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

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

创建另一个 Man named Leonard,然后 peter 变量“指向”那个新的第二个对象。

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

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

关于java - 我无法理解对象引用在 Java 中的工作方式?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56785593/

相关文章:

php - 将 PHP 类设置存储在变量中或从方法中返回它们

JavaScript 生成器 : implement a ticket queue system

c# - Array.sort 是否会更改 C# 中的引用?

java - 如何在java中使用StrSubstitutor进行嵌套Map

java - 我有一个不想更新的 JLabel

java - 我应该将我的业务不变检查放入 Controller 中吗

c# - 对象实例丢失时如何处理它的引用

java - ElementList 属性(Java 简单框架)

c++ - main函数中静态对象的理解

Java 窗口生成器 : runtime error