Javaの列挙型(enum)は任意のクラスを拡張できる?継承の仕組みを解説
Javaの列挙型(enum)とは
列挙型(enum)は、Javaにおいて定数の集合を格納するためのデータ型です。1週間の曜日や1年の月名など、固定された値のグループを扱う際に活用されます。
列挙型を定義するには、enumキーワードの後に列挙型の名前を続けて記述します。
enum Days {
SUNDAY, MONDAY, TUESDAY, WEDNESDAY, THURSDAY, FRIDAY, SATURDAY
}配列と同様に、列挙型内の要素(定数)には0から始まる番号が自動的に割り当てられます。上記の例では、各曜日が以下の図のように番号で識別されます。

列挙型はクラスとよく似た構造を持ち、内部に変数・メソッド・コンストラクタを定義することができます。ただし、列挙型内で許可されているのは具象メソッドのみです。
クラスの拡張は可能か?
結論から言うと、列挙型は任意のクラスを拡張(継承)することはできません。
その理由は、すべての列挙型が内部的にEnumというクラスをすでに継承しているためです。EnumはJavaのすべての列挙型に共通する基底クラスであり、Javaは多重継承をサポートしていないため、列挙型がさらに別のクラスを継承しようとするとコンパイル時エラーが発生します。
例
次のJavaコードでは、Sampleというクラスを定義し、Scootersという列挙型を作成してSampleクラスを継承しようとしています。
import java.util.Scanner;
class Sample {
}
enum Scooters extends Sample {
}出力結果
このコードをコンパイルすると、次のようなコンパイル時エラーが出力されます。
D:\>javac EnumExample.java
EnumExample.java:5: error: '{' expected
enum Scooters extends Sample{
^
EnumExample.java:5: error: ',', '}', or ';' expected
enum Scooters extends Sample{
^
2 errorsまとめ
列挙型は暗黙的にjava.lang.Enumクラスを継承しているため、他のクラスを明示的に拡張することはできません。共通の振る舞いを持たせたい場合は、クラスの継承ではなくインターフェースの実装(implements)を活用するのが一般的な設計手法です。
-
JavaでJTextFieldにパディングを追加する方法【setMarginの使い方】
JTextFieldはJTextComponentクラスのサブクラスであり、ユーザーが1行形式でテキストを入力できる、Swingの中でも特に重要なコンポーネントの一つです。JTextFieldでは、ユーザーが入力を行う際にActionListenerインターフェースを通じてアクションイベントが発生します。主なメソッドとしては、setText()、getText()、setBorder()、setEnabled()などが挙げられます。 JTextFieldにパディング(内側の余白)を追加したい場合は、JTextComponentクラスが提供するsetMargin(Insets m)メソッドを使用
-
Javaのfinalクラスとは?継承を禁止する仕組みと使い方を徹底解説
Javaにおいて、クラスにfinal修飾子を付けて宣言する最大の目的は、そのクラスがサブクラス化(継承)されることを防ぐことです。クラスがfinalとして宣言されると、どのクラスもそのクラスを継承できなくなり、finalクラスの機能や振る舞いを拡張・変更することが不可能になります。finalクラスの基本構文finalクラスの宣言は非常にシンプルです。クラス名の前にfinalキーワードを付けるだけです。public final class Test { // クラスの本体 }このように宣言されたTestクラスに対して、以下のような継承を試みるとコンパイルエラーが発生します。// コンパイ