java中的代碼塊是用{}括起來的代碼,進行一些功能的限定java
和類初始化相關的構造方法執行順序:靜態代碼塊 > 構造代碼塊 > 構造方法spa
public class FanXing { //靜態代碼塊 static { System.out.println("靜態代碼塊一執行了!"); } static { System.out.println("靜態代碼塊二執行了!"); } //構造方法 public FanXing() { System.out.println("構造方法執行了!"); } //構造代碼塊 { System.out.println("構造代碼塊一執行了!"); } { System.out.println("構造代碼塊二執行了!"); } public static void main(String[] args) { FanXing f = new FanXing(); //局部代碼塊 { System.out.println("局部代碼塊執行了"); } } }
執行結果爲:code
靜態代碼塊一執行了!
靜態代碼塊二執行了!
構造代碼塊一執行了!
構造代碼塊二執行了!
構造方法執行了!
局部代碼塊執行了對象
咱們必定要知道通常狀況下繼承是爲了方法的重寫,而不是爲了功能的擴展,功能的擴展用接口實現,java中只有單繼承和多重繼承,沒有多繼承(接口有多繼承,這也在必定程度上彌補了接口單一原則的弊端,繼承提升了代碼的複用性和維護性,讓類與類產生了一個關係,是多態的前提。blog
可是任何事物都有兩面性,繼承也有很差的一面的,咱們寫程序都追求低耦合好內聚,意思就是儘可能讓一個類獨立完成本身的功能,不和其餘類產生聯繫,這樣不利用代碼的擴展。甚至繼承在必定程度上打破了封裝性。繼承
繼承的注意事項:接口
同一個對象在不一樣時刻體現出來的不一樣狀態。多態是在寫代碼時期因爲沒法肯定該引用類型,用一種對象引用來表現多種對象,咱們常見的傳參是抽象類或者接口類型的其實都是多態,多態的前提:有繼承或者實現關係,有方法重寫,有向上轉型。在多態中主要的是方法的重寫,由於只有不一樣的「態」具備不一樣的方法內容,多態纔有實際的意義。生命週期
一樣的多態也有弊端,對於向上轉型,該對象不能調用子類特有的方法,調用前須要將此對象強轉子類對象,也就是向下轉型。get
多態中,例如:Person s = new Stiudent()不管什麼屬性在編譯時都是先檢驗Person類中是否存在,而在運行時只有成員方法會調用Student類中的方法,其餘的都是調用Person中的,因此說多態是基於方法重寫的!同步
咱們在繼承的時候就知道了,有些方法在父類和子類中會有不一樣的實現,那麼若是這個方法在父類中並不會有具體的實現,就彷彿多態在真正初始化以前是不知道什麼類型的,因此這個方法在不被真正重寫以前是不知道具體內容的,那麼這個方法咱們就能夠用abstract修飾,來聲明該方法此時沒有具體的實現內容,須要子類不得不重寫,這就是抽象方法,而一個類有了抽象方法,這個類就必須用abstract修飾來標註它是一個抽象類,
abstract:做爲一個修飾符,是抽象的標識,那麼抽象每每 意味着和不少關鍵字衝突,好比說private static final,仔細想一想那幾個關鍵字的含義你便明白爲何了,其實abstract只能和倆個修飾符共存:protected和public,由於java中是這樣說的:The abstract method fun in type FanXing can only set a visibility modifier, one of public or protected.
若是咱們說抽象類是共性的提取,那麼接口就是特性的擴展,接口是用來給類擴展功能的,實現一個接口就 意味着擴展該接口中的方法