看板 java 關於我們 聯絡資訊
其實我的疑問很簡單 public Class Parent{ private Foo foo; private Bar bar; public Foo getFoo(){ return foo; } public Bar getBar(){ return bar; } } public Class Child extends Parent{ public void doSomething(){ Foo foo = this.getFoo(); } private void doAnother(){ Bar bar = this.getBar(); } } public Class Arrangement{ public void init(){ Child child = new Child(); child.doSomething(); } } 在doSomething中的getFoo(); 是從哪裡取得Foo這個物件的? 而Foo這個物件在這種情況下是存在於哪一個類別? 實作上的確會存在一個父類別的物件 而Foo及其getter也的確存在於父類別內而不是在子類別內 以下都是從定義上來闡述非實作上的真正行為 拿到繼承這方面講 定義上寫著Child繼承了Parent的getFoo() 但卻沒有繼承Parent的Foo 所以定義上的流程應該是: call getFoo() from Child -> return foo from Parent or call getFoo() from Parent -> return foo from Parent 如果是前者 不是非常奇怪嗎? 沒有繼承foo 要從哪裡跟Parent拿foo? 如果是後者 又何必用到"繼承"這兩個字? 只是開放存取權限而已 全部都是從Parent存取 如果只是為了extends去強加解釋 那我認為一開始就直接用"擴充/擴展"會更容易理解 畢竟這也是我們用extends的目的 不知道各位能不能用自己的說法而不是官方文件 為小弟妹歐吉巴桑解惑一番? 以下是題外話 今天有一個人提出他對定義的看法 就表示不會只有他一個人這樣想 像其他回文的板友一樣 越多人提出自己的看法 有各種相同/不同的論點 整個討論串的完整性就越高 但如果論點都只是你不該這樣想、請你接受或是官方文件就這樣說 那跟我們台灣人所受的教育有何不同? 都只是強迫的填鴨式教育罷了 從小老師的教學都是我們不能有自己的想法 不能用自己的想法去解題 就算答案對了 老師也不會解釋過程有甚麼錯誤 而是回答 "因為課本不是這樣教" 我覺得這才是真正應該改變的想法 ※ 引述《sbrhsieh (十年一夢)》之銘言: : ※ 引述《qrtt1 (有些事,有時候。。。)》之銘言: : : 標題: Re: [問題] private繼承問題 : : 時間: Wed Jul 16 09:49:27 2014 : : ............................................... 43 : : → kiwatami:官方文件有說我就不能問嗎= =? 怎麼感覺你很不想我發言 07/15 22:08 : : → Chikei:因為你一直在"你的想法"、"你覺得",這邊是Java版我們在討 07/15 22:59 : : → Chikei:論的是Java,那當然所有不清楚的名詞最終都以JLS為標準 07/15 22:59 : : → Chikei:現在JLS直接說明了private field就是不會被繼承,或者說這 07/15 23:00 : : → Chikei:就是Java the Language的"繼承"定義,你再覺得不合理也請接 07/15 23:00 : : → Chikei:受,因為我們是在討論Java語言。 07/15 23:01 : : → Chikei:當然要來大戰Java定義的繼承跟一般programmer談到繼承時候 07/15 23:08 : : → Chikei:的心靈模型一不一樣不是不可,但很明顯跟原po的問題無關 07/15 23:09 : : → TonyQ:其實我覺得都可以討論啦 就是對語意瞭解不一致而已XD 07/16 06:21 : : → TonyQ:也沒有人說不能/不想發言,原 po 多心了~ XD 07/16 06:22 : : → kiwatami:不好意思 從小到大我覺得不合理的都不會接受... 沒有要吵 07/16 08:58 : : → kiwatami:架的意思啦 只是覺得好像講出自己的想法反而不行的感覺 07/16 08:58 : : http://docs.oracle.com/javase/specs/jls/se7/html/jls-8.html#jls-8.2 : : Members of a class that are declared private are : : not inherited by subclasses of that class. : : 目前問題的關鍵在於 kiwatami 版友 : : 沒有把 field 與 method 的繼承視為獨立事件。 : : Members of a class 可以是 field 或 method, : : 版上已經接受規格定義的人,是將這二種 member 的繼承與否當成獨立事件 : : -- : : → swpoker:每種語言都有不同的特質~要先放下自己~才能得到世界 07/16 11:44 : : → ssccg:我不覺得他的問題跟field和method是不是獨立有關 07/16 12:42 : : → ssccg:上一篇回的比較好,問題在inherit是可存取還是存在 07/16 12:43 : : → swpoker:k版友的問題在於用自己的角度去理解JAVA~而忽略JAVA特性 07/16 14:29 : : → swpoker:繼承是可不用複製貼上就可以存取成員~達到模組化的目的 07/16 14:30 : : → swpoker:但是java特別注重在存取成員的特性包括對象及範圍 07/16 14:31 : : → swpoker:類別A想套用類別X~那麼不用複製類別X的程式碼~繼承就好了 07/16 14:32 : : → swpoker:但是也不代表類別X就要給人看光光~也些東西不可以給人看到 07/16 14:33 : : → swpoker:所以根據對象及範圍的不同就有了這四種存取限制 07/16 14:35 : : → NewSpec:勸k不要用這種心態來學習語言, 除了遇到瓶頸不容易突破外 07/16 21:05 : : → NewSpec:也很容易在熟練某種技術後過於堅持, 而忽略其他技術的優點 07/16 21:07 : 我的立場比較接近 TonyQ 版僕,我認為沒有必要過度強調哪一個"說法"才是絕對 : 正確的,畢竟這與你對繼承的定義為何有關。 : 這裡是 Java 版,你可以說以 Java 官方的說法為準,在討論一些 Java 方面的 : 主題時,用語使用官方定義的說法是比較好溝通,假如主題已經是與"定義"本身 : 有關,我覺得只拿"官方說法"出來服人是不夠的。(可能對方根本無法了解或接受 : 官方說法的內涵) : 看得出來 kiwatami 對"繼承"的定義是奠基在成本而非功能/界面上。 : 我猜他想釐清的是: : public class A { : private static int n; : private int num; : } : public class B extends A { : } : 在 runtime B class object 在空間上的成本是否不小於 A class object? : B instance 在空間上的成本是否不小於 A instance? : 若是的話,該用什麼樣的觀點去看這件事:class B 沒有繼承 class A 定義的 : private field 的話,為什麼 B instance( or class object) 會負擔這個成本? : 我是先接觸 C++ 後接觸 Java,在學習 C++ 的階段我也曾對何謂"繼承"感到 : 困惑過,有了一些想法後,在學 Java 時我對就沒有再著重於「Java 中繼承又 : 是怎麼一回事」。(實際上我不覺得我應該在學習 Java 時再盡力去試著接受或 : 理解 Java 宣稱的繼承是什麼) : 給 kiwatami 與打從心底覺得沒有"繼承"的作用就不應該出現任何影子(任何可以 : 觀察到沒有被繼承的部分存在都算)者,可以試著參考看看。 : 我的看法是: : 把擴充(繼承)與封裝(access privilege/modifier)當作是兩個正交的面向,Java : 的 extends 屬於前者,擴充者承襲了被擴充者的所有內涵,至於擴充者能不能 : 碰觸這些東西,那是由後者(封裝程度)來決定。 : 或者是把一個 object 的規格(介面)與實作(內涵)分開來看,CB extends CA 的語意 : 是 CB 繼承了 CA 的規格與實作(IB extends IA, CB implements IA 則是 IB/CB : 繼承了 IA 的規格),CA 的 private fields 是實作的細節,其成為 CB 實作(內涵) : 的一部分,而 CA 定義的 private fields 都不屬於 CA 的規格(介面)的一部分, : 故也不在 CB 的規格內。而當 CB instance 要去使用自身承襲 CA 而來的那一個 : 部分時,也必須同去使用另一個 CA instance 般透過其規格來使用。 : *這種說法受 protected/package 的影響,特定條件下是說不通的,除非能接受 : object 對外界所呈現的規格是浮動的看法(object 的規格非固定,會視觀察者而 : 改變)。 : ※ 發信站: 批踢踢實業坊(ptt.cc), 來自: 36.238.35.96 : ※ 文章網址: http://www.ptt.cc/bbs/java/M.1405529694.A.FCF.html : ※ 編輯: sbrhsieh (36.238.35.96), 07/17/2014 00:59:02 : ※ 編輯: sbrhsieh (36.238.35.96), 07/17/2014 03:19:11 -- ※ 發信站: 批踢踢實業坊(ptt.cc), 來自: 59.115.70.199 ※ 文章網址: http://www.ptt.cc/bbs/java/M.1405830260.A.523.html
luoqr:new Child時會順便建構Father, 存取foo變數是跟father拿 07/20 12:42
luoqr:Father給的只有getFoo()並非變數本身 07/20 12:43
luoqr:不過實際上JVM會怎麼分配記憶體 那就要看怎麼實作JVM了? 07/20 12:43
luoqr:你可用其它方式解讀"定義" 並無人限制你 只是溝通上方便而已 07/20 12:48
luoqr:你可以做一個真的會把變數繼承給子類別的VM 也可以不要這樣 07/20 12:54
luoqr:只要滿足繼承的條件就好 07/20 12:54
pzyc79:擴充感覺比較符合實際 繼承好像獨立出來的感覺 07/20 20:44
是的 實作上就像你說的那樣 問題就在於要怎麼用繼承來解釋這樣的關係
luoqr:實際上英文也是用extends而非inherit XD 07/20 22:59
antiquerefer:看來你不適合走這行 在軟體裡定義與介面是十分重要的 07/20 23:52
antiquerefer:雖然你可以使用實作觀點去理解定義 07/20 23:53
antiquerefer:但不代表了解定義本身是不好的 07/20 23:54
antiquerefer:也不覺得那些回您定義的人是填鴨式教育 07/20 23:55
這邊指的是要我不論如何也請接受這個定義這件事 沒有得到任何說明 只要我接受 非常填鴨吧XD? 而我也不是不接受其他人的說法 只是有一部分都沒有直接回答問題 而是像您一樣顧左右而言他的說 "我不適合走這行" 或是其他對我未來的期許有點擔憂之類的... 無關緊要的東西 感謝大家的關心XD 只是我覺得這裡您似乎多慮了...
antiquerefer:反而覺得您是obstinate audience 07/20 23:56
antiquerefer:了解定義 -> 為什麼這樣定義(優缺) -> 定義的特性 07/21 00:05
sbrhsieh:請問到目前為止,哪些回文/推文有在討論為什麼如此定義? 07/21 00:37
antiquerefer:因為連第一步都做不到了 何來第二步 07/21 04:25
antiquerefer:沒有共識 就想要討論具體? 先朝野協商吧 07/21 04:26
Killercat:很早很早很早以前是稱為Father, 不過不知道是不是性別 07/21 06:13
Killercat:議題的關係,很早以前就改稱Parent了 :P 07/21 06:14
Kennyq:推l大 => 實際上英文也是用extends而非inherit 07/21 12:24
AmosYang:以前許多設計架構裡也是用 master/slave 等字,現在也是 07/21 13:47
AmosYang:改用 parent/child 了 :D 07/21 13:47
Killercat:IDE太早夭 不然應該也會被靠杯 XD 07/21 14:48
sbrhsieh:就是沒有共識才要討論啊~擺什麼架子 07/21 15:51
gmoz:感覺像是文字遊戲 07/21 15:53
的確是文字遊戲 從一開始這就是文字遊戲
TonyQ:我認為是後者~從定義面來講變數繼承與否就是能存取與否而已 07/21 16:31
danny8376:為何這樣定義? 你知道spec先要出來語言才會實做出來嗎 07/21 19:59
※ 編輯: kiwatami (59.115.70.199), 07/21/2014 20:38:45
Eryngium:推!!有些人根本想都沒想過你的問題就狂否定 07/22 08:48