Java 自學筆記 03 - Interface & Abstract

Interface & Abstract

OOP 除了有 Encapsulation、Inheritance 與 Polymorphism 三大要素外,InterfaceAbstract 也是 OOP 中的重要概念。

Interface (介面)

因為 java 的 class 不能多重繼承,所以發展出 Interface:

宣告 interface

interface 裡的變數都是 piblicstatic 以及 final
interface 裡的方法則是 public 以及 abstract

1
2
3
4
5
6
7
8
9
10
11
12
13
public interface Listener {
double PI = 3.14149; // 同public static final
void listen(); // 同public abstract
}
public interface Runnalbe {
int PERIOD = 10;
void run(); // 注意這裡只有 (),沒有 {}
}
public interface AnotherRun {
int PERIOD = 20;
void run();
int run(int);
}

Interface 的繼承

Interface 可以多重繼承

1
2
3
4
public interface ActionListener extends Listener {
}
public interface MultiInterface extends Listener, Runnalbe {
}

Class 實作 Interface

相同變數名稱: 用 interfaceA.var 以及 interfaceB.var 區分
相同函數名稱: 實作一次就好

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
public class A implements Listener {
public void listen() {
}
}
public class B implements Listener, Runnable {
public void listen() {
}
public void run() {
}
}
public class C implements MultiInterface {
public void listen() {
}
public void run() {
}
}
public class D extends A implements Runnable, AnotherRun {
public void run() {
}
public int run(int period) {
}
}

Abstarct (抽象)

只有參數宣告,沒有實作的方法,稱為abstract method。

  • 具有 abstract method 的 class 必須宣告為 abstract class。
  • 繼承 abstract class 的子類別必須 override 所有父類別的 abstract method,否則子類別也必須宣告為 abstract class。
  • 實作 Interface A 的 Class 必須實作 A 裡的所有method,否則必須宣告自己為 abstract class。
  • 不能直接 new abstract class,只能 new 其非 abstract class 的子類別。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
public abstract class AbstractExample {
int x;
public void abstract abstractMethod() {
}
public AbstractExample() {
x = 5;
}
}
public class SubClass extends AbstractExample {
public void abstractMethod() { // must override this method, or SubClass be declared as abstract class
x = 10;
}
}
public class Main {
public static void main(String[] argv) {
AbstractExample a = new SubClass(); // correct
a.abstractMethod(); // virtual function, call SubClass's abstractMethod
a = new AbstractExample(); // Compile error, you can't new abstract class
}
}

參考資料

https://programming.im.ncnu.edu.tw/J_index.html