接口指的是一種標準、規範。
屬性:只能使用public static final 定義屬性,代表這個屬性 是不可以被修改的。
方法:
抽象方法 ,宣告成public abstract。靜態方法 、默認方法(方法前加上default )。private 方法。定義的方式如下:
interface Flyable {
public static final int MIN_SPEED = 0;
int MAX_SPEED = 100;
public abstract void fly();
}
interface 的規定屬性是無法被更改的,所以屬性前面的public static final 可以省略不寫,它還是會默認屬性都是使用public static final 進行修飾。public abstract 直接將方法寫為抽象方法 。使用類去implements 實作一個interface 的方式:
public class Plane implements Flyable {
@Override
public void fly() {
System.out.println("Plane can fly");
}
}
在class 名稱後面加上implements interface名稱,若是有多個接口,只需要在後面加上, 即可,若是有繼承 的話,則是先寫繼承 再寫接口。
public class A implements B, C {}
public class A extends AA implements B,C {}
接口一樣可以繼承,並且是可以多繼承 ,不像類 是只能夠單繼承 ,並且當類去實作某個多繼承 的接口時,一樣得去將相關的方法 重寫。
接口一樣有多態性,使用方式和sub class 的方式一樣。
public class PlaneTest {
public static void main(String[] args) {
Flyable f1 = new Plane();
f1.fly(); // Plane can fly
}
}
JDK8新增的特性:靜態方法 、預設方法 。
靜態方法靜態方法 :跟class 中一樣,都是使用public static void method(){}; 進行定義。
public interface A {
public static void method() {
System.out.println("Hello");
}
}
public class B implements A {
}
public class BTest {
public static void main(String[] args) {
A.method(); // Hello
// 實作類不可以使用接口中的靜態方法
// B.method();
}
}
💡 實作類不可以使用接口中 的靜態方法 ,只有接口本身可以使用。
預設方法 (default)預設方法 :使用public default void method(){}; 進行定義。
public interface A {
public default void method() {
System.out.println("Hello");
}
}
public class B implements A {
}
public class BTest {
public static void main(String[] args) {
A.method(); // Hello
// 實作類可以使用接口中的預設方法
B.method(); // Hello
}
}
💡不可以同時實作擁有相同方法名稱且參數相同的接口,實作類必須重寫方法,不然會發生接口衝突。
public interface A {
public default method() {}
}
public class B {
public void method() {}
}
public class C extends B implements A {
}
interface:A
super class:B
sub class:C
在上面的情況中,C繼承了B並且實作了A,且A和B中有相同名稱的方法(預設方法),當C使用這個方法時,會優先使用繼承B的方法→類優先原則。
還記得super 嗎? super man 的那個super !
public interface A {
public default void method() {}
}
public class B {
public void method() {}
}
public class C extends B implements A {
public void method() {}
public void method1() {
method(); // 使用自己定義的method
super.method(); // 使用super class中定義的method
A.super.method(); // 使用interface A中定義的method
}
}
JDK9新增的特性:private方法 。
public interface A {
public default method() {}
private void method1() {}
}
跟class 中的private方法 一樣,是讓接口 自身中的方法使用,並且不將此方法公開出來。