繼承與多態

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

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

1.掌握什麼是繼承與繼承的特徵

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

  特徵:特徵有不少簡述一些this

  1.Java是單繼承多實現。一個子類最多繼承一個父類,但能夠實現多個接口編碼

  2.繼承具備傳遞性(多重或多極繼承)。若是C繼承了B,B又繼承了A,那麼C也就繼承了A的全部非私有成員變量與方法spa

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

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

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

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

   

3.掌握類的加載順序

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

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

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的多態性

相關文章
相關標籤/搜索