java中的介面是類的藍圖。 它有靜態常數和抽象方法。java中的介面是一種實現抽象的機制。 介面中只有抽象方法而不是方法體。介面用於在Java中實現抽象和多重繼承。
Java介面也表示IS-A關係。它不能像抽象類一樣被範例化。
需要使用介面主要有三個原因。如下面給出。
由於Java 8,介面可以有預設和靜態方法,稍後討論。
由編譯器內部新增
java編譯器在介面方法之前新增public
和abstract
關鍵字。還有,它在資料成員之前新增public
,static
和final
關鍵字。
換句話說,介面欄位預設是public
,static
和final
,方法預設是public
和abstract
。
如下圖所示,一個類擴充套件了另一個類,一個介面擴充套件了另一個介面,一個類實現了一個介面。
Java介面範例
在這個例子中,Printable
介面只有一個方法,它的實現是在A
類中提供的。
interface printable {
void print();
}
class A6 implements printable {
public void print() {
System.out.println("Hello, Interface");
}
public static void main(String args[]) {
A6 obj = new A6();
obj.print();
}
}
上面程式碼執行結果如下 -
Hello, Interface
Java介面範例:Drawable
在這個例子中,Drawable
介面只有一個方法。 它的實現由Rectangle
和Circle
類提供。 在實際情況下,介面由一些開發者定義,但實現由不同的實現提供者提供。 並且它被別人使用。實現部分被使用介面的使用者隱藏。
建立一個 Java 檔案:TestInterface1.java
,其程式碼如下 -
//Interface declaration: by first user
interface Drawable {
void draw();
}
// Implementation: by second user
class Rectangle implements Drawable {
public void draw() {
System.out.println("drawing rectangle");
}
}
class Circle implements Drawable {
public void draw() {
System.out.println("drawing circle");
}
}
// Using interface: by third user
class TestInterface1 {
public static void main(String args[]) {
Drawable d = new Circle();// In real scenario, object is provided by
// method e.g. getDrawable()
d.draw();
}
}
執行上面程式碼得到以下結果 -
drawing circle
Java介面範例:Bank
讓我們來看看另一個提供了Bank
介面實現的java介面的例子。建立一個 Java 檔案:TestInterface2.java
,其程式碼如下 -
interface Bank {
float rateOfInterest();
}
class SBI implements Bank {
public float rateOfInterest() {
return 9.15f;
}
}
class PNB implements Bank {
public float rateOfInterest() {
return 9.7f;
}
}
class TestInterface2 {
public static void main(String[] args) {
Bank b = new SBI();
System.out.println("ROI: " + b.rateOfInterest());
}
}
執行上面程式碼得到以下結果 -
ROI: 9.15
如果一個類實現了多個介面,或者一個介面擴充套件了多個介面,即被稱為多重繼承。
參考以下範例程式碼的實現 -
interface Printable {
void print();
}
interface Showable {
void show();
}
class A7 implements Printable, Showable {
public void print() {
System.out.println("Hello");
}
public void show() {
System.out.println("Welcome");
}
public static void main(String args[]) {
A7 obj = new A7();
obj.print();
obj.show();
}
}
執行上面程式碼得到以下結果 -
Hello
Welcome
問題:在java中不支援通過類實現多繼承,但可通過介面實現,為什麼?
正如在繼承章節中所解釋的,在類中不支援多重繼承是因為模糊。 但是在介面的情況下可以支援,因為介面沒有歧義,介面的具體實現由實現類提供。 例如:
interface Printable {
void print();
}
interface Showable {
void print();
}
class TestTnterface3 implements Printable, Showable {
public void print() {
System.out.println("Hello");
}
public static void main(String args[]) {
TestTnterface1 obj = new TestTnterface1();
obj.print();
}
}
上面程式碼執行得到以下結果 -
Hello
從上面的例子可以看到,Printable
和Showable
介面有相同的方法,但它的實現是由TestTnterface1
類提供的,所以沒有歧義。
類可以實現多個介面,但介面也擴充套件另一個介面。
interface Printable {
void print();
}
interface Showable extends Printable {
void show();
}
class TestInterface4 implements Showable {
public void print() {
System.out.println("Hello");
}
public void show() {
System.out.println("Welcome");
}
public static void main(String args[]) {
TestInterface4 obj = new TestInterface4();
obj.print();
obj.show();
}
}
執行上面程式碼,得到如下結果 -
Hello
Welcome
從Java 8開始,我們可以在介面中有方法體。 但需要使其為預設方法。現在來看看一個例子,建立一個Java檔案:TestInterfaceDefault.java
,其程式碼如下 -
interface Drawable {
void draw();
default void msg() {
System.out.println("default method");
}
}
class Rectangle implements Drawable {
public void draw() {
System.out.println("drawing rectangle");
}
}
class TestInterfaceDefault {
public static void main(String args[]) {
Drawable d = new Rectangle();
d.draw();
d.msg();
}
}
執行上面程式碼,得到如下結果 -
drawing rectangle
default method
從Java 8開始,我們可以在介面中有靜態方法。 讓我們來看看下面的一個例子,建立一個Java檔案:TestInterfaceStatic.java
其程式碼如下:
interface Drawable {
void draw();
static int cube(int x) {
return x * x * x;
}
}
class Rectangle implements Drawable {
public void draw() {
System.out.println("drawing rectangle");
}
}
class TestInterfaceStatic {
public static void main(String args[]) {
Drawable d = new Rectangle();
d.draw();
System.out.println(Drawable.cube(3));
}
}
執行上面程式碼,得到如下結果 -
drawing rectangle
27
問題:什麼是標記或標記的介面?
沒有成員的介面(僅定義一個空的介面)稱為標記或標記介面。 例如:可序列化,可克隆,遠端等。它們用於向JVM提供一些基本資訊,以便JVM可以執行一些有用的操作。
//How Serializable interface is written?
public interface Serializable{
}
Java巢狀介面
注意: 一個介面中可以有另一個介面,即被稱為巢狀介面。有關於這方面的知識,將在巢狀類的章節中詳細學習。 例如:
interface printable {
void print();
interface MessagePrintable {
void msg();
}
}