1つのJavaプログラムで複数のクラスを宣言できますか?実装方法を解説
1つのJavaプログラムには、2つ以上のクラスを含めることができます。Javaでこれを実現する方法は、主に次の2通りあります。
1つのJavaプログラムで複数のクラスを実装する2つの方法
- ネストクラス(内部クラス)
- 複数の非ネストクラス(独立したクラス)
コンパイラは複数の非ネストクラスをどう扱うのか
以下の例では、Javaプログラムの中に「Computer」と「Laptop」という2つのクラスが定義されています。どちらのクラスにも、それぞれ固有のコンストラクタとメソッドが用意されています。mainメソッド内では、両方のクラスのオブジェクトを生成し、それぞれのメソッドを呼び出すことが可能です。
例
public class Computer {
Computer() {
System.out.println("Constructor of Computer class.");
}
void computer_method() {
System.out.println("Power gone! Shut down your PC soon...");
}
public static void main(String[] args) {
Computer c = new Computer();
Laptop l = new Laptop();
c.computer_method();
l.laptop_method();
}
}
class Laptop {
Laptop() {
System.out.println("Constructor of Laptop class.");
}
void laptop_method() {
System.out.println("99% Battery available.");
}
}
上記のプログラムをコンパイルすると、Computer.class と Laptop.class という2つの.classファイルが生成されます。この方式のメリットは、生成された.classファイルを他のプロジェクトでも再利用でき、コードを再コンパイルする必要がない点です。つまり、生成される.classファイルの数は、コード内に定義されたクラスの数と一致します。
クラスは必要なだけいくつでも作成できますが、1つのファイルに多数のクラスを詰め込むのは推奨されません。コードの可読性が損なわれるためです。実際の開発では、クラスごとに個別のファイルを作成するのがベストプラクティスとされています。
出力結果
Constructor of Computer class. Constructor of Laptop class. Power gone! Shut down your PC soon... 99% Battery available.
コンパイラはネストクラスをどう扱うのか
複数の内部クラス(インナークラス)を持つメインクラスをコンパイルすると、コンパイラは各内部クラスに対して個別の.classファイルを自動的に生成します。
例
// メインクラス
public class Main {
class Test1 { // 内部クラス Test1
}
class Test2 { // 内部クラス Test2
}
public static void main(String [] args) {
new Object() { // 匿名内部クラス 1
};
new Object() { // 匿名内部クラス 2
};
System.out.println("Welcome to Tutorials Point");
}
}
上記のプログラムでは、Mainクラスの中に Test1、Test2、匿名内部クラス1、匿名内部クラス2 の合計4つの内部クラスが定義されています。このクラスをコンパイルすると、以下の.classファイルが生成されます。
- Main.class
- Main$Test1.class
- Main$Test2.class
- Main$1.class
- Main$2.class
「$」以降の名前や番号は、内部クラスを識別するためにコンパイラが自動的に付与したものです。特に匿名クラスには名前がないため、Main$1.class や Main$2.class のように連番で命名されます。
出力結果
Welcome to Tutorials Point
-
Javaの列挙型(enum)は任意のクラスを拡張できる?継承の仕組みを解説
Javaの列挙型(enum)とは列挙型(enum)は、Javaにおいて定数の集合を格納するためのデータ型です。1週間の曜日や1年の月名など、固定された値のグループを扱う際に活用されます。列挙型を定義するには、enumキーワードの後に列挙型の名前を続けて記述します。enum Days { SUNDAY, MONDAY, TUESDAY, WEDNESDAY, THURSDAY, FRIDAY, SATURDAY }配列と同様に、列挙型内の要素(定数)には0から始まる番号が自動的に割り当てられます。上記の例では、各曜日が以下の図のように番号で識別されます。列挙型はクラスとよく似た構造を持ち
-
JavaでJTextFieldにパディングを追加する方法【setMarginの使い方】
JTextFieldはJTextComponentクラスのサブクラスであり、ユーザーが1行形式でテキストを入力できる、Swingの中でも特に重要なコンポーネントの一つです。JTextFieldでは、ユーザーが入力を行う際にActionListenerインターフェースを通じてアクションイベントが発生します。主なメソッドとしては、setText()、getText()、setBorder()、setEnabled()などが挙げられます。 JTextFieldにパディング(内側の余白)を追加したい場合は、JTextComponentクラスが提供するsetMargin(Insets m)メソッドを使用