2015-02-06 137 views
1

我有以下的抽象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? 发生什么我在抽象类中的方法读取id然后使用哪个id?

+0

它被称为['shadowing'](http://docs.oracle.com/javase/specs/jls/se7 /html/jls-6.html#jls-6.4.1)。这可能会有所帮助:http://stackoverflow.com/questions/16941179/variable-shadowing-in-java – 2015-02-06 22:44:46

+0

这里唯一的派生是类本身。派生类中的'id'变量不是派生,继承等。 – EJP 2015-02-06 23:48:57

回答

1

您提供的示例被称为shadowing,Java中没有重写字段。

进一步了解遮蔽可以在Wikipedia找到:

在计算机程序中,当在一定的范围(判定框,方法,或内 类)内声明的变量 发生可变遮蔽具有与在外部作用域中声明的变量名称相同。

所以,用你的批注,你可以注解你id变量在抽象类(所有继承的类可以使用该批注的变量),或者只是标注的SomeDtoid变量,但你必须要知道,这是一个新的变量(与ID的超类变量没有关系)

关于你提到的第二个问题:

哪个ID是设置一个在AbstractDto或一个S中omeDto?

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

发生了什么我在抽象类中的一个方法读取id然后使用哪个id ?

在抽象类来id每个呼叫将使用id在抽象类,所以在AbstractDto实现并采用可变id将使用AbstractDto一个的方法。在抽象的超类中定义

注解实例变量:

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

+0

请参阅我的编辑:在AbstractDto中设置哪个id或SomeDto中的哪一个? – confile 2015-02-06 23:02:27

+0

SomeDto的ID – Tarik 2015-02-06 23:05:15

+0

会发生什么我在抽象类中的一个方法读取id然后使用哪个id? – confile 2015-02-06 23:08:24