父類與子類的實例化

        從很多java的書籍中我們都知道,一個類繼承了另外一個類,要實例化子類,必須要先實例化父類。有了父親,纔可能有了兒子。但是,這個實例化大概是個怎樣的一個過程呢?我們舉幾個例子。

(1)

public class Son extends Father{
private String s = "子成員變量";
public Son(){
}
@Override
public void message() {
System.out.println("兒子");
}
public static void main(String[] args) {
new Son();
}
}
class Father {
private String s = "父成員變量";
public Father(){
System.out.println(this.s);
this.message();
}
public void message() {
System.out.println("父親");
}
}

也許有些初學者會覺得輸出的是:

父成員變量

父親的

包括我,以前不加思考,也覺得是這個答案。查看了一些資料,才知道,但實際上輸出的是:

父成員變量

兒子

實際上,在Father類的構造函數中,this對象是Son而不是Father,我們用getClass().getName()方法就可以得知。但是,爲什麼同是this,既然this是指Son,那爲什麼this.s卻輸出的是"父成員變量"呢?而this.message()卻調用的是Son的message()方法。這樣子,給了我很大的不確定性啊。本來我父類想調用自己的方法,做一些初始化的事情,但子類一繼承,我調的卻不是自己的方法了,子類我也是未知的,我那裏知道子類是誰,子類你覆蓋了我的方法,做些我不可以接收的事那怎麼辦。多態,給我帶來了不確定性。先不急,再看第二個例子。

(2)

public class Son extends Father{
private String s = "子成員變量";
public Son(){
}
@Override
public void message() {
System.out.println("兒子");
}
public static void main(String[] args) {
Son son = new Son();

Father father = son;

System.out.println(son.s);

System.out.println(father.s);

son.message();

father.message();
}
}
class Father {
private String s = "父成員變量";
public Father(){
}
public void message() {
System.out.println("父親");
}
}

你沒眼花,沒錯,輸出的是:

子成員變量

父成員變量

兒子

兒子

而不是:

子成員變量

子成員變量

兒子

兒子

        father和son不是指向都是同一個對象嗎?對。既然指向的都是同一個對象,那怎麼輸出會不一樣呢?我是這樣理解,父類與子類的實例化是這樣的,對於方法,如果子類沒有覆蓋父類的方法,那麼子類就會有父類方法的一個拷貝。如果子類覆蓋了父類的方法,就不用拷貝了。但對於成員變量,無論是子類有沒有一樣的成員變量,子類都會有父類的所有成員變量的一個拷貝。我們用debug就可以看到,當Son實例化時,是有兩個s成員變量的。但是,對於成員變量的調用,是由引用類型決定的,就是當我個調用father.s時,實際調用的是從Father繼承過來的s成員變量,當我們調用son.s的時候,實際調用的是Son自己定義的s成員變量。而對於方法卻不一樣,方法的調用,是由實際類型決定的,不管你引用類型是什麼,是father,還是son,調用的都是實際對象中的方法,即new出來的對象方法。

        由此,我們再回去看看(1)。在Father的構造方法中,this的實際對像是Son,所以當調用方法時,執行的是son方法。但是由於在Father的構造方法內,所以引用類型是Father,而調用成員變量時由引用類型決定,所以調用的是Father的成員變量。

        對於我們的javabean,要調用成員變量,我們通常都提供get方法。所以,不管是引用類型是什麼,調用得到的都是new出來的對象的成員變量,這樣,就減弱了多態帶來的不確定性。

          這是我的一些理解,如果有不對的地方,大家指正。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章