接口指的是一種標準、規範。
屬性:只能使用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方法
一樣,是讓接口
自身中的方法使用,並且不將此方法公開出來。