簡體   English   中英

家長班級公開成員召集的兒童班級私有成員

[英]Child class private member called from Parent class public member

下面的代碼中發生了什么? 請解釋輸出:

class Parent{
    private void fun(){
        System.out.println("parent fun\n");
    }
    public void accessFun(){
        System.out.println(this);
        this.fun();
    }
}

class Child extends Parent{
    private void fun(){
        System.out.println("child fun");
    }
}

class Test{
    public static void main(String[] args) {
        Child a = new Child();
        Parent b = new Parent();
        Parent c = new Child();
        a.accessFun();
        b.accessFun();
        c.accessFun();
    }
}

輸出:

Child@7960847b

parent fun

Parent@3b192d32

parent fun

Child@16f65612

parent fun

為什么這行this.fun()沒有給出編譯時錯誤?

我認為fun是Child類的私有成員,因此不能從Child類之外(從其Parent類的公共成員)訪問。

為什么this.fun()會調用fun()的父類版本? 請注意, 是指子類對象。

私有成員不會被繼承。

我認為這可能是您在這里缺少的重點。 這意味着Child.fun不會覆蓋Parent.fun 它們只是兩個彼此無關的簡單老方法。

當您調用accessFun ,控件始終進入Parent以下代碼:

public void accessFun(){
    System.out.println(this);
    this.fun(); <---- here
}

現在,由於我們現在位於Parent ,因此可以訪問fun 並且由於Parent.fun 沒有被覆蓋 ,因此它將調用Parent.fun而不是Child.fun

我認為樂趣是孩子班級的私人成員,因此不能從班級外部訪問(甚至可以從其父班級的公共成員那里訪問)。

那是一個完全的誤解。 如果不能從類外部訪問私有成員,甚至不能通過公共方法訪問私有成員,那么它們的作用將大大減少。 為什么還要放在首位呢?

“私有成員只能由在同一類中聲明的成員訪問”可能要記住。

Parent中的private fun()由同一Parent類的public accessFun()調用。 在Test類的main()中調用public accessFun()
這里的accessFun()是公共的,因此可以從任何地方調用它。
例如,就像Pojo類一樣,私有成員可以通過公共設置者和獲取者來訪問

父級中的fun方法是私有的,子級fun()方法不會覆蓋父級fun()方法。 但是accessFun方法是公共的,因此可以從子類中調用它,並且可以公共訪問。

因此,當您調用accessFun()方法時,它將調用父類fun()方法。 不是子類的fun()方法,因為它是私有的。 這就是為什么您不會收到錯誤的原因。

我認為樂趣是孩子班級的私人成員,因此不能從班級外部訪問(甚至可以從其父班級的公共成員那里訪問)。

有時,一切都來自“外部”。 例如, main呼叫來自外部。

如果無法從外部訪問私有成員,則它將始終是無效代碼,這沒有任何意義。

區別在於對直接訪問和間接訪問的理解。

在所有情況下,都可以通過accessFun()方法非直接地調用該方法。

暫無
暫無

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

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