1. 程式人生 > >(java) 面向物件 ---- 繼承、重寫與過載、抽象類、介面

(java) 面向物件 ---- 繼承、重寫與過載、抽象類、介面

面向物件共有三個特徵:封裝、繼承、多型

一、【java繼承  extends】

1.  Java不支援類的多繼承,但支援多重繼承。(支援介面的多繼承)

2.  子類擁有父類非private的屬性和方法。

3.  子類可以擁有自己的屬性和方法,即子類可以對父類進行擴充套件。

4.  子類可以用自己的方式來實現父類的方法 ---- 重寫。

5.  提高了程式碼的耦合性(繼承的缺點,耦合度高說明程式碼之間聯絡緊密,程式碼獨立性差)。

6. 子類有使用子類自己的(就近原則),子類沒有使用父類的。

【關鍵字】:

1.  extends: 繼承關鍵字。

2.  super: 使用super關鍵字來實現對父類成員的訪問。

3.  this:  指向自己的引用。

4.  final :  (1)宣告類,則這個類不能被繼承,即最終類;(2)宣告方法,則該方法不能被子類重寫

二、【重寫與過載】:

        重寫(override):子類中出現了和父類中一模一樣的方法時(方法名相同,引數個數型別相同,返回型別相同),則子類重寫了父類中的方法。

重寫的規則: (1)引數列表、返回型別必須與被重寫方法的相同。

(2)訪問許可權不能比父類中被重寫的方法的低。java四大許可權由高到低(public protected default private)。

(3)父成員方法只能被它的子類重寫。

(4)宣告為final、static的方法不能被重寫,static可以再次宣告。

(5)子類、父類在同一個包中,子類可以重寫父類中除宣告private和final的方法;不在一個包中,只能重寫父類中宣告為。public、protected的非final方法。

        過載(overload): 在一個類裡面,方法名相同,而引數列表不同。

過載的規則:

(1)必須改變引數列表(個數或型別不一樣)。

(2)可以改變返回型別、訪問修飾修飾符。

過載是一個類的多型性表現。重寫是子類與父類的一種多型性表現。

三、抽象類 abstract

一個類沒有包含足夠的資訊來描繪一個具體的物件,這樣的類就是抽象類。

抽象類總結

(1)抽象類不能例項化(建立物件),只有抽象類的非抽象子類才能建立物件。

(2)抽象類中不一定包含抽象方法,具有抽象方法的類必是抽象類。

(3)抽象類中的抽象方法只是宣告,不包含方法體。

(4)構造方法、類方法(用staticx修飾的方法)不能宣告為抽象方法。

(5)任何子類必須重寫抽象類的抽象方法,除非該子類宣告為抽象類。

(6)關鍵字abstract 不能與private 、final共存 。

四、介面 Interface】----  是抽象方法的集合,介面通常以interface來宣告。

         三種引用型別: 陣列、類、介面     (介面和類是不同的概念。類描述要物件的屬性和方法,介面包含類要實現的方法)

         介面只描述所應具備的方法,並沒有具體實現,具體的實現由介面的實現類(相當於介面的子類)來完成。這樣將功能的定義與實現分離,優化了程式設計。

介面特性:(介面不能例項化)

(1)介面中的方法會被隱式的指定為public abstract(只能是public abstract,其他修飾符都會報錯),介面中方法都是抽象的

(2)介面中的變數會被隱式的指定為public static final 變數(只能是public)

(3)子類必須覆蓋掉介面中的所有抽象方法,子類才可以例項化,否則子類是一個抽象類

【介面與類】

      相似點

            (1)一個介面可以有多個方法。

            (2)介面檔案儲存在.java檔案中,檔名使用介面名;介面的位元組碼檔案儲存在.class結尾檔案中。

      區別:

            (1)介面不能例項化物件。

            (2)沒有構造方法。

            (3)介面中的方法必須都是抽象方法,只能包含public static final 變數。

            (4)介面不是被類繼承了,而是被類實現。

            (5)介面支援多繼承。

  【介面與抽象類的區別】

            (1)抽象類中的方法可以有方法體(非抽象方法),介面中的方法都是抽象方法。

            (2)抽象類中的成員變數可以是各種型別,而介面中的成員變數只能是public static final型別的。

            (3)一個類只能繼承一個抽象類,而一個類可以實現多個介面。

            (4)介面中不能含有靜態程式碼塊以及靜態方法(用static修飾的方法),而抽象類可以有。

介面多型程式:(介面作引數)

/*
 *  USB介面:
 *  方法: 開、關
 */
public interface USB {
	
	public abstract void open();
	public abstract void close();

}

/*
 * 滑鼠類   實現USB介面類
 * 方法:開、關
 */
public class Mouse implements USB{
	
	public void open(){
		System.out.println("開啟滑鼠");
	}
	public void close(){
		System.out.println("關閉滑鼠");
	}

}

/*
 *   筆記本類
 *   方法:開、關、使用USB裝置
 */
public class Computer {
	
	public void openComputer(){
		System.out.println("筆記本開啟");
	}
	public void closeComputer(){
		System.out.println("筆記本關閉");
	}
	// 具體使用哪一個USB 裝置不知道,需要輸入裝置的介面型別
	// 介面當做引數, 介面的實現類 可以有很多個   只要滿足介面規範,那麼筆記本可以連入許多種類的裝置(即可無限擴充套件)
	public void useUSB(USB usb){
		
		usb.open();
		usb.close();
	}

}

/*
 * 鍵盤類     USB介面實現類
 * 功能:重寫抽象方法
 */
public class Keyboard implements USB{
	public void open(){
		System.out.println("開啟鍵盤");
	}
	public void close(){
		System.out.println("關閉鍵盤");
	}

}

/*
 *  介面使用--筆記本案例
 *  1.事物
 *    筆記本   USB(介面)  USB裝置(滑鼠、鍵盤)
 *  2.事物的屬性
 *    筆記本:開、關、使用USB裝置
 *    USB介面:開、關
 *    USB裝置:必須滿足USB介面規範     開、關
 *  3.事物間的聯絡
 *    筆記本:呼叫外部USB裝置
 *    USB介面:外部裝置都是它的實現類
 * 
 */
public class Test {
	public static void main(String[] args) {
		// 建立Computer型別物件
		Computer com = new Computer();
		com.openComputer();   // 開啟筆記本
		
		// 建立Mouse 型別物件
		Mouse mou = new Mouse();  
		com.useUSB(mou);     // 連線滑鼠裝置      使用了介面的多型
		
		// 建立Keyboard型別物件
		Keyboard ke = new Keyboard();
		com.useUSB(ke);      // 連線鍵盤裝置     使用了介面的多型
		
		com.closeComputer(); // 關閉筆記本
	}

}