1. 程式人生 > >多繼承和代碼塊

多繼承和代碼塊

加載 區別 一個 類的加載 system 關鍵字 繼承 print character

一、多繼承

在java中,為了數據安全,只允許單繼承。不過有些時候我們又需要多繼承,進一步拓展類的屬性和行為。在java中有提供實現多繼承的方式,這種是方式是間接的實現類似多重繼承的效果。實現方式有兩種----接口和內部類。

1、接口

在介紹接口的時候,說過子類只能繼承一個父類,也就是只能單繼承,但是子類可以實現多個接口。接口是沒有任何具體實現的。具體的用法如下:

 1 interface CanFight {
 2     void fight();
 3 }
 4  
 5 interface CanSwim {
 6     void swim();
 7 }
 8   
 9 interface
CanFly { 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、總結

靜態代碼塊,隨著類的加載而被執行,且只執行一次,主要作用是進行相關資源的初始化。

構造代碼塊,當創建對象的時候就被調用一次,且優先於構造器的。主要用於初始化不同對象共性的初始化內容和初始化實例環境。

執行順序上,靜態代碼塊最先,其次是構造代碼塊,最後是構造器。

多繼承和代碼塊