匿名クラスは、Javaで(スーパークラスで実装されていない)余分なメソッドを許可していません

ピン:

Javaのチュートリアル(でhttps://docs.oracle.com/javase/tutorial/java/javaOO/anonymousclasses.html)私は匿名クラスであなたがスーパークラスで実装されていないメソッドを作成することができることを読みました。しかし、私は次のことを試してみました、それが動作しません。

class Superclass {
}

class Anonymous {
    public void start() {
        Superclass obj = new Superclass() {
            public void myMethod() {
                System.out.println("hello world");
            }
        };

        obj.myMethod();
    }
}

class Main {
    public static void main(String[] args) {
        Anonymous obj = new Anonymous();
        obj.start();
    }
}

可能であれば缶誰もが、私が間違ってやっている時間に感謝を説明します。

アンドレアス:

あなたは匿名クラスの新しいメソッドを作成することができますが、匿名クラス外のコードがさえ方法について知ることができないので、あなたは外からそれを呼び出すことはできません。

ただし、内側からそれを呼び出すことができます。

abstract class Superclass {
    public abstract void doStuff();
}

class Anonymous {
    public void start() {
        Superclass obj = new Superclass() {
            @Override
            public void doStuff() {
                myMethod();
            }
            public void myMethod() {
                System.out.println("hello world");
            }
        };

        obj.doStuff(); // prints: hello world
    }
}

さらに説明するために、匿名クラスは、名前のようなものですローカルクラス。

public void start() {
    class $1 extends Superclass {
        @Override
        public void doStuff() {
            myMethod();
        }
        public void myMethod() {
            System.out.println("hello world");
        }
    };
    Superclass obj = new $1();

    obj.doStuff(); // prints: hello world
}

あなたが見ることができるようにするので、objあるSuperclass、ない$1、あなたは呼び出すことはできませんmyMethod()、あなたが宣言することができないobjように$1、それは匿名であるとき、それは名前がないので、クラス1を

1)内部的には、匿名クラスは、例えば、のようなものの名前を持つAnonymous$1、すなわち外部クラス、ドル記号、数字の名前を、。あなたは、コンパイラが生成してそれらの名前を見ることができます.classファイル。しかし、あなたはそれらの名前を使用してコードを記述することはできません。

おすすめ

転載: http://10.200.1.11:23101/article/api/json?id=397175&siteId=1