##匿名クラスとは
クラス名を指定せず、クラス定義とインスタンス化を一つの式で記述したクラスのこと
クラス名を指定せずインターフェースの実装・メソッドの取り出し、クラスの継承・オーバーライド・メソッドの取り出しができるので、その場のみでメソッドを使いたい場合などに便利
interface Inter{
void methodA();
}
class SuperT{
void methodS() {
System.out.println("Super");
}
}
class OuterT{ //外側クラス
void method1() {
new Inter() { //インターフェースの実装とインスタンス化を同時に行う
public void methodA() {
System.out.println("methodA実装");
}
}.methodA(); //インスタンス化したものからmethodAを呼び出す
}
/*void method2() {
new SuperT() {
void methodS() {
System.out.println("Override");
}
}.methodS();
}*/
}
public class Tokumei {
public static void main(String[] args) {
OuterT ot = new OuterT();
ot.method1();
//ot.method2();
System.out.println("-----SuperT型の変数に代入してから呼び出した場合-----");
SuperT st = new SuperT() { //スーパークラス型の変数に代入
void methodS() {
System.out.println("Override");
}
void methodSub() { //匿名サブクラス独自メソッド
System.out.println("Sub");
}
};
st.methodS();
//st.methodSub(); //スーパークラス型変数では匿名サブクラス独自のメソッドは呼べない
System.out.println("-----直接オブジェクトから呼び出した場合-----");
new SuperT() {
void methodS() {
System.out.println("Override");
}
void methodSub() {
System.out.println("Sub");
}
}.methodSub(); //直接呼ぶことはできる
}
}
###出力結果
methodA実装
-----SuperT型の変数に代入してから呼び出した場合-----
Override
-----直接オブジェクトから呼び出した場合-----
Sub
###ポイント
①クラスを継承する際、匿名サブクラスはメソッドをオーバーライドできる。
②スーパークラスを継承した匿名サブクラスをスーパークラス型の変数に代入してから呼び出すときは、スーパークラス内にあるメソッド(オーバーライドしたものを含む)しか呼び出せない。(仕組みは通常のスーパークラスとサブクラスの時と同じで、変数型によってアクセスできる範囲が変わる。)
③直接オブジェクトから呼び出す場合には、匿名サブクラスに独自に設定したメソッドも呼び出すことができる。