14

このコードでは、抽象クラスまたは匿名クラスのオブジェクトを作成していますか? 教えてください。私はここで少し混乱しています。

public abstract class AbstractDemo {

    abstract void showMessage();
    abstract int add(int x,int y);

    public int mul(int x,int y){
        return x+y;
    }


    public static void main(String[] args) {
        AbstractDemo ad = new AbstractDemo() {

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

            }

            @Override
            int add(int x, int y) {
                // TODO Auto-generated method stub
                return 0;
            }
        };

        System.out.println(ad.mul(10, 12));
        System.out.println(ad.getClass());
    }

}
4

8 に答える 8

36

抽象クラスを拡張する匿名クラスを作成します。

AbstractDemo以下の抜粋では、その抽象メソッドの実装を拡張して提供しています。

new AbstractDemo() {
    @Override
    void showMessage() {
        // TODO Auto-generated method stub
    }

    @Override
    int add(int x, int y) {
        // TODO Auto-generated method stub
        return 0;
    }
};
于 2013-05-28T07:17:06.500 に答える
9

この短く無害なコードで何が起こったかを次に示します。

AbstractDemo ad = new AbstractDemo() {

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

            }

            @Override
            int add(int x, int y) {
                // TODO Auto-generated method stub
                return 0;
            }
        };
  1. 新しいクラスが定義されました (名前なし、いわゆる匿名クラス)
  2. この新しいクラスはクラスを拡張しAbstractDemoます
  3. の抽象メソッドはAbstractDemo、この新しいクラスでオーバーライドされました
  4. この新しいクラスの新しいインスタンスが作成され、ad変数に割り当てられました

anonymous classesin Javaの詳細については、こちらをご覧ください。

于 2013-05-28T07:19:11.380 に答える
5

抽象クラスのインスタンスを作成することはできません。
抽象クラスを拡張するクラスのインスタンスを作成できます。

抽象クラスの要点は、それが抽象的であるということです。インターフェイスを定義しましたが、実装は定義していません。実装がなければ、クラスをインスタンス化しても意味のある、または有用な結果は得られません。そのクラスのオブジェクトをインスタンス化することが理にかなっている場合は、そもそも抽象クラスを使用したくないだけです。

以下のようなインスタンスに匿名クラスの概念を使用できます。

AbstractDemo abstractDemo  = new AbstractDemo() {
            @Override
            void showMessage() {
                // TODO Auto-generated method stub
            }
            @Override
            int add(int x, int y) {
                // TODO Auto-generated method stub
                return 0;
            }
        }; 
于 2013-05-28T07:18:13.480 に答える
1
@Override // Here
void showMessage() {
    // TODO Auto-generated method stub
}

@Override // here
int add(int x, int y) {
    // TODO Auto-generated method stub
    return 0;
}

まず最初に、instancefor を作成できないことを知っておく必要があります。ここでは、を拡張する のように動作する をabstract class作成しているだけなので、その はあなたの に属します。anonymous classinner classabstract classanonymous class

于 2016-09-27T09:48:39.430 に答える
0

..でオーバーライド abstract methodsしているanonymous classため、オブジェクトを作成できます。下記参照。

        @Override // Here
        void showMessage() {
            // TODO Auto-generated method stub

        }

        @Override // here
        int add(int x, int y) {
            // TODO Auto-generated method stub
            return 0;

実装は、実行中Abstract Classにインスタンス化できます。

于 2013-05-28T07:18:07.933 に答える
0

スタンドアロンの抽象クラスのオブジェクトを作成することはできませんが、匿名の抽象クラス オブジェクトを作成することはできます。これは、その場で実装を提供しているためです。

Java が抽象クラスのオブジェクトを許可しない理由は、メソッドまたは一部のメソッドの実装がないため、不完全なクラスのオブジェクトをどのように持つことができるかということです。しかし、ここでの匿名の方法では、実装を提供しているため、オブジェクトを持つことができます。

インターフェイスと同じケース

 AbstractDemo ad = new AbstractDemo() {

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

            }

            @Override
            int add(int x, int y) {
                // TODO Auto-generated method stub
                return 0;
            }
        };

ここで AbstractDemo クラスは abstract ですが、その実装クラスはオブジェクトを持つことができますので、ここでは匿名クラスコードがコードを実装しているため、オブジェクトを持つことが完全に許可されています。

さらに掘り下げて、以下のコードを参照してください。MyAbstractClass は抽象クラスです。コメント アウトすると、

abstract void play();

Javaはこの抽象クラスのオブジェクトを作成することを許可していますが、そのようにコメントを外すと、そのメソッドに関する実装がないため拒否され、オブジェクトの作成が拒否されます。

abstract class MyAbstractClass {
    private String name;

    public MyAbstractClass(String name)
    {
        this.name = name;
    }

    public String getName(){
        return this.name;
    }
    abstract void play();



}


public class Test2 {

    public static void main(String [] args)
    {
        MyAbstractClass ABC = new MyAbstractClass("name") {
        };

        System.out.println(ABC.getName());
    }

}

コンストラクター呼び出しの後に {} であることを注意深く確認してください。つまり、これ以上実装する必要がないことを意味します。または、メソッドの 1 つ以上をオーバーライドできます。

于 2013-05-28T07:18:43.400 に答える
0

ここでは、抽象クラスの実装を提供しています。オブジェクトを作成するまでに、その実装を提供し、すべての抽象メソッドをオーバーライドしています。具象メソッドのみを持つ抽象クラスの場合。以下の例を参照してください

abstract class MyAbstractClass {
    private String name;

    public MyAbstractClass(String name)
    {
        this.name = name;
    }

    public String getName(){
        return this.name;
    }
}

public class Test {

    public static void main(String [] args)
    {
        MyAbstractClass ABC = new MyAbstractClass("name") {
        };

        System.out.println(ABC.getName());
    }
}

ここでは、 {} のような呼び出しコンストラクターを使用してオブジェクトを作成しているだけです。

  1. 匿名クラスを使用して実装を証明しています。

2.これは、オブジェクトを作成するときに必要な名前のないクラスに他なりません。

  1. はい、実行時に実装を証明することにより、抽象クラスのオブジェクトを作成しています。

4.抽象クラスがコンストラクターを許可する理由のような答えを開きますか? しかし、そのオブジェクトを作成することはできません。

5.抽象クラスに関連するもう1つの質問は、抽象クラスには静的ブロックしか持てないということです.これはどういう意味ですか?

6.オブジェクトを拡張して作成せずに1回だけロードしたいので、静的ブロックのみ。

7.コードをコンパイルした後、すべての具象クラス、抽象クラス、またはインターフェースの .class を取得するために使用します。

8.次の質問はここで発生します なぜ Java 関係者はインターフェイスで静的ブロックを許可しないのですか?

于 2016-02-22T07:02:01.183 に答える
0

AbstractDemo の抽象メソッドが匿名クラスに実装されると、AbstractDemo はもはや抽象的ではなくなります。それは言うのと同じくらい良いです:

Class AbstractDemoImpl extends AbstractDemo {

    void showMessage() {
            // TODO Auto-generated method stub
    }
    int add(int x, int y) {
            // TODO Auto-generated method stub
            return 0;
    }
}
于 2013-05-28T07:22:51.110 に答える