當一個抽象類中的方法都是抽象的時候,這時可以將該抽象類用
另一種形式定義和表示褪秀,就是 接口 interface
例如:
abstract class AbsDemo
{
abstract void show1();
abstract void show2();
}
定義接口使用的關鍵字不是class,是interface
對于接口當中常見的成員:而且這些成員都有固定的修飾符媒吗。
全局常量: public static final
抽象方法。public abstract
由此得出結(jié)論,接口中的成員都是公共的權(quán)限. 而且這些修飾符可以不寫锯岖,但是只要在接口中,就會默認帶有這些關鍵字出吹。
注意:最好還是都寫上,增加閱讀性
interface Demo
{
public static final int NUM = 4;
public abstract void show1();
public abstract void show2();
}
可以寫成:
interface Demo
{
int NUM = 4;
void show1();
void show2();
}
**類與類之間是繼承關系趋箩,類與接口直接是實現(xiàn)關系。 **
接口不可以實例化叫确。
實現(xiàn)接口的關鍵字:implements
只能由實現(xiàn)了接口的子類并覆蓋了接口中所有的抽象方法后,該子類才可以實例化飞盆。
否則,這個子類就是一個抽象類吓歇。
class DemoImpl implements /*實現(xiàn)*/Demo
{
public void show1()
{}
public void show2()
{}
}
在java中不直接支持多繼承,因為會出現(xiàn)調(diào)用的不確定性城看。
所以java將多繼承機制進行改良,在java中變成了多實現(xiàn)测柠。
一個類可以實現(xiàn)多個接口。
因為接口沒有方法體轰胁,所以即使不同的接口中有同名的方法,也不會有問題赃阀。
但是如果不同的接口中有同名方法(參數(shù)列表相同的情況下),但是返回值不同榛斯,這是不被允許的,會報錯肖抱。
interface A
{
public void show();
}
interface Z
{
// public int show();//這是不允許的
public int add(int a,int b);
public void show();
}
class Test implements A,Z//多實現(xiàn),
{
public int add(int a,int b)
{
return a+b+3;
}
//這里支持方法的重載
/*public int add(int a,int b蔫敲,int c)
{
return a+b+3;
}
*/
public void show(){}
}
一個類在繼承另一個類的同時,還可以實現(xiàn)多個接口笙僚。
class Q
{
public void method()
{}
}
//抽象類也可以繼承類(或抽象類)和實現(xiàn)接口典鸡,而且可以不實現(xiàn)其中的方法罚攀,(即沒有方法體)
/*abstract*/ class Test2 extends Q implements A,Z//這里的A和Z指上面代碼的類
{
}
接口的出現(xiàn)避免了單繼承的局限性术荤。
接口與接口之間是繼承關系倚喂,而且接口可以多繼承
interface CC
{
void show();
}
interface MM
{
void method();
}
interface QQ extends CC,MM//接口與接口之間是繼承關系瓣戚,而且接口可以多繼承。
{
void function();
}
class WW implements QQ
{
//覆蓋3個方法子库。
public void show(){}
public void method(){}
public void function(){}
}
抽象類和接口的異同點:
相同點:
都是不斷向上抽取而來的。
不同點:
1仑嗅,抽象類需要被繼承,而且只能單繼承仓技。
接口需要被實現(xiàn),而且可以多實現(xiàn)脖捻。
2,抽象類中可以定義抽象方法和非抽象方法郭变,子類繼承后涯保,可以直接使用非抽象方法。
接口中只能定義抽象方法夕春,必須由子類去實現(xiàn)。
3及志,抽象類的繼承,是is a關系速侈,在定義該體系的基本共性內(nèi)容。
接口的實現(xiàn)是** like a** 關系倚搬,在定義體系額外功能。
舉例:
犬按功能分:有導盲犬,搜爆犬捅僵。
abstract class 犬
{
abstract void 吼叫();
}
//abstract class 導盲//繼承無法實現(xiàn)多繼承,所以不能這么寫
interface 導盲//之所以寫一個導盲的接口庙楚,而不直接在導盲犬類直接寫個導盲功能,是應為這樣不具備擴展性馒闷,具備導盲功能的不一定只是導盲犬。
{
abstract void 導盲();
}
class 導盲犬 extends 犬 implements 導盲
{
public void 吼叫()
{
}
public void 導盲(){}
}
特點:
1.接口是對外暴露的規(guī)則
2.接口是程序的功能擴展
3.接口的出現(xiàn)降低耦合性
4.接口可以用來多實現(xiàn)
應用舉例說明:
/*
筆記本電腦使用沛善。
為了擴展筆記本的功能,但日后出現(xiàn)什么功能設備不知道金刁。
定義一個規(guī)則,只要日后出現(xiàn)的設備都符合這個規(guī)則就可以了尤蛮。
規(guī)則在java中就是接口。
*/
interface USB// 暴露的規(guī)則产捞。
{
public void open();
public void close();
}
class BookPC
{
public static void main(String[] args)
{
useUSB(new UPan());//功能擴展了。
useUSB(new UsbMouse());
}
//使用規(guī)則坯临。
public static void useUSB(USB u)//接口類型的引用,用于接收(指向)接口的子類對象看靠。//USB u= new UPan();
{
if(u!=null)
{
u.open();
u.close();
}
}
}
//--------------------------------------------
//一年后。買了一個鼠標和U盤
//實現(xiàn)規(guī)則挟炬。
//這些設備和電腦的耦合性降低了。
class UPan implements USB
{
public void open()
{
System.out.println("upan open");
}
public void close()
{
System.out.println("upan close");
}
}
class UsbMouse implements USB
{
public void open()
{
System.out.println("UsbMouse open");
}
public void close()
{
System.out.println("UsbMouse close");
}
}