2013-12-19 93 views
0

我想了解一些可能非常简单的东西,所以我很抱歉如果我看起来像一个菜鸟。Java:对象字段赋值

我有这样的java类:

public class Student { 
    public String name = ""; 
    public int age = 0; 
    public String major = "Undeclared"; 
    public boolean fulltime = true; 

    public void display() { 
     System.out.println("Name: " + name + " Major: " + major); 
    } 

    public boolean isFullTime() { 
     return fulltime; 
    } 
} 

这个类从我所说的第一种:

public class TestStudent { 
    public static void main(String[] args) { 
     Student bob = new Student(); 
     Student jian = new Student(); 
     bob.name = "Bob"; 
     bob.age = 19; 
     jian = bob; 
     jian.name = "Jian"; 
     System.out.println("Bob s Name: " + bob.name); 
    } 
} 

这将打印:

鲍勃姓名:健

我很好奇这些任务是如何完成的。

+0

原因'bob'和'jian'指的是同一个对象。 –

+0

谢谢大家的回答,我把所有的答案都提了出来,因为他们是对的。我选择了@ AnthonyGrist的回答,因为它更清晰。再次感谢! –

回答

2

当你做Student bob = new Student()正在创建的学生类的一个实例,并在bob变量在内存中保存到该位置的引用。

当你做jian = bob,您节省了参考同在jian变量的存储位置,所以现在jianbob完全Student类的同一个实例。

3

此行导致jianbob指向相同对象:

jian = bob; 

因此改变jian名称也将改变bob名。

jian.name = "Jian"; 
2
Student bob = new Student(); 
Student jian = new Student(); 
// you've created two objects and two references 
bob.name = "Bob"; // bob's name is now Bob 
bob.age = 19; // bob's age is now 19 
jian = bob; // the jian reference is now referring to the same object as bob 
jian.name = "Jian"; // jian and bob are now referring to an object whose name is changed to Jian 
System.out.println("Bob s Name: " + bob.name); 
2

Jian参照bob对象。

2

您正在将bob的参考文件复制到jian。

现在都指向相同的对象。

2

Assignement这是由于线路

jian = bob; 

这一行,您可以通过鲍勃的对象替换坚的对象的实例。 这意味着Jian实例成为Bob实例,但Bob实例保持存在。

所以,当你改变健的名字,在内部你改变鲍勃

1

的名称之前所著,你的变量鲍勃和剑是链接到内存中的同一个对象。也就是说,当你使用=运算符复制链接时,对于不是基元类型。如果您需要创建包含先前输入数据的字段的anoter对象,则需要实现克隆方法。或者你可以添加构造函数,让你的对象参数化并复制你的领域。 实施例:

jian = bob.clone(); 

About this on wikipedia

通过构造:

public Student(Strudent obj){ 
    this.name = obj.name; 
    this.age = obj.age; 
} 

在主: 学生建=新学生(BOB);

你可以找到解决你的问题的许多变种。使用你喜欢的任何变体。

+0

非常感谢你,这是一个很好的答案,我upvoted它 –