對介面interface我已經仰慕已久,直到今天我才有機會去全面瞭解它,造化弄人,說來始終是自己的錯。
Java不支援多繼承,但它通過另外一種機制實現了類的繼承。那就是介面interface。介面的屬性都是靜態常量,方法都是抽象方法,即沒有給出方法體定義。介面只相當於程式開發的一組協議,凡是需要實現這種特定功能的類,都可以繼承這些屬性和方法的集合。
這樣的介面相當於一個完全沒有實現的類,但它的屬性和方法被某個類繼承時與類之間的繼承是不同的,某個類繼承一個介面實際上是實現被繼承的介面中的抽象方法(編寫方法體,滿足該類的某種特定功能),因此它通過implements來繼承一個介面,統稱實現介面。
1.定義介面
介面是java的一種複合資料型別,是像類的一種結構,可看作一種沒有實現的類,用關鍵字interface定義介面,檔案名稱儲存為介面名.java。
[public]interface介面名稱[extends 父介面名列表]
{
//靜態常量
[public][static][final]資料類型 變數名=常量值;
//抽象方法
[public][abstract][native]傳回值類型 方法名(參數列表);
}
介面中定義的變數均為公有的、靜態、最終的常量,方法也是抽象的和公用的。
2.實現介面
[修飾符]class類名[extends 父類名][implements 介面A,介面B,...]
{
類的成員變數和成員方法;
為介面A中的所有方法編寫方法體,實現介面A;
為介面B中的所有方法編寫方法體,實現介面B;
}
一個類實現介面後,將繼承介面中的所有靜態常量,為該類所用。
一個類實現介面後,如果該類不是一個抽象類別,則該類的類體中必須為介面中的所有抽象方法編寫方法體,因為抽象方法不能存在於非抽象類別中。從而達到繼承和實現介面的目的。
如果實現介面的類是個抽象類別,則介面中的抽象方法可以不被實現。
3.定義介面和實現介面舉例
定義介面AreaInterface,其中有靜態常量pai和求面積的抽象方法area()
//定義介面:AreaInterface.java
public interface AreaInterface
...{
double pai = Math.PI;
double area =();
}
//類Circle實現了AreaInterface介面:Circle.java
public class Circle implements AreaInterface
...{
double r;
public Circle(double x)
...{
r=x;
}
public double area() //實現介面中的抽象方法,求圓面積
...{
return pai * r * r ;
}
public String toString()
...{
retunrn "圓:r=" + r + " area=" + area();
}
}
//類Rectangle實現了AreaInterface介面:Rectangle.java
public class Rectangle implements AreaInterface
...{
double x,y;
public Rectangle(double x,double b)
...{
x=a;y=b;
}
public double area() //實現介面中的抽象方法,求圓面積
...{
return x * y ;
}
public String toString()
...{
retunrn "長方形:x=" + x + ";y=" + y +" area=" + area();
}
}
//測試實現介面後的兩個類:TestInterface.java
public class TestInterface
...{
public class void main (String[] args)
...{
Rectangle R1 = new Rectangle();
Circle C1 = new Circle();
System.out.println("R1" + R1.toString() );
System.out.println("C1" + C1.toString() );
}
}
Java語言中的類庫也定義了大量的介面,對鍵盤的擊鍵時間專門編寫了一個類KeyEvent,在java.awt.event包中。對鍵盤擊鍵事件的相應,Java中專門定義了一個介面KeyListener,在相同的包中,介面中有三個抽象方法:
public abstract void keyPressed(KeyEvent); //鍵按下時執行
public abstract void keyReleased(KeyEvent); //鍵釋放時執行
public abstract void keyTyped(KeyEvent); //鍵按下並釋放後執行