为什么在允许“返回x”时必须使用“this.x = x”?

时间:2013-01-21 01:09:16

标签: java syntax

我对教程有一点误解。这是一个剪切:

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,除非有一个带有相同名称的参数传递?这听起来很奇怪,我错过了什么?

4 个答案:

答案 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,因为它的公共方法