作者jetswayss (小犬)
看板java
標題Re: [問題] private繼承問題
時間Tue Jul 15 05:00:30 2014
※ 引述《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
推 kiwatami:我只是覺得 繼承了public的get方法 卻沒有繼承get方法裡r 07/15 22:05
→ kiwatami:eturn的變數 有點說不太通 尤其那個變數還不是運算後產 07/15 22:05
→ kiwatami:生的 而是class本身帶有的變數 從父類別的實體裡取得感 07/15 22:05
→ kiwatami:覺比較像是實做上的說法 07/15 22:05
→ TonyQ:其實就是對繼承的語意解讀不同而已 07/16 06:23
→ TonyQ:我覺得你的跟他的表達,都說得通。只是教學上會以官方文件 07/16 06:23
→ TonyQ:為準。但概念上討論我覺得是開放的自由討論想法啦。:P 07/16 06:24
→ TonyQ:不然在跨語言的比較或討論時就容易碰到語意上微妙不同的問題 07/16 06:25
推 kiwatami:嗯 同意你的說法 07/16 11:03
推 luoqr:因為public的get才會繼承 如果get方法宣告成private一樣不會 07/16 20:55