这里我有一些疑问,为什么我们可以使用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都获得了对象引用。 感谢。
答案 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...
,setAge
和getDate
。为了直接从类外部更改类变量,您需要将其设为setDate
。有理由不这样做,并使用setter / getters,但在某些情况下它没问题。
答案 2 :(得分:0)
您无法使用=
,因为您的getAge
方法正在返回对象的引用。引用,就像文字和其他值一样,可以分配给适当类型的变量。你的代码不起作用,因为它就像试图编写10 = 100;
一样没有意义。
答案 3 :(得分:0)
作业的左侧必须是变量,而不是对象。
在我看来,getDate和getAge都得到了对象引用。
是的,他们这样做。不是对变量的引用。
为了说清楚,你最好考虑他们返回一个引用该对象的匿名变量。
首先,我们假设字段变量age
引用一个对象。 (在OP的例子中它是空的,但可以应用相同的故事。)
当你调用getAge()
时,它会返回一个引用该对象的匿名变量。
赋值运算符表示“让左侧变量引用右侧表达式引用的对象”。因此,如果您的student.getAge()=100
被允许,则会导致以下情况。
当然这没有意义,因此Java在编译时不允许这样做。
另一方面,您的第一个示例.setTime(1000)
不是作业,因此效果很好。