2015-02-06 135 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