曾經(jīng)遇到過這樣一個(gè)小問題:
class?A {
private int i=1;
public int getI(){
return i;
}
public void setI(int i){
this.i=i;
}
}
public class?B extends?A {
int i=2;
public static void main (String [] args) {
B?b = new B();
System.out.println(b.getI());
}
}
結(jié)果是1,而不是2.
這個(gè)問題感覺還不錯(cuò)。
1.并不是private成員不會(huì)被繼承.事實(shí)上子類可以繼承父類的任何變量和方法。private、protected只是訪問權(quán)限而已。即使i是public的
輸出結(jié)果也肯定是1.
2.方法可以覆蓋,成員變量并沒有覆蓋一說,也就是子類的i和父類的i是共存在子類體內(nèi)的。父類對象中有i變量、set get兩個(gè)方法。子類class中應(yīng)有i【繼承于父類對象】、i【子類對象】兩個(gè)變量、set get兩個(gè)方法【繼承于父類對象】。
3.java中的原則是調(diào)用的是哪個(gè)類的方法,那么這個(gè)方法訪問的就是這個(gè)類中的成員。子類中沒有覆蓋public int getI()這個(gè)方法的話,那么子類調(diào)用的其實(shí)是父類的getI()方法.所以返回的是父類中的i.
所以如果子類覆蓋了getI()方法,那么就會(huì)輸出的是子類中的i了,因?yàn)檎{(diào)用的是子類中的方法。
以上是我曾經(jīng)遇到的一個(gè)問題,今天遇到另一個(gè)例子,進(jìn)而進(jìn)行思考!
class A{
?public int m = 1;
?A(){
??System.out.println("A have construct");
??System.out.println(m);
??tt();//因?yàn)閠t()方法已經(jīng)被覆蓋,所以此處調(diào)用的是子類的tt()方法;
//子類的數(shù)據(jù)成員此時(shí)還未顯式的初始化,所以返回值為默認(rèn)的0;
}
?public void tt(){
??System.out.println(m);
?}
}
public class B extends A{
?public int n = 2;
?B(){
??System.out.println("B have construct");
??System.out.println(n);
??tt();
}
?public void tt(){
??System.out.println(n);
?}
?public static void main(String args[]){
??B b = new B();
?}
}?
輸出結(jié)果是:
A have construct
1
0
B have construct
2
2
如注釋部分的解說!
這個(gè)例子中,B中的tt()方法已經(jīng)覆蓋了父類中的tt()方法.所以在執(zhí)行父類的構(gòu)造方法時(shí),調(diào)用的是子類的tt()方法;
PS:
構(gòu)造一個(gè)對象的過程是:
先父類,后子類;
先成員變量初始化,后構(gòu)造函數(shù).
歡迎來訪!^.^!
本BLOG僅用于個(gè)人學(xué)習(xí)交流!
目的在于記錄個(gè)人成長.
所有文字均屬于個(gè)人理解.
如有錯(cuò)誤,望多多指教!不勝感激!