如何注释从抽象类派生的实例变量?

时间:2015-02-06 22:40:13

标签: java inheritance annotations

我有以下抽象Java类:

abstract class AbstractDto {

  String id;

  public void setId(String id) { this.id = id; }    

  public String getId() {return id; }

}

我也有扩展抽象类的类:

class SomeDto extends AbstractDto {

  @SomeAnnotation
  String id;

}

我想注释从抽象类派生的实例变量。我不确定这是否就像我做的那样。我知道Java不提供变量重载,所以这是影子。

如果我这样做会发生什么:

public void go(AbstractDto dto) {
  println("dto.id: "+dto.id);
}

AbstractDto dto = new SomeDto();
dto.setId("1234");
go(dto);

由于我在设置SomeDto的id时会进行阴影处理,因此从AbstractDto继承了一个id变量,但仍未设置。

如何注释抽象超类中定义的实例变量?

编辑:当我这样做时:

SomeDto dto = new SomeDto();
dto.setId("123");

哪个ID设置为AbstractDto中的一个或SomeDto中的一个? 怎么样我在Abstract类中的一个方法从id中读取哪个id然后被使用?

1 个答案:

答案 0 :(得分:1)

您提供的示例称为 shadowing ,Java中的字段没有覆盖。

shadowing 的更多信息可以在Wikipedia中找到:

  

在计算机编程中,变量时会发生变量阴影   在一定范围内宣布(决策块,方法或内部   class)与在外部作用域中声明的变量具有相同的名称。

因此,要使用注释,您可以在抽象类中注释您的id变量(所有继承的类都可以使用该注释变量),或者只注释id SomeDto变量。但你必须要知道它是一个新变量(与id的超类变量无关)

关于你的第二个问题:

  

哪个ID设置在AbstractDto中,或者设置在SomeDto中?

将设置SomeDto的ID,因为dto的引用变量类型为SomeDto。为了解释更多,在继承的类SomeDto中,您定义了另一个隐藏第一个变量的id变量,因此每次使用对该类或任何继承的SomeDto类的引用的调用都将调用id类中定义的新SomeDto变量。

  

我在Abstract类中的一个方法从id中读取id会发生什么   然后用?

抽象类中对id的每次调用都将使用抽象类中的id,因此在AbstractDto中实现并使用变量id的方法将使用AbstractDto一个。

注释抽象超类中定义的实例变量:

这是一些现实生活中的例子,其中抽象类的实例变量被注释: