繼承與多態


最近刷了些java的面試題目,發現繼承與多態這塊知識點面的多些,總結整理一下

java面向對象的三大特性封裝繼承多態都是為了提高代碼的復用率,使開發人員少寫代碼

1.掌握什么是繼承與繼承的特征

  繼承是指子類繼承父類的非私有成員變量與方法,在子類中可以使用。

  特征:特征有很多簡述一些

  1.Java是單繼承多實現。一個子類最多繼承一個父類,但可以實現多個接口

  2.繼承具有傳遞性(多重或多極繼承)。如果C繼承了B,B又繼承了A,那么C也就繼承了A的所有非私有成員變量與方法

  3.基類派生出的子類具有可拓展性

2.掌握無參構造與有參構造

  每一個類都有構造方法,如果不顯示寫的話,默認的是無參構造方法。為養成良好的編碼習慣,我們應該在父類中寫上無參構造方法  

  子類不能繼承父類的構造方法

   

3.掌握類的加載順序

  首先找main函數入口,加載對應的類與static修飾的靜態代碼塊至JVM的方法區中去(順序父類至子類),接着去加載構造器(加載的同時會實例化對象,順序父類至子類)。

  總之父類的構造器加載與初始化都優於子類

public class Cat extends Animal {

    static{
        System.out.println("子類的靜態代碼塊加載了...");
    }
    
    public Cat() {
        // 顯式調用super()
        super("小狗");
        System.out.println("子類的無參構造方法執行了...");
    }

    public Cat(String name) {
        // 隱式調用super()
        System.out.println("子類的有參構造方法執行了...");
    }

    public static void main(String[] args) {
        //首先加載父類與其靜態代碼塊,在加載子類及其靜態代碼塊。接着去加載構造器順序由父類至子類
        Animal cat = new Cat();
        //同理可得
        Animal cat2 = new Cat("小貓");
    }

}

class Animal {

    private int num;
    private String name = "小豬";

    public Animal(String name) {
        this.name = name;
        System.out.println("父類的有參構造方法執行了..." + this.name);
    }

    public Animal() {
        System.out.println("父類的無參構造方法執行了....");
    }

    public static void say() {
        System.out.println("父類的靜態方法hello!");
    }

    static {
        say();
        System.out.println("父類的靜態代碼塊hi");
    }
}

PS:以上代碼為自己原創,將上述代碼能夠理清楚,相信對類的加載順序有一定的認知了,輸出結果如下:

4.正確理解多態

  首先多態有三要素:1.要有繼承關系 2.要有子類重寫父類成員方法 3.要有父類數據類型引用至子類

  首先要清楚多態中的重寫是不能夠重寫成員變量及satic修飾的成員變量或方法,它只能重寫方法(多態是運行時動態綁定的,static是在編譯時隨類一起被靜態綁定的)

public class Cat extends Animal {

    static void say(){
        System.out.println("hi!");
    }
    public void speak(){
        System.out.println("你好,我是小貓");
    }
    protected String name = "小貓";
    static int num = 20;
    public static void main(String[] args) {
        Animal cat = new Cat();
        Cat cat2 = new Cat();
        System.out.println(cat.name+":"+cat.num);
        System.out.println(cat2.name+":"+cat2.num);
        cat.say();
        cat.speak();
    }

}

class Animal {    
    protected String name = "小狗";
    static int num = 10;
    static void say(){
        System.out.println("hello");
    }
    public void speak(){
        System.out.println("你好啊");
    }
}

輸出結果如下:

以上代碼參考自知乎,此外,知乎的那個花木蘭從軍解釋多態的例子講的不錯:https://www.zhihu.com/question/30082151

多態的弊端:不能使用子類特有的成員變量或方法,只能向下轉型

5.正確理解重寫與重載

  重寫(覆蓋,Overrding)是子類重寫父類的方法,相同的方法名,參數類型與返回類型

  重載(OverLoad)發生在一個類中,方法名相同,參數列表不同,返回類型可以不同,重載發生在編譯時

6.正確理解static關鍵字

  首先static修飾的部分會隨着類的加載而一起被加載到JVM內存中的方法區中去。 如果某個成員變量或方法是被所有對象所共享的,那么應該定義成靜態的

  靜態成員只能訪問static修飾的成員變量或方法。非靜態成員可以訪問靜態成員或方法。

  static修飾的部分不能使用this,super關鍵字

  static破壞了Java的多態性


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM