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

时间:2015-03-08 13:19:50

标签: java

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后的日期

2 个答案:

答案 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 55,无法更改。包含 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;
    }
}