我有以下抽象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然后被使用?
答案 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
一个。
注释抽象超类中定义的实例变量:
这是一些现实生活中的例子,其中抽象类的实例变量被注释: