iT邦幫忙

2024 iThome 鐵人賽

DAY 25
0
自我挑戰組

前端工程師的java學習紀錄系列 第 25

Day25-接口interface

  • 分享至 

  • xImage
  •  

接口指的是一種標準、規範。

屬性:只能使用public static final 定義屬性,代表這個屬性 是不可以被修改的。

方法:

  • JDK8以前:只能使用抽象方法 ,宣告成public abstract
  • JDK8:可以使用靜態方法默認方法(方法前加上default )。
  • JDK9:可以使用private 方法。

定義的方式如下:

interface Flyable {
	public static final int MIN_SPEED = 0;
	
	int MAX_SPEED = 100;
	
	public abstract void fly();
}
  1. 因為interface 的規定屬性是無法被更改的,所以屬性前面的public static final 可以省略不寫,它還是會默認屬性都是使用public static final 進行修飾。
  2. 方法中也是一樣的,可以直接省略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方法 一樣,是讓接口 自身中的方法使用,並且不將此方法公開出來。


上一篇
Day24-抽象、abstract
下一篇
Day26-內部類、匿名類
系列文
前端工程師的java學習紀錄41
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言