2014-04-17 29 views

回答

13

並非每種方法都是可覆蓋的:您無法覆蓋final,privatestatic的方法。下面

是什麼,這意味着在實踐中一個小樣本:

class Base { 
    public final void fun1() { 
    } 

    private void fun2() { 
     System.out.println("Base::fun2"); 
    } 

    public void fun2Call() { 
     fun2(); 
    }   
} 

class Rextester extends Base 
{ 
    /* 
    @Override 
    public void fun1() { // compile error, because Base::fun1 is final 
    } 
    */ 

    // if @Override is uncommented, it will protect you from overriding private methods 
    // otherwise you will not get any compile time error. 
    //@Override 
    private void fun2() { 
     System.out.println("Rextester::fun2"); 
    }  

    public static void main(String args[]) 
    { 
     Base b = new Rextester(); 
     b.fun2Call(); // will output Base::fun2, 
         // if you change private to protected or public 
         // then you will see Rextester::fun2 in output 
    } 
} 

我覺得static方法重載相同情況下private方法壓倒一切的,至少你會得到類似的行爲。當然,將static方法更改爲publicprotected仍然不允許您覆蓋它。

+2

所以這是正確的,但考慮補充OP的問題的具體答案是NO,並非每種方法都是可覆蓋的。另外,我不認爲Java具有C#與「虛擬方法」的區別 – FrobberOfBits

+0

當您考慮它時,在C#中,您不能使該方法變得虛擬和靜態,這沒有多大意義。而且你不能將虛擬方法聲明爲私有。所以這可能沒有太大的區別。 – Michael27

+0

@ Michael27,爲什麼不。靜態方法不能被繼承(因爲它隱式地被密封),因此根本不能被重寫。同樣,私人方法是。被'overriden'整個點就是在派生類中覆蓋它。如果它以某種方式不可用於派生類型,那麼就沒有必要使它變爲虛擬/可覆蓋。 – Rahul

4

最終的靜態和私有方法是不可覆蓋的。其餘的都是。

final可以防止重寫,因爲這是它的意思。

static表示屬於而不是實例。

私人 - 沒有知名度,沒有壓倒一切。

此外,JIT是當它看到方法爲非覆蓋的快樂,因爲這意味着該方法,這意味着它是內聯的方法完美的候選人,因爲沒有其他實例的單態調度是可以覆蓋這一個。這對你來說可能沒有什麼重要,但它加速了這個方法。

1

不,不是全部。標有final,private,static修飾符的方法完全不可覆蓋。

+0

你說得對,但這個答案已經提供。兩次。 – Joffrey

+0

@Joffrey,是的,但多人可以給出相同的答案;這確實是有效的,除非它是複製或錯誤的。 – Rahul

+0

你自己說過:*除非是副本*。添加相同答案有什麼意義?這個論壇的重點是建立一個大問題/答案的字典。提供3次相同的答案不起任何作用,但給未來的讀者增加了更多的困惑,或者至少讓他們滾動,這是令人討厭的^^ – Joffrey