簡體   English   中英

公共final或受保護的final方法不會在基類中覆蓋,而當我們在父類中將方法“ PRIVATE FINAL”用作其覆蓋時

[英]public final or protected final method does not override in base class and when we make a method “PRIVATE FINAL” in parent class its override

在基類中不覆蓋public finalprotected final方法很簡單,當我們在父類中將方法private final ,即使您將父類private final並在其子類中使用protected final擴展,它也會被覆蓋。 有人可以解釋這種行為嗎?

class A {

    private final void show() {
        System.out.println("Show method from A");
    }
}

class B extends A {

    protected final void show() {
        System.out.println("Show method from B");
    }

    public static void main(String... s) {
       new B.show();
    }
}

嗨,就像其他人說的那樣,您誤解了覆蓋。 首先,類A中的show方法是私有的。 因此不能從該類的外部訪問私有成員。下面的示例將說明這一點:

class A {
    private final void show() {
        System.out.println("Show method from A");
    }
}

public class B extends A {
    // protected final void show() {
    //     System.out.println("Show method from B");
    // }

    public static void main(String... s) {
        new B().show();
    }
}

如果您對此進行編譯,則會出現以下錯誤:

B.java:12: error: cannot find symbol
        new B().show();
             ^
symbol:   method show()
location: class B
1 error

在您的問題中,它正在調用在類B中定義的方法“ show()”,而不是Ai希望這樣可以澄清您的疑問。

您可以將某些或所有類的方法聲明為final。 您可以在方法聲明中使用final關鍵字,以指示該方法不能被子類覆蓋。 Object類執行此操作-它的許多方法都是最終的。

如果方法的實現不應該更改並且對於對象的一致狀態至關重要,則可能希望將其定型。

來自Java官方文檔的聲明。

如果您的代碼是

A a = new B();
a.show();

然后,您將嘗試從父類調用無法覆蓋的方法。 由於在您的示例中這是私有的,因此您將無法使用它。 嘗試使用公共方法。

所以發生的事情是,當對象的類型為B時,您的B.show()方法將掩蓋A.show()-這始終是事情的工作方式。 當您的引用是父類的類型時,覆蓋方法有效。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM