![](/img/trans.png)
[英]Private member of parent class is used as a public member function's parameter
[英]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.