Re: [問題] private繼承問題

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

Links booklink

Contact Us: admin [ a t ] ucptt.com