Javaでメンバー内部クラスをインスタンス化する2つの方法とルールを解説
あるクラスの中に、メソッドの外側で宣言されたクラスはメンバー内部クラス(Member Inner Class)と呼ばれます。
メンバー内部クラスをインスタンス化する方法は、主に次の2つがあります。
- 外部クラスの内部から呼び出す
- 外部クラスの外部から呼び出す
内部クラスに関するルール
- 外部クラス(内部クラスを含むクラス)は、そのコード内であれば、いくつでも自由に内部クラスのオブジェクトをインスタンス化できます。
- 内部クラスが
publicであり、かつ外部クラスもpublicである場合、まったく無関係な別のクラスからでも内部クラスのインスタンスを作成できます。 - 外部クラスのオブジェクトが生成されても、内部クラスのオブジェクトが自動的に作成されることはありません。
- 内部クラスが
staticである場合、外部クラスのインスタンスなしでインスタンス化できます。それ以外の場合、内部クラスのオブジェクトは必ず外部クラスのインスタンスに紐付ける必要があります。 - 外部クラスからは、内部クラスの
privateメソッドであっても呼び出すことができます。
クラス内部からメンバー内部クラスを呼び出す例
以下の例では、OuterClass の display() メソッドの中から、メンバー内部クラスのメソッドを呼び出しています。
サンプルコード
public class OuterClass {
private int value = 20;
class InnerClass {
void show() {
System.out.println("Value is: " + value);
}
}
void display() {
InnerClass ic = new InnerClass();
ic.show();
}
public static void main(String args[]) {
OuterClass oc = new OuterClass();
oc.display();
}
}実行結果
Value is: 20
このように、同じクラス内であれば、通常のクラスと同じように new InnerClass() と記述するだけで内部クラスをインスタンス化できます。また、内部クラスからは外部クラスの private フィールドである value にも直接アクセスできる点に注目してください。
クラス外部からメンバー内部クラスを呼び出す例
次の例では、OuterClass の外側にある Test クラスから、InnerClass の show() メソッドを呼び出しています。
サンプルコード
class OuterClass {
private int value = 20;
class InnerClass {
void show() {
System.out.println("Value is: " + value);
}
}
}
public class Test {
public static void main(String args[]) {
OuterClass obj = new OuterClass();
OuterClass.InnerClass in = obj.new InnerClass();
in.show();
}
}実行結果
Value is: 20
外部から非staticな内部クラスをインスタンス化する場合は、まず外部クラスのインスタンスを作成し、その参照を使って obj.new InnerClass() という特別な構文で内部クラスのオブジェクトを生成します。これは、非staticな内部クラスが常に外部クラスのインスタンスと結び付いている必要があるためです。
-
JavaでJTextFieldにパディングを追加する方法【setMarginの使い方】
JTextFieldはJTextComponentクラスのサブクラスであり、ユーザーが1行形式でテキストを入力できる、Swingの中でも特に重要なコンポーネントの一つです。JTextFieldでは、ユーザーが入力を行う際にActionListenerインターフェースを通じてアクションイベントが発生します。主なメソッドとしては、setText()、getText()、setBorder()、setEnabled()などが挙げられます。 JTextFieldにパディング(内側の余白)を追加したい場合は、JTextComponentクラスが提供するsetMargin(Insets m)メソッドを使用
-
Javaでサブパッケージを使う方法とは?コンパイルからインポートまで徹底解説
Javaのサブパッケージとは Javaにおけるサブパッケージは、ファイルシステム上のサブディレクトリとよく似た仕組みです。パッケージを階層的に整理することで、多数のクラスやインターフェースを効率よく管理できるようになります。 例として、com.apple.computers というパッケージに Dell.java というソースファイルが含まれている場合、そのファイルは次のような一連のサブディレクトリの中に配置されます。 ....\com\apple\computers\Dell.java コンパイル時の出力ファイルの仕組み コンパイルを実行すると、コンパイラはソースファイル内で定義されているク