[問題] 關於private的繼承問題

作者: awpadam (adam!)   2020-08-05 13:21:00
版友好
我是java新人,想請版友幫忙釐清一個觀念
下面有個father類別
有一個私有成員和一個公開方法
此公開方法會使用到這個私有成員
然後child類別 繼承father
class father {
private String member = "father";
public String getMember(){
return member;
}
}
class child extends father{
}
public class testMain {
public static void main(String[] args) {
child c = new child();
System.out.println(c.getMember());
}
}
依照我原本的觀念
child會繼承一份 public 的 getMember到自己身上
不過private的member就不會繼承到自己身上
因此我去呼叫child的getMember的時候
由於找不到自己身上的member,所以應該會出現錯誤
不過這隻程式實際上印出了 father 字樣
所以究竟是
1.private的member 也有繼承一份到child身上
只是外部直接使用會看不到
2.getMember並沒有繼承一份到child身上,呼叫c.getMember時
用的還是father身上的那一份
或者是其他更複雜的過程呢?
先謝謝各位版友的教導
作者: ssccg (23)   2020-08-05 13:50:00
是不能直接存取,不是不會繼承從物件導向的邏輯上來說,child是沒有member沒錯。但是從實作面來說,child的instance內必定有所有father的field,才能保證所有father的method、constructor運作正常你沒override當然就是原本的father的實作,有什麼問題?你後面這段跟存取控制沒關係,把father的member的private拿掉也是一樣情況,在Child另外定義了member的情況下,Father.member和Child.member就是不同,所以兩個getMember的實作就是從不同的變數取值,當然也不同在Father裡面寫member,實際上是Father.this.member在沒有模糊空間的情況下this可省略,但其實跟在有自己的member的child裡面寫member是不同的不過沒錯,其實method繼承是用參考的,不是抄一份
作者: hpa82228   2020-08-13 22:25:00
怎麼會有複製過來的概念XD,東西一直都是老爸的你一開始的小孩沒東西連方法都是用爸爸的,所以就印爸爸公開和私有的差別你可以在main裡用c.member測試就懂了

Links booklink

Contact Us: admin [ a t ] ucptt.com