2

これはうまくいきます。

package abstracttest;

public abstract class AbstractClass implements NewInter {

    public abstract void doStuff();

    public void doStuff2() {
        System.out.println("in doStuff2");
    }

    /*
     * public static void main(String a[]) { AbstractClass ab = new
     * AbstractClass() {
     * 
     * @Override public void doStuff() { // TODO Auto-generated method stub
     * System.out.println(" doStuff "); }
     * 
     * @Override public void doInter() { // TODO Auto-generated method stub
     * 
     * } };
     * 
     * ab.doStuff2(); ab.doStuff();
     * 
     * NewInter ni = new NewInter() {
     * 
     * @Override public void doInter() { // TODO Auto-generated method stub
     * System.out.println("do Inter"); }
     * 
     * }; ni.doInter();
     * 
     * AbstractClass ab1 = new AbstractClass(); }
     */

}

interface NewInter {

    String con = "Hell";

    void doInter();
}

class Impl extends AbstractClass {

    @Override
    public void doInter() {
        // TODO Auto-generated method stub

    }

    @Override
    public void doStuff() {
        // TODO Auto-generated method stub

    }

    public static void main(String[] s) {
        AbstractClass ab = new AbstractClass() {

            @Override
            public void doInter() { // TODO Auto-generated method stub
                System.out.println("impl doInter");
            }

            @Override
            public void doStuff() { // TODO Auto-generated method stub
                System.out.println("impl doStuff");
            }

        };
        ab.doInter();
        ab.doStuff();

        NewInter ni1 = new NewInter() {

            @Override
            public void doInter() {
                // TODO Auto-generated method stub

            }
        };
        ni1.doInter();
    }

}

と の両方を抽象クラス内から、abstract classおよびからインスタンス化することができました。 これはどのように可能ですか? 例外が発生することを予期していましたが、呼び出しは正しく機能しました。 誰か現象を説明してくれませんか? 私は混乱しています。interfacemain()class Impl


Java 抽象クラスもインスタンス化できませんが、main() が存在する場合は呼び出すことができます。

これはブログで読みました。どういう意味ですか?

また、抽象クラスのコンストラクターを呼び出す他の方法はありますか? あれば教えてください。

4

2 に答える 2

14

いいえ、それらをインスタンス化しませんでした。インターフェイスを実装するか、抽象クラスを拡張する匿名クラスのみを作成しました。これらの匿名クラスタイプのオブジェクトは、実際にインスタンス化されます。

于 2013-02-20T09:39:35.547 に答える
8

私がこれを行う場合:

new AbstractClass() {
   public void methodToImplement() {
   }
}

抽象クラスから派生した匿名クラスを作成しています。クラス定義には独自のアクセス可能な名前がなく、定義に再度アクセスできないため、これはいわゆる(匿名)です。定義/インスタンス化は一緒に発生します。

AbstractClass ac = new AbstractClass() {
   ...
}

(これはのサブクラスですAbstractClass

これはインターフェイスと抽象クラスの両方で実行できますが、必要なメソッドを適切に実装する必要があることに注意してください。

上記は、多くの場合、コールバック内の内部クラスとして、簡潔な形式で単純なインターフェイス/抽象クラスを実装するために使用されます。詳細については、このSOの質問を参照してください。詳細については、ネストされたクラスのチュートリアルを参照してください。

于 2013-02-20T09:41:13.153 に答える