Java的「介面」可以定義不同類別之間一樣的方法行為,例如飛機跟老鷹都有「飛行」行為,但他們不屬於同一類別,此時就能透過「介面」來定義「飛行」行為。
多重繼承:Java只能單一繼承,但介面可以多重繼承。class Bird extends Animal implements Flyable, Singable{...}
class Person implements Eater, Sleeper {...}
定義規格:介面亦為一種類別,其所有方法皆為抽象方法,子類別需實作介面所有抽象方法;而介面之間可以再繼承。interface Eater { void eat(); }
空介面:沒有定義任何方法的介面,作為標記作用。其中有名的兩個空介面:
//Clonealbe物件複製,說明該類別物件可已使用clone方法複製
class MyClass implements Cloneable{
...
}
//Serializable物件序列化,說明該類別物件可被轉換為位元組序列化
class MyClass implements Serializable{
...
}
型別轉換:繼承原本是將類別視為is a關係,但介面是轉換成「有共同行為」的關係。
interface Flyable{
void fly();
}
class Bird implements Flyable{
public void fly(){
System.out.println("Brind is flying");
}
}
public static void main(String[] args){
Flyable f1 = new Bird();
}
//Bird實作Flyable介面,因此可將Bird實例賦值給Flyable型別變數
降低相依性:某類別實作某介面,只需知道介面方法,降低彼此不同的程式碼相依性。
//定義Sound介面:發聲方法
public interface Sound {
void makeSound();
}
//定義Animal抽象類別,實作Sound介面
public abstract class Animal implements Sound{
public void makeSound(){
System.out.println("Animal makes a sound.");
}
}
//建立動物子類別,因父類別實作Sound介面,故都可使用此方法
public class Dog extends Animal{
...
}
public class Cat extends Animal{
...
}
//另創建Zoo,要讓動物類別發出聲音,使用介面
public class Zoo{
public void makeNoise(Sound animal){ //Sound介面亦為類別
animal.makeSound();
}
}
//Main方法使用
public class Main{
public static void main(String[] args){
Zoo zoo = new Zoo();
Dog dog = new Dog();
Cat cat = new Cat();
Zoo.makeNoise(dog);
Zoo.makeNoise(cat);
}
}
public static final
(會省略)public abstract
(會省略)