(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(); // 關閉筆記本
}
}