0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

Java Gold SE11対策 ネストしたクラスシリーズ①インナークラスについて

Last updated at Posted at 2024-10-06

はじめに

Java Goldの「クラスとインターフェイス」という単元では、
クラス内に定義したクラスを差す「ネストしたクラス」についての問題が出題される。

試験で問われるネストしたクラスには下記の4つがある。

・インナークラス
・staticインナークラス
・ローカルクラス
・匿名クラス

学習していてこれらがどうもごっちゃになり紛らわしい。

そこで、このシリーズではキチンと整理して理解するために、これらについてまとめていく。
現在の自分のようにJava Goldの学習をされる方のお役に立てると嬉しい。

インナークラスとはクラスの中に定義したクラス

まずは、インナークラスの例をみていただきたい。

Outer.java
public class Outer {
    class Inner {
        // 何らかの処理
    }
}

Outerクラスの中にInnerというクラスが存在する。
このInnerクラスのように、クラスの中に定義したクラスを 「インナークラス」 と呼ぶ。

このインナークラスに対して、「外側」にあたるOuterクラスは 「エンクロージングクラス」 と呼ばれる。

インナークラスはメンバとして定義するもの

インナークラスはエンクロージングクラスのメンバ として定義する。
メンバと聞くと、フィールドやメソッドがまず思い浮かぶが、
インナークラスはこれらのように取り扱われるクラスである。

したがって、アクセス修飾子を付けること ができるのだ。
なお、すべて のアクセス修飾子が使える。

【インナークラスを修飾できるアクセス修飾子】

  • public
  • protected
  • private
  • abstract
  • final
  • static

インスタンス化するには

インスタンス化するには、インナークラスを囲う エンクロージングクラスを先にインスタンス化せねばならない
前述の例でいえば、Outerクラスをnewした上で、Innerクラスをnewするのだ。
インナークラスのインスタンス化を行う場合、エンクロージングクラスの参照を用いて、
そのインスタンスへの参照とnew演算子を使ってこれを実施する。

インスタンス化の記述が通常のクラスのインスタンスとは異なっていて、
「外部クラスの型.内部クラスの型 内部クラスの変数 = 外部クラスの変数.new 内部クラスの型()」と記述することでインスタンス化される。

Main.java
public class Main {
    public static void main(String args){
        Outer outerClass = new outer();
        Outer.Inner innerClass = outerClass.new Inner();
    } 
}

これは 「インナークラスはメンバとして定義するもの」 という特徴と関連付けて覚えるといい。メンバとして定義されるフィールド変数やメソッドは、それを定義しているクラスがインスタンス化されていれば利用できない。
インナークラスもメンバとして定義されるものであるためにエンクロージングクラスのインスタンス化が前提となるのだ。

staticフィールドとstaticメソッド

staticインナークラスでない、ただのインナークラスにstaticなフィールド変数やstaticなメソッドを実装すると コンパイルエラー になるので注意。

次回はstaticインナークラスについてまとめる。

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?