作者awpadam (adam!)
看板java
標題[問題] 關於private的繼承問題
時間Wed Aug 5 13:21:00 2020
版友好
我是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身上的那一份
或者是其他更複雜的過程呢?
先謝謝各位版友的教導
--
※ 發信站: 批踢踢實業坊(ptt.cc), 來自: 111.241.215.203 (臺灣)
※ 文章網址: https://webptt.com/m.aspx?n=bbs/java/M.1596604862.A.A72.html
1F:→ ssccg: 是不能直接存取,不是不會繼承 08/05 13:50
2F:→ ssccg: 從物件導向的邏輯上來說,child是沒有member沒錯。但是從實 08/05 13:59
3F:→ ssccg: 作面來說,child的instance內必定有所有father的field,才 08/05 14:00
4F:→ ssccg: 能保證所有father的method、constructor運作正常 08/05 14:02
所以你的意思是 1.的結論是對的
以下是我自己新增的測試
我把child改為
class child extends father{
String member = "child";
}
也就是讓它有自己一個專屬的member
結果原程式印出的字樣還是father
緊接著
我又在child裡自己override了getMember()
class child extends father{
String member = "child";
public String getMember(){
return member;
}
}
結果原程式印出child
在我override之前,如果child有繼承了一份getMember()在自己身上
為什麼它看到的scope會是在father身上呢?
而要等我自己override之後
scope才變成在child身上
抱歉,這邊好像越來越多觀念我沒辦法自圓其說了=.=
5F:→ ssccg: 你沒override當然就是原本的father的實作,有什麼問題? 08/05 15:02
因為我原本的觀念是以為
繼承就是複製了一份程式碼在自己身上
如果是如此的話,在我override之前
繼承下來的getMember(),它看到的scope應該也是在child自己身上
但是現在看起來,在我override之前
就算繼承了father的getMember()
它看到的scope也是在father身上
所以繼承 就跟我想的 "複製一份程式碼在自己身上" 不太一樣
反而比較像是 "程式碼一樣在別人身上,我只是去參考它"
override之後,才是自己的
就變成好像是上面的 結論2. 才是對的
6F:→ ssccg: 你後面這段跟存取控制沒關係,把father的member的private拿 08/05 15:06
7F:→ ssccg: 掉也是一樣情況,在Child另外定義了member的情況下, 08/05 15:08
8F:→ ssccg: Father.member和Child.member就是不同,所以兩個getMember 08/05 15:09
9F:→ ssccg: 的實作就是從不同的變數取值,當然也不同 08/05 15:09
10F:→ ssccg: 在Father裡面寫member,實際上是Father.this.member 08/05 15:16
所以你的意思是 一樣是結論1.是正確的
只是複製下來的程式碼是Father.this.member
所以在我override之前,一樣會去找father的東西
跟scope無關就是了?
11F:→ ssccg: 在沒有模糊空間的情況下this可省略,但其實跟在有自己的 08/05 15:18
12F:→ ssccg: member的child裡面寫member是不同的 08/05 15:18
我了解了,謝謝你,你的回答幫助很大^^
※ 編輯: awpadam (111.241.215.203 臺灣), 08/05/2020 15:22:22
13F:→ ssccg: 不過沒錯,其實method繼承是用參考的,不是抄一份 08/05 15:24
14F:推 hpa82228: 怎麼會有複製過來的概念XD,東西一直都是老爸的 08/13 22:25
15F:→ hpa82228: 你一開始的小孩沒東西連方法都是用爸爸的,所以就印爸爸 08/13 22:37
16F:→ hpa82228: 公開和私有的差別你可以在main裡用c.member測試就懂了 08/13 22:40