簡體   English   中英

Java繼承中的私有方法

[英]private method in inheritance in Java

我對在繼承中使用私有方法感到困惑,例如:

public class A {
    private void say(int number){
        System.out.print("A:"+number);

    }
}

public class B extends A{
    public void say(int number){
        System.out.print("Over:"+number);
    }
}

public class Tester {
    public static void main(String[] args) {

        A a=new B();
        a.say(12);

    }
}

基於上面的代碼,我對私有方法的繼承感到困惑,私有方法是從class A繼承到B嗎? 或者兩個類中的 say 方法完全無關? 由於代碼在 main() 方法中運行時出錯,因此class B似乎無法從class A調用私有方法。

如果您希望子類可以訪問需要保持private的超類方法,那么protected就是您要查找的關鍵字。

  • Private只允許包含該成員的類訪問該成員。
  • Protected允許在類及其所有子類中訪問成員。
  • Public允許任何人訪問該成員。

您收到錯誤的原因是say(int)是私有的。 這與繼承無關。 您只能在其定義類中調用私有成員方法。

為了回答您的繼承問題, B.say()是一種不同的方法 - 它甚至沒有覆蓋方法A.say()因為派生類不能從其基類繼承私有方法。 只能繼承和/或覆蓋protectedpublic方法/變量。

這里有兩件事正在發生。

首先,請記住引用類型和對象類型之間的區別。

當你說

A a = new B();

所述參考是a類型的A ,但對象的類型是B 所以當你調用a.say(12); ,您正在從A API/接口/角度看B

其次,因為你是從A角度看B ,你會得到一個錯誤,因為A沒有名為say()公共方法。 當然B可以,但請記住,您將B視為A 當你這樣做時,你將失去任何能力(除非你稍后施法,但現在不要擔心)引用那些A不知道的B方法。

最后, B實際上從未從A繼承say()因為它首先看不到它,並且A沒有任何人可以訪問的公共方法say()

現在,如果您真的想找點樂子,請將say()A protected 並在B私有,然后看看會發生什么。

私有意味着您只能在該類中訪問它,而不能在其他地方訪問它。

子類只能從它們的超類調用或覆蓋protectedpublic方法(或沒有訪問修飾符的方法,如果超類在同一個包中)。 private方法保留在聲明它們的類中,對任何其他類都不可見,無論它如何相關。

私有方法在子類中繼承,這意味着私有方法在子類中可用,但不能從子類中訪問,因為在這里我們必須記住可用性和可訪問性的概念。

暫無
暫無

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

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