需要帮助了解此代码的输出

时间:2016-08-22 08:10:15

标签: java

我是初学者,所以它真的没有比这更简单。
我在一个文件夹中有两个单独的.java文件 负责狗的“属性”(名称,年龄,品种等)的类。

   ...
   public String name;
   public byte age;
   public String breed;

      public String makeNoise()
      {
         return "Woof...";
      }

      public String toString()
      {
         return "Name: " +name +"\n" +"Age: " +age +"\n" +"Breed: " +breed;
      }
      ...

和一个测试狗类的测试员。

  ...  
  Dog d1 = new Dog();
  d1.name = "Frodo";
  d1.age = 4;
  d1.breed = "Alsatian";

  Dog d2 = new Dog();
  d2.name = "Labby";
  d2.age = 3;
  d2.breed = "Labrador";

  Dog d3 = d2;
  d3.age = 6;
  d3.name = "Mike";


 System.out.println(d1.name);
 System.out.println(d2.age);
 System.out.println(d3.age);
 System.out.println(d2.name);

 System.out.println(d1.age == d2.age);
 System.out.println(d1 == d2);
 System.out.println(d1 == d3);
 System.out.println(d2 == d3);
 ...

的输出
System.out.println(d2.age);

由于某种原因返回6,我不明白为什么。任何帮助将非常感激。

5 个答案:

答案 0 :(得分:5)

进行作业时

Dog d3 = d2;

您正在将Dog对象的引用从d2变量复制到d3变量。您没有复制该对象。

因此,在分配后,d3d2都会引用相同的Dog对象。因此,d3.age = 6;会导致d2.age成为6

答案 1 :(得分:2)

在Java中,每个变量(基元除外)实际上都是指针。所以你在这里真正做的是下一步:

  1. Dog d1 = new Dog(); 这使得dog和d1的新实例指向它。

  2. Dog d2 = new Dog(); 这使得dog和d2的另一个实例指向它。

  3. Dog d3 = d2; 在这里,您说d3是指向狗实例的指针,并且在同一行中您说该实例与d2指向的实例相同。

  4. d3.age = 6; d3.name = "Mike"; 这两行正在对Dog(和d3)指向的d2实例进行更改。

  5. 如果要创建实例的副本(使用相同的属性值创建新实例),则应编写复制构造函数或实现Cloneable接口并使用clone()方法。

答案 2 :(得分:1)

Dog d3 = d2;
d3.age = 6;

您已将d2的年龄设置为6,因为d2d3都指向同一个对象。这就是赋值运算符=在Java中的工作方式。

答案 3 :(得分:1)

Dog d3 = d2

d2d3正在引用同一个对象。当您更改d3.age时,它也会更改d2.age

agename不仅会更改breed,还会更改d2d3。如果您选中d2.name,您将获得“Mike”,而非“Labby”。

答案 4 :(得分:1)

Dog d3 = d2;

这意味着d2和d3是同一个实例的相同对象/点。

d3.age = 6;

这意味着d2.age是6