一個展示Java類繼承子父類之間方法調用關係的例子及其分析

子類對象使用父類來進行承接這種問題今天錯了一次、如果調用了子類的方法,子類裏的方法使用了super來調用父類的方法就會很有迷惑性,下面是例子:

  • 在子類的方法中調用super.方法有如下兩種情況:
  1. 子類已經重寫了父類中的這個方法,那麼就執行這個重寫的方法
  2. 子類沒有重寫這個父類的方法,就會執行父類中的這個方法,但是在執行過程中是以子類爲主體執行

大家可以看下面這段程序,並且寫出輸出結果:

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就是子類對象使用父類來進行承接的例子。

  1. 因爲我是SubClass類,所有s3.show()方法肯定是進入SubClass類中的show方法
  2. 在這個方法中調用了super.show(),所以走到了父類SuperClass的show()方法裏面
  3. 可以看到,在父類show方法中,又調用了this.getName方法,但是注意:getName方法已經被子類重寫,this所代表的對象是子類,所以調用的是子類的getName方法
  4. getName方法中調用了getMyClass方法,但是注意:這個方法並沒有被子類重寫,因此又回到父類****的getMyClass方法中,但是此時this所代表的對象是子類,因此,在這個方法中getSuperclass得到當前對象的父類就是SuperClass,所以打印出來的內容是SuperClass

感想:還是需要認真理解繼承和多態的OOP思想

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