はじめに
今回はJavaのインナークラスについて調べました。
JavaGoldの勉強をした際に出てきたので、要点をまとめようと思いました。
ゴール
インナークラスの役割と各インナークラスの違いについて理解する。
インナークラスとは
クラス内に定義されたクラスのことをインナークラスと言います。
インナークラスの役割とは
役割としては、情報隠蔽(カプセル化)を提供します。
公開する情報を最小化することで、想定していなかったような使われ方を防ぐことができます。
インナークラスの種類
インナークラスの種類は大きく以下の4つに分けられます。
・インナークラス:クラスの中に定義したクラス
・staticインナークラス:staticで修飾したインナークラス
・ローカルクラス:メソッド内で定義したクラス
・匿名クラス:ローカルクラスで名前のないクラス
また、4つのクラスと修飾子の関係を下記の表にまとめます。
public | protected | private | abstract | final | static | |
---|---|---|---|---|---|---|
インナークラス | ○ | ○ | ○ | ○ | ○ | × |
staticインナークラス | ○ | ○ | ○ | ○ | ○ | × |
ローカルクラス | × | × | × | ○ | ○ | ○ |
匿名クラス | × | × | × | × | × | × |
使用例
・インナークラス
public class Outer {
class Inner{
public void test(){
System.out.println("インナークラスです");
}
}
public static void main(String[] args){
Outer out = new Outer();
Inner in = out.new Inner();
in.test();
}
}
実行結果
インナークラスです
インナークラスのインスタンスを生成するには、エンクロージングクラス(インナークラスを囲むクラス)のインスタンスを先に生成しておく必要があります。
・staticインナークラス
public class Outer {
public static class Inner{
public void test(){
System.out.println("staticインナークラスです");
}
}
public static void main(String[] args){
Inner in = new Inner();
in.test();
}
}
実行結果
staticインナークラスです
staticインナークラスはエンクロージングクラスのインスタンスがなくてもインスタンス化できます。
・ローカルクラス
public class Sample{
public static void main(String[] args){
test();
}
public static void test(){
class LocalClass{
LocalClass(){
System.out.println("ローカルクラス");
}
}
new LocalClass();
}
}
実行結果
ローカルクラスです
ローカルラスはメソッドの中でクラスを宣言し、そのメソッド内のみで利用します。
ローカルラスの定義は、ローカル変数と同様に、メソッドブロック内に記述します。
・匿名クラス
class Sample{
void test(){
System.out.println("スーパークラスです");
}
}
public class Main {
public static void main(String[] args) {
Sample sp = new Sample(){
void test(){
System.out.println("匿名クラスです");
}
};
sp.test();
}
}
実行結果
匿名クラスです
匿名クラスは、その場限りのサブクラスを定義し、オーバーライドしたメソッドを利用します。
さいごに
インナークラスの役割と各インナークラスの違いについて理解できましたでしょうか?
記事を書く際に、改めて要点をまとめられたので自身にとっても良いアウトプットとなりました。