【问题标题】:How to annotate an instance variable derived from an abstract Class?如何注释从抽象类派生的实例变量?
【发布时间】:2015-02-06 22:40:12
【问题描述】:

我有以下抽象 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 继承的 idvariable 仍未设置。

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

编辑:当我这样做时:

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

哪个 id 设置在 AbstractDto 或 SomeDto 中? Abstract 类中的方法从 id 读取然后使用哪个 id 会发生什么?

【问题讨论】:

标签: java inheritance annotations


【解决方案1】:

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

更多关于阴影的信息可以在Wikipedia找到:

在计算机编程中,变量阴影发生在变量 在特定范围内声明(决策块、方法或内部 class) 与在外部作用域中声明的变量同名。

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

关于你的第二个问题:

哪个 id 设置在 AbstractDto 中还是 SomeDto 中?

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

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

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

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

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

【讨论】:

  • 请看我的编辑:在 AbstractDto 或 SomeDto 中设置了哪个 id?
  • 抽象类中的方法从 id 读取然后使用哪个 id 会发生什么?
  • @confile 是回答您的问题还是您有其他问题?请随时询问
  • 如何注释抽象超类中定义的实例变量?这样 Abstract 类仍然可以使用该变量。
  • @confile 就像任何实例变量一样注解它,不管这个类是不是抽象的,你可以找到例子herehere
猜你喜欢
  • 2021-07-24
  • 1970-01-01
  • 2015-05-28
  • 2017-04-28
  • 2015-03-23
  • 1970-01-01
  • 1970-01-01
  • 2012-01-08
  • 2014-04-17
相关资源
最近更新 更多