【Java】内部クラス(インナークラス)の使い方(static class)

本多 農
書いた人 本多 農
侍エンジニア塾ブログは、未経験からWebアプリ開発と仕事獲得をサポートする
侍エンジニア塾のオウンドメディアです。
プログラミング学習を覗き見

こんにちは!侍エンジニア インストラクターの本多です。

みなさんは、クラスの中にクラスを定義することが可能なのはご存知でしょうか?

言葉だけ聞くと「??」となりますよね。

その名も「内部クラスインナークラス)」といいます。

この記事では、

・内部クラスとは何か
・内部クラスの使い方

という基本的な内容から、

・static内部クラスとは何か
・static内部クラスの使い方

といった応用的な内容に関しても解説していきます。

今回は内部クラスについて、わかりやすく解説していきます!

内部クラス(インナークラス)とは

クラスのメンバーはと聞かれて思いつくのは、フィールド変数とメソッドです。

その他にクラスもあるよ、と言われると「??」となりますよね。

クラスの中にクラスを定義する、これを内部クラスインナークラス)といいます。

内部クラスクラスをメンバーと同じように扱うことができます。

メンバーと同じようにprivateprotectedpublicといったアクセスレベルを付与することができます。

また、内部クラスからは同じクラス内のフィールド変数、メソッドを参照することができます。

ですので、あるクラス内のフィールド変数やメソッドにアクセスするクラスを宣言する場合に内部クラスとして宣言します。

あるクラスのフィールド変数やメソッドに別のクラスからアクセスする方法としては、継承してサブクラスを宣言する方法があります。

でも、そこまでしたくないというときに内部クラスを宣言すると便利です。

内部クラスはメソッド内でも宣言することもできます。

その場合、メソッド内のみで機能します。

なお、内部クラスを持つクラスのことを外部クラスといいます。

内部クラスの使い方

内部クラスは一般的なクラスと同じようにインスタンスを生成して使用します。

内部クラスのインスタンスを生成する記述は以下のようになります。

内部クラスのインスタンスを生成するには、まず外部クラスのインスタンスを生成します。

次に外部クラスからドット演算子(「.」)を使ってメソッドと同じように内部クラスを呼び出し、内部クラスのオブジェクトを宣言します。

宣言した内部クラスのオブジェクトに外部クラスのオブジェクトから生成する内部クラスのインスタンスを格納します。

サンプルコードで確認していきましょう。

実行結果:

このサンプルプログラムでは、OuterClassの中に内部クラスInnerClassを宣言しています。

InnerClassを使用するためにまず、OuterClassのインスタンスを生成しています。

次に外部クラスのオブジェクトocから内部クラスのインスタンスを生成し、内部クラスのオブジェクトicに格納しています。

実行結果から、内部クラスから外部クラスにある変数にアクセスできていることがわかります。

あるクラスの変数に別のクラスからアクセスする方法として、継承してサブクラスを宣言する方法もあるのですが、そこまでしたくないというときに内部クラスを宣言すると便利です。

staticな内部クラスの使い方

内部クラスをstaticクラスで宣言する場合はどうなるでしょうか?

その場合は以下のようにインスタンスを生成する記述を変える必要があります。

また、staticな内部クラスから外部クラスの非staticなメンバーにはアクセスできません

ですので、外部クラスのメンバーにアクセスする場合は、外部クラスのメンバーもstaticで宣言する必要があります。

サンプルコードで確認していきましょう。

実行結果:

このサンプルプログラムでは、OuterClassの中に内部クラスInnerClassをstaticで宣言しています。

InnerClassを使用するために、外部クラスから内部クラスを呼び出しインスタンスを生成し、内部クラスのオブジェクトicに格納しています。

staticな内部クラスから外部クラスのフィールド変数にアクセスするために、外部クラスのフィールド変数もstaticで宣言しています。

実行結果から、staticな内部クラスから外部クラスにあるstaticなフィールド変数にアクセスできていることがわかります。

このようにstaticな内部クラスは外部クラスのstaticなメンバーにのみアクセス可能なので、外部クラスのメンバーとの関係性は比較的薄くなり、通常の別のクラスとして宣言した場合に近くなります。

staticな内部クラスの注意点

staticな内部クラスを非staticな内部クラスと同じようにインスタンス化したり、外部クラスの非sutaticなメンバーにアクセスしようとするとエラーが発生するので、注意してください。

インスタンス化の記述について

staticな内部クラスを非staticな内部クラスと同じようにインスタンス化すると、以下のサンプルコードのようにエラーが発生します。

注意してください!

実行結果:

内部クラスをstaticクラスで宣言すると、完全に別のクラスとして扱われるため、エラーになります。

非staticクラスへのアクセスについて

staticな内部クラスから外部クラスの非sutaticなメンバーにアクセスしようとすると、以下のサンプルコードのようにエラーが発生します。

注意してください!

実行結果:

内部クラスから外部クラスのフィールド変数、つまりstaticクラスから非staticクラスの変数へアクセスしようとしています。

Javaでは基本的にstaticからstaticでないもの(インスタンスのフィールド変数やメソッド等)にはアクセスできないという決まりがあります。

クラスについてもっと詳しく知りたい方へ

クラスのさまざまな使い方については、以下の記事にまとめていますので、ぜひ参考にしてくださいね!

static修飾子の使い方総まとめ

static修飾子のいろいろな使い方を次の記事にまとめているので、ぜひ確認してください!

まとめ

ここでは、内部クラスの扱い方や注意点を説明しました。

継承するほどでもないし、かといって別にメソッドを定義するだけでは整理がつかない、といった場合、解決の1つとして内部クラスを使ってみてください。

そして、内部クラスの使い方を忘れた時は、本記事を参考にしてくださいね!

Javaカリキュラム無料公開中!
この記事はJava入門完全攻略ガイド【基礎学習/アプリ開発/仕事獲得】の一部になります。このカリキュラムは、プログラミング入門者が、基礎学習からアプリ開発、さらには仕事獲得まで体系的に学べる内容となっています。

Java学習に必要な情報を一つにまとめていますので効率よくJavaを学ぶことが出来ます。この機会に是非活用していただければと思います。


33歳、未経験だった僕がフリーエンジニアになれた理由
現在フリーランスをされている市川友哉さん。33歳で、プログラミングを学び始め、4ヶ月という短い期間でフリーランスエンジニアとして独立までされた学習ログを余すことなくインタビューさせていただきました。

プログラミングを学習中の方はもちろん、独立をお考えの方まで幅広く活用できる記事になっています。この機会に是非活用していただければと思います。


最短でJavaを習得したい方へ

もし、あなたが、

「難しすぎて学習が全然進まない」
「学習量が膨大でゴールが見えない」
「エラーを解決するのに何日もかかってしまう」

など、プログラミング学習やキャリアに関してお困りであれば、まずは『無料体験レッスン』にお申し込み下さい。

あなたにとって、最適の解決策をご提案させていただきます。

詳しくは下の画像から詳しいサービス内容をご確認ください。

cta_bannar-java1

非常識な結果を出した卒業生

活躍する現役エンジニア

人気記事セレクション

LINEで送る
Pocket

この記事が気に入ったら
いいね!をしてフォローしよう

最新情報をお届けします

書いた人

本多 農

本多 農

関西在住のITエンジニアです。普通の会社に勤務しながら、侍エンジニアのインストラクター、ライターとして活動しています。