package com.test;
public class Person {
private int age;
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
}
package com.test;
public class Test {
public static void main(String[] args) {
Person person1 = new Person();
person1.setAge(10);
Person person2 = new Person();
person2.setAge(person1.getAge());
person1.setAge(30);
System.out.println(person2.getAge());
}
}
我认为这将打印30,因为int是原始的和可变的。
有人可以解释一下为什么吗?
我不小心在这里打印person2。我需要了解背后的真实概念。
现在我正在使用包装器检查相同的内容。但结果是一样的。
package com.test;
public class Person {
private Integer age;
public Integer getAge() {
return age;
}
public void setAge(Integer age) {
this.age = age;
}
}
甚至尝试使用可变的Date类:
package com.test;
import java.util.Date;
public class Person {
private Date date;
public Date getDate() {
return date;
}
public void setDate(Date date) {
this.date = date;
}
}
package com.test;
import java.util.Date;
public class Test {
@SuppressWarnings("deprecation")
public static void main(String[] args) {
Person person1 = new Person();
person1.setDate(new Date(2015, 3, 8));
Person person2 = new Person();
person2.setDate(person1.getDate());
System.out.println("Person2 date before modifying " + person2.getDate());
person1.setDate(new Date(2015, 3, 9));
System.out.println("Person2 date after modifying " + person2.getDate());
}
}
打印:
修改截至4月8日00:00:00 IST 3915之前的人2日期人2 修改Thu Apr 08 00:00:00 IST 3915后的日期
答案 0 :(得分:2)
为什么此代码不打印30
因为您输出的age
字段person2
,您永远不会将其设置为30.您正在设置 age
<的person1
字段/ strong>到30
,但不是person2
。实例字段是特定于实例的。
特别是,如果您希望此行在实例之间创建一些链接:
person2.setAge(person1.getAge());
它没有。它获取age
的{{1}}字段的值,然后将值(person1
,在该点)分配给10
的{{1}}字段。他们之间没有持续的联系。
逐个帐户:
age
...因为int是原始的和可变的吗?
相反,对象具有可以在不更改引用它们的变量的情况下进行更改的状态: 在上面的第二个声明中,变量 person2
是原始的;你可以说它是不可变,如果你把mutable意味着它通常意味着什么:拥有可以改变的状态。 Person person1 = new Person(); // Creates a Person instance
person1.setAge(10); // Sets person1's age to 10
Person person2 = new Person(); // Creates a separate Person instance
person2.setAge(person1.getAge()); // Sets person2's age to 10
person1.setAge(30); // Sets person1's age to 30; no effect on person2
System.out.println(person2.getAge()); // Shows person2's age (10)
没有那个。 int
int
5
为5
,无法更改。包含 5
值的变量可以更新为包含不同的 int
值,但这会更改变量,而不是int
。< / p>
int
// Create a LinkedList and save a reference to it in `list`
List<String> list = new LinkedList<String>();
// Change the state of the list
list.add("Foo");
未更改;它仍然包含对同一列表的引用。该语句改变了列表的状态(而不是引用它的变量的状态)。
答案 1 :(得分:-1)
您的代码不会精确打印30,因为int
是基本类型,而不是Integer
等对象/参考数据类型。
这会导致每个Person对象实例包含其自己的年龄值,并且不会共享这些值。
如果将年龄定义为Integer
而不是int
(以及setAge
方法参数),则代码将打印30:
public class Person {
private Integer age;
public Integer getAge() {
return age;
}
public void setAge(Integer age) {
this.age = age;
}
}