我对教程有一点误解。这是一个剪切:
public class Test {
private int id;
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
}
无论如何,我无法理解的是如何引用id。例如,我可以看到在getId方法中,我可以通过只返回id来直接访问先前定义的id。但是在setId方法中,先前定义的id被称为this.id,方法参数是id。
现在如果在get方法中有“return this.id”,那么我会理解一切。但此刻我很困惑。我假设如果我将在set方法中返回id,我将返回参数,而不是类定义的id。 总而言之,只要键入“id”就可以加入类定义的id,除非有一个带有相同名称的参数传递?这听起来很奇怪,我错过了什么?
答案 0 :(得分:5)
在Java中,在正常情况下,类中的this
是可选的。任何属性都可以带有或不带this
。
如果您有一个具有相同名称的参数或局部变量,则歧义会使this
成为强制性的。
这称为“ shadowing ”。据说局部变量正在遮蔽属性。
当您编写id
时,对Java最合理的猜测是您指的是最本地的引用,即参数名称而不是属性。要覆盖此行为,您必须澄清您是否愿意访问this.id
,这意味着属性,而不是本地变量。
希望能把事情搞清楚!
答案 1 :(得分:2)
this.id = id;
问题是你还有一个同名的局部变量。因此,您无法直接访问类成员,因为id
将引用局部变量。这就是为什么在这里访问类成员变量需要this
的原因。
您可以通过更改名称重写如下,现在不再需要this
。
public void setId(int locID) {
id = locID;
}
答案 2 :(得分:1)
你可以把this.id放在getId方法中,它仍然可以工作。实际上它说的是同样的事情。这将编译并完全有效:
private int id;
public int getId() {
return this.id;
}
public void setId(int id) {
this.id = id;
}
答案 3 :(得分:-3)
如果您已从Test类创建了对象,并且您尝试访问id
像这样:
int test;
test=TestObject.id;
您将收到错误,因为id
是私有的,因此您必须说
test=TestObject.getid();
现在getid()
将为我们返回我们可以调用它的私有id
,因为它的公共方法