子類對象使用父類來進行承接這種問題今天錯了一次、如果調用了子類的方法,子類裏的方法使用了super來調用父類的方法就會很有迷惑性,下面是例子:
- 在子類的方法中調用super.方法有如下兩種情況:
- 子類已經重寫了父類中的這個方法,那麼就執行這個重寫的方法
- 子類沒有重寫這個父類的方法,就會執行父類中的這個方法,但是在執行過程中是以子類爲主體執行
大家可以看下面這段程序,並且寫出輸出結果:
public class Main {
public static void main(String[] args) {
// SuperClass s1 = new SuperClass();
// s1.show();
// SubClass s2 = new SubClass();
// s2.show();
SuperClass s3 = new SubClass();
s3.show();
}
}
class SuperClass{
void show(){
System.out.println("super class");
this.getName();
}
void getName(){
System.out.println("in SuperClass");
this.getMyClass();
}
void getMyClass(){
System.out.println(this.getClass().getSuperclass().getName());
}
}
class SubClass extends SuperClass{
void show(){
System.out.println("sub class");
super.show();
}
void getName(){
System.out.println("in SubClass");
this.getMyClass();
}
// 注意:SubClass並沒有重寫getMyClass方法
}
上面程序s3.show()的輸出結果:
sub class
super class
in SubClass
SuperClass
分析:
只分析s3那種情況的,s3就是子類對象使用父類來進行承接的例子。
- 因爲我是SubClass類,所有s3.show()方法肯定是進入SubClass類中的show方法
- 在這個方法中調用了super.show(),所以走到了父類SuperClass的show()方法裏面
- 可以看到,在父類show方法中,又調用了this.getName方法,但是注意:getName方法已經被子類重寫,this所代表的對象是子類,所以調用的是子類的getName方法
- getName方法中調用了getMyClass方法,但是注意:這個方法並沒有被子類重寫,因此又回到父類****的getMyClass方法中,但是此時this所代表的對象是子類,因此,在這個方法中getSuperclass得到當前對象的父類就是SuperClass,所以打印出來的內容是SuperClass
感想:還是需要認真理解繼承和多態的OOP思想