組合與繼承

原文連接http://zhhll.icu/2020/05/06/java%E5%9F%BA%E7%A1%80/%E9%9D%A2%E5%90%91%E5%AF%B9%E8%B1%A1/java%E5%9F%BA%E7%A1%80%E4%B9%8B%E7%BB%84%E5%90%88%E4%B8%8E%E7%BB%A7%E6%89%BF/java

爲了不重複代碼太多,致使代碼很差維護,你們須要學會如何複用代碼,代碼複用的兩種方式,組合和繼承安全

組合:在新類中建立現有類的對象
繼承:建立現有類的新類ide

向上轉型

class Instrument {
    public void play() {
		System.out.println("Instrument.play()");
    } 
}

public class Wind extends Instrument {
	public void play() {
		System.out.println("Wind.play()");
    }
}

public class Music {
	
	public static void tune(Instrument i){
		i.play();
	}
	public static void main(String[] args) {
        Wind flute = new Wind();
        Music.tune(flute); // 向上轉型
    }
}

從一個更具體的類型轉化爲更通常的類型,因此向上轉型用掛失安全的。子類可能會比父類包含更多的方法,必須至少具備和父類同樣的方法。code

final

final方法

final方法的做用是防止子類經過重寫改變方法的行爲
類中全部的private方法都是隱式的指定爲final,由於不能訪問private方法,因此不能重寫它。給private方法加上final修飾並不會給方法帶來額外的含義。重寫一個private方法時編譯並不會報錯,一個方法是private的,他就不屬於父類的一部分,只是建立了一個同名的方法而已對象

final類

final類的做用是該類不容許被繼承繼承

多態

方法綁定

對於上述向上轉型的例子,編譯器如何知道該調用哪一個方法,方法的入參只是一個Instrument引用
java採用後期綁定,在運行時根據對象的類型進行綁定,在運行時判斷對象的類型,從而調用方法,在編譯時編譯器不知道對象的類型,java對於static和final方法沒法採用後期綁定(private方法也是隱式的final)get

多態的陷阱

注:多態只是針對於普通方法,對於屬性和靜態方法不會存在多態
屬性在編譯時就會被解析編譯器

public class Parent {
    public int field = 0;

    public int getField(){
        return field;
    }
}

public class Child extends Parent {
    public int field = 1;

    @Override
    public int getField(){
        return field;
    }
}

public class TestField {
    public static void main(String[] args) {
        Parent parent = new Child();
        System.out.println("parent.field= "+parent.field);
        System.out.println("parent.getField= "+parent.getField());
        Child child = new Child();
        System.out.println("child.field= "+child.field);
        System.out.println("child.getField= "+child.getField());
    }
}

執行結果博客

parent.field= 0
parent.getField= 1
child.field= 1
child.getField= 1

Parent.field和Child。field被分配了不一樣的存儲空間,Child實際上是存在兩個filed屬性的:自己的以及父類的,可是在引用Child的field的時候,默認的field屬性是來自於自己的,若是要獲取父類的該屬性,須要使用super.field來顯示地指定獲取父類屬性
可是這種狀況通常不會發生,首先屬性通常來講都是私有private的,其次子類和父類通常也不會起相同的屬性名字編譯

對於靜態方法的話,靜態方法只與類關聯,與對象無關

因爲自己的博客百度沒有收錄,博客地址http://zhhll.icu

相關文章
相關標籤/搜索