我是初学者,所以它真的没有比这更简单。
我在一个文件夹中有两个单独的.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,我不明白为什么。任何帮助将非常感激。
答案 0 :(得分:5)
进行作业时
Dog d3 = d2;
您正在将Dog
对象的引用从d2
变量复制到d3
变量。您没有复制该对象。
因此,在分配后,d3
和d2
都会引用相同的Dog
对象。因此,d3.age = 6;
会导致d2.age
成为6
。
答案 1 :(得分:2)
在Java中,每个变量(基元除外)实际上都是指针。所以你在这里真正做的是下一步:
Dog d1 = new Dog();
这使得dog和d1的新实例指向它。
Dog d2 = new Dog();
这使得dog和d2的另一个实例指向它。
Dog d3 = d2;
在这里,您说d3
是指向狗实例的指针,并且在同一行中您说该实例与d2
指向的实例相同。
d3.age = 6; d3.name = "Mike";
这两行正在对Dog
(和d3
)指向的d2
实例进行更改。
如果要创建实例的副本(使用相同的属性值创建新实例),则应编写复制构造函数或实现Cloneable
接口并使用clone()
方法。
答案 2 :(得分:1)
Dog d3 = d2;
d3.age = 6;
您已将d2
的年龄设置为6,因为d2
和d3
都指向同一个对象。这就是赋值运算符=
在Java中的工作方式。
答案 3 :(得分:1)
自
Dog d3 = d2
d2
和d3
正在引用同一个对象。当您更改d3.age
时,它也会更改d2.age
。
age
和name
不仅会更改breed
,还会更改d2
和d3
。如果您选中d2.name
,您将获得“Mike”,而非“Labby”。
答案 4 :(得分:1)
Dog d3 = d2;
这意味着d2和d3是同一个实例的相同对象/点。
d3.age = 6;
这意味着d2.age是6