Re: [問題] private繼承問題

看板java作者 (小犬)時間10年前 (2014/07/15 05:00), 10年前編輯推噓3(307)
留言10則, 3人參與, 最新討論串6/17 (看更多)
※ 引述《kiwatami (悠游自在)》之銘言: : ※ 引述《meya (落寞之心)》之銘言: : : class A{ : : private int a1=1; : : } : : public class test extends A{ : : public static void main(String[] args){ : : test t=new test(); : : System.out.println(t.a1); : : } : : } : : 子類別無法直接存取父類別的private a1,但 : : 究竟子類別有無繼承父類別的private a1? : : 應該用下列哪種理解才正確? : : (A)子類別內的a1繼承自父類別的a1,只是父類別用private修飾a1,讓其他類別無法直接 : : 存取父類別內的a1 : : (B)使用private修飾過的a1,無法被子類別繼承 : : 懇請回答謝謝 : 答案是A : 當然有被繼承 : 不然你用get會拿到什麼? : 用private只是封裝變數不給外部使用 : 用意是在外部程式若隨便更改變數可能會導致程式出現錯誤(當然這不是唯一的目的) : 所以要封裝起來由setter做更動 : 不一定正確啦 因為我滿討厭讀定義的XD : 你參考一下 根據官方tutorial的說法是沒有繼承的 http://docs.oracle.com/javase/tutorial/java/IandI/subclasses.html 我試著解釋 你的顧慮 不知道正不正確 請大家幫我看看我的理解正確嗎 繼承狀態下父類別實體是存在的 而且所有的成員 方法都存在 package org.twbbs.peak.test; public class ClassA { @SuppressWarnings("unused") private int privateInt=10; int defaultInt=20; protected int protectedInt=30; public int publicInt=40; } package org.twbbs.peak.test; public class ClassB extends ClassA{ @SuppressWarnings("unused") private int privateInt=1; int defaultInt=2; protected int protectedInt=3; public int publicInt=4; } public class Starter { public static void main(String args[])throws Exception{ ClassB classB= new ClassB(); reflection(classB); reflection2(classB); } private static void reflection(ClassB classB) throws Exception{ System.out.println("\n\nReflection"); Class<? extends ClassA> class1 = ClassA.class; Field[] fields = class1.getDeclaredFields(); for(Field f:fields){ f.setAccessible(true); System.out.println(f+ "==" +f.getInt(classB)); f.setAccessible(false); } } private static void reflection2(ClassB classB) throws Exception{ System.out.println("\n\nReflection"); Class<? extends ClassB> class1 = ClassB.class; Field[] fields = class1.getDeclaredFields(); for(Field f:fields){ f.setAccessible(true); System.out.println(f+ "==" +f.getInt(classB)); f.setAccessible(false); } } } 會跑出 Reflection private int org.twbbs.peak.test.ClassA.privateInt==10 int org.twbbs.peak.test.ClassA.defaultInt==20 protected int org.twbbs.peak.test.ClassA.protectedInt==30 public int org.twbbs.peak.test.ClassA.publicInt==40 Reflection private int org.twbbs.peak.test.ClassB.privateInt==1 int org.twbbs.peak.test.ClassB.defaultInt==2 protected int org.twbbs.peak.test.ClassB.protectedInt==3 public int org.twbbs.peak.test.ClassB.publicInt==4 所以不論如何所有的成員都是存在的 而我想繼承的意義是在與 存取的權限 和存取到什麼 簡單來說 假設ClassB改成 public class ClassB extends ClassA{ public ClassB() { System.out.println(publicInt); System.out.println(protectedInt); System.out.println(defaultInt); // System.out.println(privateInt); } } privateInt 會無法存取 所以我們稱ClassB有繼承publicInt,protectedInt,defaultInt 而繼承沒有什麼複製或是什麼的變成ClassB的東西 只是取得權限去存取而已 用的還是ClassA的成員 而成員OVERRIDE和 方法的OVERRIDE又不太一樣 不過也是另一件事了 -- ※ 發信站: 批踢踢實業坊(ptt.cc), 來自: 118.161.184.19 ※ 文章網址: http://www.ptt.cc/bbs/java/M.1405371632.A.573.html ※ 編輯: jetswayss (118.161.184.19), 07/15/2014 05:26:55

07/15 22:05, , 1F
我只是覺得 繼承了public的get方法 卻沒有繼承get方法裡r
07/15 22:05, 1F

07/15 22:05, , 2F
eturn的變數 有點說不太通 尤其那個變數還不是運算後產
07/15 22:05, 2F

07/15 22:05, , 3F
生的 而是class本身帶有的變數 從父類別的實體裡取得感
07/15 22:05, 3F

07/15 22:05, , 4F
覺比較像是實做上的說法
07/15 22:05, 4F

07/16 06:23, , 5F
其實就是對繼承的語意解讀不同而已
07/16 06:23, 5F

07/16 06:23, , 6F
我覺得你的跟他的表達,都說得通。只是教學上會以官方文件
07/16 06:23, 6F

07/16 06:24, , 7F
為準。但概念上討論我覺得是開放的自由討論想法啦。:P
07/16 06:24, 7F

07/16 06:25, , 8F
不然在跨語言的比較或討論時就容易碰到語意上微妙不同的問題
07/16 06:25, 8F

07/16 11:03, , 9F
嗯 同意你的說法
07/16 11:03, 9F

07/16 20:55, , 10F
因為public的get才會繼承 如果get方法宣告成private一樣不會
07/16 20:55, 10F
文章代碼(AID): #1Jn4JmLp (java)
討論串 (同標題文章)
文章代碼(AID): #1Jn4JmLp (java)