3
abstract class Two {
    Two() {
        System.out.println("Two()");
    }
    Two(String s) {
        System.out.println("Two(String");
    }
    abstract int  display();
}
class One {
    public Two two(String s) {
        return new Two() {          
            public int display() {
                System.out.println("display()");
                return 1;
            }
        };
    }
}
class Ajay {
    public static void main(String ...strings ){
        One one=new One();
        Two two=one.two("ajay");
        System.out.println(two.display());
    }
}

抽象クラスをインスタンス化できないのに、関数 Two two(String s)が抽象クラスTwoのインスタンスを作成できるのはなぜですか????

4

2 に答える 2

10

abstract のインスタンスは作成しませんTwoTwoそれを拡張してインスタンス化する具体的な匿名クラスを作成します。

これは、次のような名前付き内部クラスを使用するのとほぼ同じです。

class One {
    public Two two(String s) {
        return new MyTwo();
    }

    class MyTwo extends Two {
        public int display() {
            System.out.println("display()");
            return 1;
        }
    }
}
于 2011-03-01T12:31:18.757 に答える
2

欠落している関数 display() を実装しているためです。Two の匿名サブクラスを返します。これは、コンパイルされたファイルを見るとわかります。そこには、Two.class を拡張する One$1.class があります。

于 2011-03-01T12:32:37.800 に答える