我最初理解引用的方式是,它们只是内存引用,用于保存它们所持有的实际对象的内存位置。不过,下面的代码及其输出使我感到困惑。在这里,您可以看到简单类Man的实现。
我在第一行中创建一个Man对象,引用称为peter。彼得本身只是一个存储位置,对吗?因此,人应该将对象存储在其所在的存储位置中。
但是,当我将另一个Man参考分配给peter并随后更改peter的名称时,人员不知道此信息并打印名字。因为它存储了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;
}
}
答案 0 :(得分:4)
这里:
Man peter = new Man("brown", 182, 78000, "Peter");
创建一个名为“ Peter”的Man 对象。
Man person = peter;
创建另一个变量“指向”上面创建的对象。
peter = new Man("brown", 182, 78000, "Leonard");
创建另一个名为Leonard的人,然后将peter
变量“指向”该新的第二个对象。
注意:person
没有“指向” 到peter
。它指向内存中的Man “对象” 。
将另一个 “内存地址” 放入peter
变量中不会更改您创建的初始对象。
答案 1 :(得分:1)
将引用视为内存地址。我希望这个例子能解释:
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
答案 2 :(得分:0)
它是这样的:
Man peter = new Man("brown", 182, 78000, "Peter");
意味着您在内存中拥有这些值的新位置。
Man person = peter;
表示人对彼得的记忆具有相同的指针。
peter = new Man("brown", 182, 78000, "Leonard");
您将指针区域更改为具有新值的新位置。
答案 3 :(得分:0)
Man peter = new Man("brown", 182, 78000, "Peter");
Man person = peter;
peter = new Man("brown", 182, 78000, "Leonard");
第一行为名称为“ Peter”的对象分配引用,第二行为变量 person 分配之前的对象引用。
在第三行中,创建一个新对象,并将对该对象的引用分配给变量 peter ,这是全新的引用,而变量 person < / em>仍保留先前对象的引用。
如果您想在两个变量中都使用“ Leonard”作为名称,而不是创建一个新对象,则只需在第三行中输入
person.name = "Leonard";
答案 4 :(得分:0)
使用时
= new Man
您创建一个新对象。彼得正在看第一个男人2,一个人正在看一个新男人2
答案 5 :(得分:0)
您将两个对象都指向相同的内存/位置,然后将另一个引用分配给第一个对象,这样它就不会影响旧的内存数据。
答案 6 :(得分:0)
使用peter = new Man()创建新的存储位置。现在已经创建了2个存储位置,比如说100和200。 仍然有人指向彼得存储位置100。因此它显示第一个构造函数名称彼得。
如果要将nam值显示为Leonardm,请在行分配下方添加
person = Peter;
System.out.println(person.name);