多繼承和代碼塊
一、多繼承
在java中,為了數據安全,只允許單繼承。不過有些時候我們又需要多繼承,進一步拓展類的屬性和行為。在java中有提供實現多繼承的方式,這種是方式是間接的實現類似多重繼承的效果。實現方式有兩種----接口和內部類。
1、接口
在介紹接口的時候,說過子類只能繼承一個父類,也就是只能單繼承,但是子類可以實現多個接口。接口是沒有任何具體實現的。具體的用法如下:
1 interface CanFight { 2 void fight(); 3 } 4 5 interface CanSwim { 6 void swim(); 7 } 8 9 interfaceCanFly { 10 void fly(); 11 } 12 13 public class ActionCharacter { 14 public void fight(){ 15 16 } 17 } 18 19 public class Hero extends ActionCharacter implements CanFight,CanFly,CanSwim{ 20 21 public void fly() { 22 } 23 24 public void swim() { 25 } 26 27/** 28 * 對於fight()方法,繼承父類的,所以不需要顯示聲明 29 */ 30 }
2、內部類
如果子類的父類是具體類或者是抽象類,由於單繼承的限制,這時候只能通過內部類來實現多繼承。如下:
首先定義兩個父類
1 public class Father { 2 public int height(){ 3 return 175; 4 } 5 } 6 7 public class Mother { 8 public int weight(){ 9 return 95; 10 }11 }
如何定義一個子類,讓這個子類具備兩個父類的行為和屬性呢?
1 public class Son { 2 3 /** 4 * 內部類繼承Father類 5 */ 6 class Fatherlike extends Father{ 7 public int height(){ 8 return super.height() + 5; 9 } 10 } 11 /** 12 * 內部類繼承Mother類 13 */ 14 class Motherlike extends Mother{ 15 public int weight(){ 16 return super.weight() + 20; 17 } 18 } 19 20 public int getHieght(){ 21 return new Fatherlike ().height(); 22 } 23 24 public int getWeight(){ 25 return new Motherlike ().weight(); 26 } 27 }
二、代碼塊
1.什麽是代碼塊?
在java代碼中,用大括號{}將多行代碼封裝在一起,形成一個獨立的數據體,用於實現特殊的功能和初始化數據。
2.四種代碼塊
1)普通代碼塊
普通代碼塊是用的最多的,例如在方法名後面用{}括起來的代碼段。
1 public class Demo5 { 2 public void test(){ 3 System.out.println("Hi"); 4 } 5 6 }
2)構造代碼塊
在類中定義,沒有任何修飾符,構造二字首先我們想到的是構造器,構造器是在生成對象的時候被調用,構造代碼塊和構造器一樣是在生成對象的時候被調用。
1 public class Demo5 { 2 { 3 System.out.println("我是代碼塊"); 4 } 5 Demo5(){ 6 System.out.println("hill"); 7 } 8 { 9 System.out.println("我是代碼塊2"); 10 } 11 12 public static void main(String[] args) { 13 Demo5 demo5 = new Demo5(); 14 } 15 }
輸出結果:
我是代碼塊
我是代碼塊2
hill
從結果,很容易知道構造代碼塊定義的順序在構造器調用前先被執行。因此構造代碼塊常用於:初始化實例變量、初始化實例環境。
3)靜態代碼塊
靜態二字,首先想到的是static關鍵字,與構造代碼塊的區別僅僅多了static關鍵字。
1 public class Test { 2 static{ 3 System.out.println("靜態代碼塊"); 4 } 5 }
靜態代碼塊的主要目的是對靜態屬性進行初始化,靜態代碼塊在類加載的時候被執行,且只執行一次。
4)同步代碼塊
同步代碼塊是被synchronized關鍵字修飾的,其作用是加鎖,同一時間只能一個線程進入該代碼塊中,是一種安全機制。
3、總結
靜態代碼塊,隨著類的加載而被執行,且只執行一次,主要作用是進行相關資源的初始化。
構造代碼塊,當創建對象的時候就被調用一次,且優先於構造器的。主要用於初始化不同對象共性的初始化內容和初始化實例環境。
執行順序上,靜態代碼塊最先,其次是構造代碼塊,最後是構造器。
多繼承和代碼塊