一、抽象類:abstract
抽象類就是為了繼承而存在的,如果你定義了一個抽象類,卻不去繼承它,那么等於白白創建了這個抽象類,因為你不能用它來做任何事情。對於一個父類,如果它的某個方法在父類中實現出來沒有任何意義,必須根據子類的實際需求來進行不同的實現,那么就可以將這個方法聲明為abstract方法,此時這個類也就成為abstract類了。
格式如下:
包含抽象方法的類稱為抽象類,但並不意味着抽象類中只能有抽象方法,它和普通類一樣,同樣可以擁有成員變量和普通的成員方法。注意,抽象類和普通類的主要有三點區別:
1)抽象方法必須為public或者protected(因為如果為private,則不能被子類繼承,子類便無法實現該方法),缺省情況下默認為public。
2)抽象類不能用來創建對象,但是它可以有構造方法,用來幫助子類實例化。
3)如果一個類繼承於一個抽象類,則子類必須實現父類的抽象方法。如果子類沒有實現父類的抽象方法,則必須將子類也定義為為abstract類。
抽象類的具體實例如下:
//定義一個抽象類,切記它不能用來創建對象 abstract class Employee { //聲明受保護的屬性 protected String name; protected String id; protected double pay; //抽象類的構造方法 public Employee(String name,String id,double pay) { this.name = name; this.id = id; this.pay = pay; } //抽象類的普通成員方法 public void print() { System.out.println("name = "+name+"id = "+id+"pay = "+pay); } //抽象類的抽象方法,子類必須實現該方法,不然子類也是抽象類 public abstract void work(); }
//抽象類的一個子類 class Pro extends Employee { public Pro(String name,String id,double pay) { //調用父類的構造函數進行初始化
super(name,id,pay); } //實現了父類中的抽象方法,所以子類不再是抽象類 public void work() { System.out.println("Pro work"); } } //抽象類的另一個子類 class Manager extends Employee { private double bonus; public Manager(String name,String id,double pay,double bonus) {
//調用父類的構造方法進行初始化 super(name,id,pay); this.bonus = bonus; } //實現了父類中的方法,所以子類不再是抽象類 public void work() { System.out.println("Manager work"); } } //測試類 class YuanGongDemo { public static void main(String[] args) { Pro p1 = new Pro("Liding","jfisd",578.5); p1.work(); Manager p2 = new Manager("LiNing","技術部",4578.5,786.75); p2.work(); } }
二、接口:Interface
Java接口是一系列方法的聲明,是一些方法特征的集合,一個接口只有方法的特征沒有方法的實現,因此這些方法可以在不同的地方被不同的類實現,而這些實現可以具有不同的行為(功能)。
接口的主要特點:
1、接口中的成員變量默認都是public、static、final類型的,必須被顯示初始化。
2、接口中的方法默認都是public、abstract類型的。
3、接口中只能包含public、static、final類型的成員變量和public、abstract類型的成員方法。
4、接口沒有構造方法,不能被實例化。
5、一個接口不能實現另一個接口,但它可以繼承多個其他接口。
6、接口必須通過類來實現它的抽象方法。
7、與子類繼承抽象父類相似,當類實現了某個接口時,它必須實現接口中所有的抽象方法,否則這個類必須被定義為抽象類。
8、一個類只能繼承一個直接的父類,但能實現多個接口。
接口聲明和實現方式如下:
具體舉例如下:
多態的功能擴展
基於電腦的實例(電腦主板)
擴展(網卡、聲卡、、、)
interface PCI //擴展功能的接口(規則) { public abstract void open(); public abstract void close(); } class MainBoard { public void run() { System.out.println("Mi anBoard run"); } public void usePCI(PCI p) //PCI p = new NetCard() //接口型的引用指向自己的子類對象 { p.open(); p.close(); } } class NetCard implements PCI // 實現網卡的連接 { public void open() { System.out.println("NetCard open"); } public void close() { System.out.println("NetCard close"); } } class SoundCard implements PCI // 實現聲卡的連接 { public void open() { System.out.println("soundcard open"); } public void close() { System.out.println("soundcard close"); } } class DuoTaiDemo1 //測試類 { public static void main(String[] args) { MainBoard mb = new MainBoard(); mb.run(); mb.usePCI(new NetCard()); mb.usePCI(new SoundCard()); } }
1)抽象類可以提供成員方法的實現細節,而接口中只能存在public abstract 方法;
2)抽象類中的成員變量可以是各種類型的,而接口中的成員變量只能是public static final類型的;
3)接口中不能含有靜態代碼塊以及靜態方法,而抽象類可以有靜態代碼塊和靜態方法;
4)一個類只能繼承一個抽象類,而一個類卻可以實現多個接口。
5)抽象類中的方法子類必須全部實現,不然子類也是抽象類,而接口中的抽象方法子類必須全部實現,是可選擇實現的。
6)抽象類是一種模板設計模式,而接口是一種行為規范。