1 抽象類 1.1 抽象類概述 在java中,一個沒有方法體的方法應該定義成抽象方法,而類中如果有抽象方法,這個類必須定義為抽象類。 示例: 1.2 抽象類的特點 方法只有聲明沒有實現的時候,該方法就是抽象方法,需要被abstract修飾,抽象方法必須定義在抽象類中。 抽象類不可以被實例化。 抽象類 ...
1 抽象類
1.1 抽象類概述
- 在java中,一個沒有方法體的方法應該定義成抽象方法,而類中如果有抽象方法,這個類必須定義為抽象類。
- 示例:
package java008; /** * 2017/9/10 * 說明:動物類 */ public abstract class Animal { /** * 動物吃東西 */ public abstract void eat(); }
package java008; /** * 2017/9/10 * 說明: */ public class Dog extends Animal { @Override public void eat() { System.out.print("狗吃肉"); } }
package java008; /** * 2017/9/10 * 說明: */ public class Cat extends Animal { @Override public void eat() { System.out.print("貓吃魚"); } }
1.2 抽象類的特點
- 方法只有聲明沒有實現的時候,該方法就是抽象方法,需要被abstract修飾,抽象方法必須定義在抽象類中。
- 抽象類不可以被實例化。
- 抽象類必須有其子類覆蓋了全部的抽象方法,該子類才可以實例化。否則,這個子類還是抽象類。
1.3 抽象類的細節
- 問:抽象類有構造函數嗎?
- 答:有,用於子類訪問父類數據的初始化。
- 問:抽象類可以不定義抽象方法嗎?
- 答:可以。目的就是讓該類不能創建對象,比如AWT的適配器對象。
- 問:抽象關鍵字可以和final共存嗎?
- 答:不可以。
- 問:抽象類和一般類的異同?
- 答:
- 相同點:抽象類和一般類都是用來描述事物的,都在內部定義成員。
- 不同點:
- ①一般類有足夠的信息描述事物,抽象類描述事物的信息可能不足。
- ②一般類中不能定義抽象方法,抽象類中可以定義抽象方法,也可以定義非抽象方法。
- ③一般類可以被實例化,但是抽象類不可以被實例化。
- 問:抽象類一定是父類嗎?
- 答:是的。
1.4 抽象類的練習
- 需求:公司中的程式員有姓名,工號,薪水和工作內容。項目經理除了有姓名,工號,薪水,還有獎金,工作內容。
package java008; /** * 2017/9/10 * 說明: */ public abstract class Employee { private String name; private String id; private double pay; public Employee(String name,String id,double pay){ this.name = name; this.id = id; this.pay = pay; } public abstract void work(); }
package java008; /** * 2017/9/10 * 說明: */ public class Programmer extends Employee { public Programmer(String name,String id,double pay){ super(name,id,pay); } @Override public void work() { System.out.print("寫代碼"); } }
package java008; /** * 2017/9/10 * 說明: */ public class Manager extends Employee { private double bonus; public Manager(String name, String id, double pay,double bonus) { super(name, id, pay); this.bonus = bonus; } @Override public void work() { System.out.print("管理"); } }
package java008; /** * 2017/9/10 * 說明: */ public class Test { public static void main(String[] args) { Programmer p = new Programmer("張三","30",9000); p.work(); Manager m = new Manager("李四","1",15000,9000); m.work(); } }
2 介面
2.1 介面的定義
- 當一個抽象類中的方法都是抽象方法的時候,這個時候就可以將抽象類以另一種形式定義和表示,就是介面interface。
- 介面的成員:
- 全局常量:public static final
- 抽象方法:public abstract
2.2 介面實現
package java008; /** * 2017/9/10 * 說明: */ public interface interfaceDemo { public void show(); }
package java008; /** * 2017/9/10 * 說明: */ public class interfaceDemoImpl implements interfaceDemo { @Override public void show() { System.out.print("介面的單實現"); } }
- 類與類之間是繼承關係,類與介面之間是實現關係。
- 介面不可以實例化,只能由實現了介面的子類並覆蓋介面中的所有抽象方法後,該子類才可以被實例化,否則這個子類只能是抽象類。
2.3 介面的多實現
package java008; /** * 2017/9/10 * 說明: */ public interface interfaceDemo { public void show(); }
package java008; /** * 2017/9/10 * 說明: */ public interface InterfaceDemo2 { public void show2(); }
package java008; /** * 2017/9/10 * 說明: */ public class interfaceDemoImpl implements interfaceDemo,InterfaceDemo2 { @Override public void show() { System.out.print("介面的多實現:show"); } @Override public void show2() { System.out.print("介面的多實現:show2"); } }
2.4 介面的細節
- 一個類在繼承另一個類的同時,還可以實現多個介面。
- 介面的出現避免了但繼承的局限性。
- 類與類之間是繼承關係,類與介面之間是實現的關係,介面與介面之間是繼承的關係,而且可以多繼承。
2.5 介面的特點
- 介面是對外暴露的原則。
- 介面是程式的功能擴展。
- 介面的出現降低耦合性。
- 介面可以用來多實現。
- 類與介面之間是實現關係,而且類可以繼承一個類的同時實現多個介面。
- 介面與介面之間可以有繼承關係,而且可以多繼承。
2.6 介面和抽象類的區別
- 成員區別:
- 抽象類:變數、常量、抽象方法、普通方法
- 介面:常量、抽象方法
- 關係區別:
- 類與類:繼承,單繼承。
- 類與介面:實現,單實現,多實現。
- 介面與介面:繼承,單繼承,多繼承。
- 設計理論的區別:
- 抽象類: 被繼承類體現的是“is a”的關係。共性功能。
- 介面:被實現體現的是:“like a”的關係。擴展功能。
2.7 介面的應用
- 模擬筆記本
- 定義USB介面
package java008; /** * 2017/9/11 * 說明: */ public interface USB { public void open(); public void close(); }
- 定義U盤
package java008; /** * 2017/9/11 * 說明: */ public class Upan implements USB { @Override public void open() { System.out.print("u盤開始運行"); } @Override public void close() { System.out.print("u盤結束運行"); } }
- 定義筆記本
package java008; /** * 2017/9/11 * 說明: */ public class BookPC { public static void main(String[] args) { useUSB(new Upan()); } public static void useUSB(USB u){ u.open(); u.close(); } }