2012-12-17 66 views
3

我有一個類A在Java和A有一定的保護方法,然後我有一個類BextendsA使B可以覆蓋這些受保護的方法。然後,我希望能夠擁有C類別extends類別B,但類別C不應該能夠調用A的受保護方法。有沒有在Java中這樣做?我只是讓父類的方法被覆蓋並讓它們最終?胃內Java的孫子對象不準叫父母或祖父母的方法

public class A() 
{ 
    protected void somemethod(); 
    protected int somevariable; 
} 
public class B() extends A 
{ 
@Override 
final protected void somemethod(); 
//How do I make some variable final or not accessible to my children? 
} 
public class C() extends B 
{ 
//Now I cannot override somemethod! Is that right? 
} 
+2

是的,你說得對。爲什麼你不試試呢?而且你不應該在類名後面加括號。 –

+2

爲什麼地獄裏有類名(?)?這是有效的(我懶得試試它:D)? –

+0

我認爲不可能重寫一個方法,並突然使它成爲'final'。這將是一個非法的覆蓋,因爲在編譯器的眼中,它不是同一個方法,但它也無法區分調用哪個方法的方法。因此:無效。 (我不完全確定,需要檢查它。) – 11684

回答

3

不,您無法阻止子類調用父母的protected方法。爲了達到這個目的,你必須減少方法的可見性,這是​​不允許的。在類B中制定方法final僅意味着它不能在任何子類中被覆蓋。

事實上,你想禁止調用子類的protected方法對我來說似乎是一個設計問題。您可能想要查看整個班級的層次結構,或許更好地隔離班級的職責,這樣您就不會陷入必須防止通常會被允許的情況(調用protected方法)。

1
//How do I make some variable final or not accessible to my children? 

爲此,您可以讓一個變量私人最終

private final int COUNT = 100; 

私人訪問會阻止你的變量COUNT由子類進行訪問。

+0

不,在這種情況下,B類將無法重寫A的方法。 – 11684

+0

@ 11684:我認爲OP的問題只是關於一個變量。 – anubhava

+0

閱讀代碼片段中的註釋我當然有一種方法的印象。當我讀到它時,問題是:'我可以重寫的方法無法重載的類擴展覆蓋。 – 11684