Java 为什么这段代码不打印30,因为int是基本的和可变的?

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) {

我认为这将打印30,因为int是基本的和可变的

有人能解释一下为什么吗

我不是偶然在这里打印person2。我需要理解背后的真实概念

现在我正在用包装器检查同样的问题。但结果是一样的

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;
    }
}