九、抽象類與接口
1、系統結構圖(xmind)
——1.抽象類:
——2.接口:
2、tips
——1.抽象類的由來
多個對象都具備相同的功能,但是功能具體內容有所不同,那麼在抽取過程中,只抽取了功能定義,並未抽
取功能主體,那麼只有功能聲明,沒有功能主體的方法稱爲抽象方法。
例如:狼和狗都有吼叫的方法,可是吼叫內容是不一樣的。所以抽象出來的犬科雖然有吼叫功能,但是並不
明確吼叫的細節。
——2.慄
1.需求:
公司中程序員有姓名,工號,薪水,工作內容。
項目經理除了有姓名,工號,薪水,還有獎金,工作內容。
2.分析:
程序員:
屬性:姓名,工號,薪水。
行爲:工作。
經理:
屬性:姓名,工號,薪水,獎金。
行爲:工作。
程序員和經理不存在着直接繼承關係。
但是,程序員和經理卻具有共性內容,可以進行抽取,因爲他們都是公司的僱員。
可以將程序員和經理進行抽取,建立體系。
代碼:
abstract class Employee
{
private String name;
private String id;
private double salary;
//僱員,有名字、id、薪水三個屬性,有work這個行爲
Employee(String name,String id,double salary)
{
this.name = name;
this.id = id;
this.salary = salary;
}
public abstract void work();
}
//程序員繼承僱員,輸入屬於程序員的三個屬性以及他工作code的行爲
class programmer extends Employee
{
programmer(String name,String id,double salary)
{
super(name,id,salary);
}
//重寫work方法
public void work()
{
System.out.println("code..");
}
}
//經理繼承僱員,輸入屬於經理的三個屬性,工作manager的行爲
class manager extends Employee
{
manager(String name,String id,double salary)
{
super(name,id,salary);
}
//重寫work方法
public void work()
{
System.out.println("manager");
}
}
class EmployeeDemo
{
public static void main(String[] args)
{
programmer p = new programmer("wangwu","a1",10000);
p.work();
manager m = new manager("lisi","a2",11000);
m.work();
}
}
運行結果:
——3.接口
1.雖然抽象類中的全局變量和抽象方法的修飾符都可以不用寫,但這樣閱讀性很差,所以最好寫上。
2.類與類之間是繼承關係,類與接口直接是實現關係。
3.接口不可以實例化,能由實現了接口並覆蓋了接口中所有的抽象方法的子類實例化。否則,這個子類就是一個抽象類。
——4.抽象類和接口的異同點
相同點:都是不斷向上抽取而來的。
不同點:
1.抽象類需要被繼承,而且只能單繼承。
接口需要被實現,而且可以多實現。
2.抽象類中可以定義抽象方法和非抽象方法,子類繼承後,可以直接使用非抽象方法。
接口中只能定義抽象方法,必須由子類去實現。
3.抽象類的繼承,是is a關係,定義該體系的基本共性內容。
接口的實現是like a關係。
4.抽象類中能夠將變量和方法私有。
接口中的方法和常量只能是public。
——5.接口實例
/*
筆記本電腦使用:
爲了擴展筆記本的功能,但日後出現什麼功能設備不知道。
因此需要定義一個規則,只要日後出現的設備都符合這個規則即可。
規則在java中就是接口
*/
interface Usb
{
//暴露的原則
public void open();
public void close();
}
class UsbMouse implements Usb
{
public void open()
{
System.out.println("mouse open");
}
public void close()
{
System.out.println("mouse close");
}
}
//實現原則,這些設備和電腦的耦合性降低了
class Upan implements Usb
{
public void open()
{
System.out.println("upan open");
}
public void close()
{
System.out.println("upan close");
}
}
class BookPc
{
public static void main(String[] args)
{
useUsb(new Upan());
}
//使用原則
//接口類型的引用,用於接受(指向)接口的子類對象。
public static void useUsb(Usb u)
{
if(u != null)
{
u.open();
u.close();
}
}
}
運行結果: