Java中的每種方法都可覆蓋嗎?我知道在C#中定義爲虛擬的方法可以被重寫,這是如何在Java中實現的?Java中的每種方法都可覆蓋
4
A
回答
13
並非每種方法都是可覆蓋的:您無法覆蓋final
,private
和static
的方法。下面
是什麼,這意味着在實踐中一個小樣本:
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
方法更改爲public
或protected
仍然不允許您覆蓋它。
4
最終的靜態和私有方法是不可覆蓋的。其餘的都是。
final可以防止重寫,因爲這是它的意思。
static表示屬於類而不是實例。
私人 - 沒有知名度,沒有壓倒一切。
此外,JIT是當它看到方法爲非覆蓋的快樂,因爲這意味着該方法,這意味着它是內聯的方法完美的候選人,因爲沒有其他實例的單態調度是可以覆蓋這一個。這對你來說可能沒有什麼重要,但它加速了這個方法。
1
相關問題
- 1. Java。覆蓋方法
- 2. 哪種方法被覆蓋?
- 3. Mason2中的多種方法覆蓋
- 4. 強制覆蓋方法,如果另一種方法被覆蓋
- 5. Java方法覆蓋 - 「方法不會覆蓋超級方法...」
- 6. 覆蓋toString()方法的Java
- 7. 無法@覆蓋Java中的compareTo()方法
- 8. 爲什麼我的方法每次都不會覆蓋工作?
- 9. Java私有方法覆蓋
- 10. Java:覆蓋通用方法
- 11. Java方法覆蓋問題
- 12. Java泛型方法覆蓋
- 13. Java方法不會覆蓋
- 14. 覆蓋ESAPI OWASP方法java
- 15. 覆蓋Java中每個類實例的方法
- 16. 在Java中覆蓋的方法
- 17. 如何覆蓋groovy中的java方法
- 18. java中的覆蓋方法約束
- 19. ArrayList的數組每次都被覆蓋
- 20. Zend Framework1,有沒有一種方法可以覆蓋每個Controller的Zend_View_Helper_ *函數?
- 21. 我可以在繼承中只覆蓋一種方法嗎?
- 22. 所有變種方法覆蓋
- 23. 一次覆蓋兩種方法
- 24. 應該覆蓋哪種數組方法?
- 25. 關於在java中覆蓋equals方法
- 26. 在java中覆蓋「private」方法
- 27. Java變量被覆蓋的方法被覆蓋的概念
- 28. Java方法覆蓋 - 在父級訪問方法 - 這可能嗎?
- 29. 調用從覆蓋方法中覆蓋的方法在OO PHP
- 30. 如何覆蓋Scala中的Java可變參數方法?
所以這是正確的,但考慮補充OP的問題的具體答案是NO,並非每種方法都是可覆蓋的。另外,我不認爲Java具有C#與「虛擬方法」的區別 – FrobberOfBits
當您考慮它時,在C#中,您不能使該方法變得虛擬和靜態,這沒有多大意義。而且你不能將虛擬方法聲明爲私有。所以這可能沒有太大的區別。 – Michael27
@ Michael27,爲什麼不。靜態方法不能被繼承(因爲它隱式地被密封),因此根本不能被重寫。同樣,私人方法是。被'overriden'整個點就是在派生類中覆蓋它。如果它以某種方式不可用於派生類型,那麼就沒有必要使它變爲虛擬/可覆蓋。 – Rahul