web-dev-qa-db-ja.com

抽象クラスを直接インスタンス化できますか?

抽象クラスを継承することによってのみインスタンス化できるが、直接インスタンス化できないことを読んだことがあります。
ただし、別のクラスのメソッドを呼び出すことで、抽象クラスのタイプのオブジェクトを作成できることがわかりました。
たとえば-LocationProviderは抽象クラスであり、LocationManagerクラスのgetProvider()関数を呼び出すことでインスタンス化できます。

LocationManager lm = getSystemService(Context.LOCATION_PROVIDER);
LocationProvider lp = lm.getProvider("gps");

抽象クラスはどのようにここでインスタンス化されますか?

35
satheesh.droid

抽象クラスを直接インスタンス化することはできませんが、具象クラスがない場合は匿名クラスを作成できます。

public class AbstractTest {
    public static void main(final String... args) {
        final Printer p = new Printer() {
            void printSomethingOther() {
                System.out.println("other");
            }
            @Override
            public void print() {
                super.print();
                System.out.println("world");
                printSomethingOther(); // works fine
            }
        };
        p.print();
        //p.printSomethingOther(); // does not work
    }
}

abstract class Printer {
    public void print() {
        System.out.println("hello");
    }
}

これはインターフェイスでも機能します。

82
kiritsuku

いいえ、抽象クラスをインスタンス化することはできません。それが抽象クラスの目的です。参照しているgetProviderメソッドは、抽象クラスの特定の実装を返します。これは、抽象的なファクトリパターンです。

22
Darin Dimitrov

いいえ、抽象クラスはインスタンス化できません。

5
Prateek Jain

他の人によると、抽象クラスからインスタンス化することはできません。しかし、それを使用する2つの方法が存在します。 1.抽象クラスから拡張する別の非抽象クラスを作成します。したがって、新しいクラスからインスタンス化し、抽象クラスの属性とメソッドを使用できます。

    public class MyCustomClass extends YourAbstractClass {

/// attributes, methods ,...
}
  1. インターフェイスを操作します。
0
Haniyeh Khaksar