---
# System prepended metadata

title: Abstract
tags: [Java]

---

[toc]

https://docs.oracle.com/javase/tutorial/java/IandI/abstract.html

# Abstract
被abstract修飾的class無法直接被實例化, 但可以被繼承。
內可含abstract methods

如果有個子類別繼承某個abstract methods
子類別通常會實作所有父類別的abstract methods,
如果沒有, 子類別也需是`abstract`



```java
abstract class Printer {
    
    abstract void print(String s);

    public void TestOutput() {
        print("testing printer...");
    }
}

class TypeA extends Printer {
    
    @Override
    public void print(String s) {
        System.out.println("[A] " + s);
    }
}

public class Main {
    public static void main(String[] args){
        Printer p = new TypeA();
        p.print("hello"); // [A] hello
        p.TestOutput(); // [A] testing printer...
    }
}
```

# Abstract vs Interface
**什麼時候用什麼?**

- Abstract Class
  - 你的父子類別通常很有關係.
  - 你希望有些成員不是`public`
  - 你想宣告non-static或是non-final fields
- Interface
  - 你的interface與class可以關係不大, 如 "能飛的" -> "飛機", "鳥"
  - 你想指定某個class的行為, 但不在乎他是怎麼實作的
  - 你想使用多重implement
  