Java 为什么这段代码不打印30,因为int是基本的和可变的?
我认为这将打印30,因为int是基本的和可变的 有人能解释一下为什么吗 我不是偶然在这里打印person2。我需要理解背后的真实概念 现在我正在用包装器检查同样的问题。但结果是一样的Java 为什么这段代码不打印30,因为int是基本的和可变的?,java,Java,我认为这将打印30,因为int是基本的和可变的 有人能解释一下为什么吗 我不是偶然在这里打印person2。我需要理解背后的真实概念 现在我正在用包装器检查同样的问题。但结果是一样的 package com.test; public class Person { private int age; public int getAge() { return age; } public void setAge(int age) {
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());
}
}
甚至对可变日期类也尝试了相同的方法:
package com.test;
public class Person {
private Integer age;
public Integer getAge() {
return age;
}
public void setAge(Integer age) {
this.age = age;
}
}
这张照片是:
人员2修改前的日期4月8日星期四00:00:00 IST 3915人员2
修改后的日期4月8日星期四00:00:00 IST 3915
为什么此代码不打印30
因为您正在输出person2的年龄字段,您从未将其设置为30。您正在将person1的年龄字段设置为30,而不是person2。实例字段是特定于实例的
特别是,如果您希望此行在实例之间创建一些链接:
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());
}
}
没有。它获取person1的年龄字段的值,然后将该值10赋给person2的年龄字段。它们之间没有持续的联系
详细说明:
person2.setAge(person1.getAge());
…因为int是原始的和可变的
int是原始的;如果你把mutable理解为它通常的意思:拥有可以改变的状态,那么你可以说它是不可变的。ints没有这个。5是5是5,不能改变。包含int值的变量可以更新为包含不同的int值,但这改变的是变量,而不是int
相反,对象的状态可以更改,而无需更改引用它们的变量:
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)
在上面的第二条语句中,变量列表没有更改;它仍然包含对同一列表的引用。该语句会更改列表的状态,而不是引用它的变量的状态。您的代码不会精确地打印30,因为int是基本类型,而不是对象/引用数据类型,如Integer。 这将导致每个Person对象实例包含其自己的年龄值,并且这些值不会共享。 如果age被定义为整数而不是int,那么代码将打印30,并且setAge方法参数:
// 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");
谢谢你的回答。我想知道为什么人们突然否决了这一点。所以这与对象引用无关??我很困惑!!你能再解释一下吗。@Valath:对什么感到困惑吗?我的想法和下面的答案一样。所以这是错误的,对吗?因为整数是不可变的,所以我认为这等于10。如果它是一个日期,一个可变对象是否会有相反的行为?@Valath:如果您使用一个可变对象并更改其状态,而不是更改指向它的变量的内容,那么无论您使用哪个引用,您都会看到效果。但如果您执行了上面的操作,为变量指定了一个新值,则情况并非如此。例如,看看我上面的列表示例。如果我做了列表=新建链接列表;在第二行,我将更改变量,而不是它所引用的对象的状态。甚至我现在尝试使用可变日期。正如你所说,它也在发挥作用。所以我认为每个对象在堆中有不同的内存位置。在不调用setter的情况下修改另一个不会修改相关的值,就像我的一样。是否有机会陷入我在java中解释过的情况?我认为您需要在这里重新思考。这行不通。请看关于上述答案的讨论。我相当确信它会起作用。您似乎没有正确理解基本类型和对象类型之间的区别。。。Integer是一个封装int的类,所以它可以像T.J.Crowder的回答中的列表一样处理。可能需要google java按引用传递vs按值传递。
public class Person {
private Integer age;
public Integer getAge() {
return age;
}
public void setAge(Integer age) {
this.age = age;
}
}