sealed と abstract の組み合わせ
出力はどれか。
public class Main {
public static void main(String[] args) {
Payment p = new Cash(500);
System.out.println(p.label());
}
}
abstract sealed class Payment permits Cash, Card {
abstract String label();
}
final class Cash extends Payment {
int yen;
Cash(int yen) { this.yen = yen; }
String label() { return "現金 " + yen; }
}
final class Card extends Payment {
String label() { return "カード"; }
}
- A
現金 500 - B
カード - C コンパイルエラーになる
- D 実行時に例外が発生する
正解と解説を見る
正解: A
- A: p の実体は Cash なので、Cash の label() が呼ばれ 現金 500 になります。
- B: Card の label() は、実体が Card のときだけ呼ばれます。
- C: abstract と sealed は一緒に付けられます。子クラスはどちらも final で、label() も実装しているのでコンパイルできます。
- D: 例外になる処理はありません。
ポイント
- sealed は abstract と組み合わせられます。「サブクラスは Cash か Card のどちらか」という設計を表せます。