在Java中,接口和抽象是兩種常見的抽象類型。它們都可以用來定義一些規(guī)范或者協(xié)議,讓其它類來實(shí)現(xiàn)或繼承,以達(dá)到代碼復(fù)用的目的。
接口是一種純粹的抽象類型,它只定義了一些方法的簽名,沒有任何實(shí)現(xiàn)體。下面是一個(gè)例子:
public interface Drawable { void draw(); }
在上面的例子中,我們定義了一個(gè)Drawable接口,它只有一個(gè)方法draw(),沒有實(shí)現(xiàn)。其它類如果想要實(shí)現(xiàn)Drawable接口,就必須要實(shí)現(xiàn)draw()方法,否則編譯會報(bào)錯(cuò)。
抽象則是在一定程度上已經(jīng)實(shí)現(xiàn)了,但仍然不是完整的類。我們通常會將一些通用的實(shí)現(xiàn)放到抽象類里面,讓子類來繼承并覆蓋其中的一些實(shí)現(xiàn)。下面是一個(gè)例子:
public abstract class Shape { protected int x; protected int y; public Shape(int x, int y) { this.x = x; this.y = y; } public abstract void draw(); }
在上面的例子中,我們定義了一個(gè)Shape抽象類,它包含了x和y兩個(gè)成員變量,以及一個(gè)構(gòu)造函數(shù)和一個(gè)抽象方法draw()。Shape抽象類中并沒有實(shí)現(xiàn)draw()方法,因?yàn)槊總€(gè)Shape的子類都有可能有自己的繪制方式,所以由子類來實(shí)現(xiàn)這個(gè)方法。