为什么我可以使用set来改变私有成员,但不能使用=

时间:2016-01-14 01:47:30

标签: java

这里我有一些疑问,为什么我们可以使用setter来改变私人会员但不能使用" ="改变它。 例如

public class Student {
    private Date date;
    private Integer age;
    public Integer getAge() {
        return age;
    }
    public void setAge(Integer age) {
        this.age = age;
    }
    public Date getDate() {
        return date;
    }
    public void setDate(Date date) {
        this.date = date;
    }
}

public class HelloTest {

    public static void main(String[] args) {
        Student student = new Student();
        student.getDate().setTime(1000);
        //student.getAge()=100;  not allowed
    }
}

我不知道为什么我可以使用' .setTime(1000)'更改日期,但不能使用' = 100'改变年龄。 在我看来,getDate和getAge都获得了对象引用。 感谢。

4 个答案:

答案 0 :(得分:1)

在第一个示例中,您返回一个Object,然后调用该Object上的方法来更改其值(而不是新的Object)

在第二个示例中,您将返回一个immutable对象,然后尝试使用autobox来更改其对象

答案 1 :(得分:0)

任何if ( (!validator.settings.multipleInputSharedName[this.name] && this.name in rulesCache) || !validator.objectLength( $( this ).rules() ) ) { return false; } set...方法都是类中的函数,例如示例中的get...setAgegetDate。为了直接从类外部更改类变量,您需要将其设为setDate。有理由不这样做,并使用setter / getters,但在某些情况下它没问题。

答案 2 :(得分:0)

您无法使用=,因为您的getAge方法正在返回对象的引用。引用,就像文字和其他值一样,可以分配给适当类型的变量。你的代码不起作用,因为它就像试图编写10 = 100;一样没有意义。

答案 3 :(得分:0)

作业的左侧必须是变量,而不是对象。

  

在我看来,getDate和getAge都得到了对象引用。

是的,他们这样做。不是对变量的引用。

为了说清楚,你最好考虑他们返回一个引用该对象的匿名变量。

首先,我们假设字段变量age引用一个对象。 (在OP的例子中它是空的,但可以应用相同的故事。)

enter image description here

当你调用getAge()时,它会返回一个引用该对象的匿名变量。

enter image description here

赋值运算符表示“让左侧变量引用右侧表达式引用的对象”。因此,如果您的student.getAge()=100被允许,则会导致以下情况。

enter image description here

当然这没有意义,因此Java在编译时不允许这样做。

另一方面,您的第一个示例.setTime(1000)不是作业,因此效果很好。