web-dev-qa-db-ja.com

抽象クラスとインターフェースのオブジェクトを作成する方法

抽象クラスとインターフェイスのオブジェクトを作成するにはどうすればよいですか?抽象クラスのオブジェクトを直接インスタンス化できないことはわかっています。

16
gautam

抽象クラスまたはインターフェースをインスタンス化することはできません-サブクラス/インプリメンターの1つをインスタンス化できます。

そのようなものの例は、Javaコレクションの使用において典型的です。

List<String> stringList = new ArrayList<String>();

タイプとしてインターフェースタイプList<T>を使用していますが、インスタンス自体はArrayList<T>です。

14
wkl

抽象クラスのオブジェクトを作成するには、次のように、newを使用して、他の非抽象クラスのオブジェクトを作成する場合と同じように、わずかな違いを1つだけ追加します。

package com.my.test;

public abstract class MyAbstractClass {
    private String name;

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

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


}

package com.my.test;

public class MyTestClass {

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

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

}

同様に、次のように、インターフェイスタイプのオブジェクトを作成できます。

package com.my.test;

public interface MyInterface {

    void doSome();
    public abstract void go();

}

package com.my.test;

public class MyTestClass {

    public static void main(String [] args)
    {

        MyInterface myInterface = new MyInterface() {

            @Override
            public void go() {
                System.out.println("Go ...");

            }

            @Override
            public void doSome() {
                System.out.println("Do ...");

            }
        };

        myInterface.doSome();
        myInterface.go();
    }

}
9
Marcin
public abstract class Foo { public abstract void foo(); }
public interface Bar { public void bar(); }
public class Winner extends Foo implements Bar {
  @Override public void foo() { }
  @Override public void bar() { }
}
new Winner(); // OK
4
maerics

実装は匿名クラスとして提供できます。

new SomeInterface() {
    public void foo(){
      // an implementation of an interface method
    }
};

同様に、匿名クラスは、インターフェースを実装する代わりに親クラスを拡張できます(ただし、両方を行うことはできません)。

4
Dmitri

これを実現する方法は2つあります。

1)新しいクラスで抽象クラス/インターフェースを拡張/実装し、この新しいクラスのオブジェクトを作成してから、必要に応じてこのオブジェクトを使用します。

2)コンパイラーを使用すると、コード内にインターフェースの匿名オブジェクトを作成できます。

たとえば(新しいRunnable(){...});

お役に立てれば。

よろしく、Mahendra Liya。

4
Mahendra Liya

「インスタンス化」は「オブジェクトを作成する」を意味します。

したがって、直接作成することはできません。

インターフェイスと抽象クラスの目的は、インターフェイスを実装するか、抽象クラスを拡張するいくつかの具象クラスの動作を説明することです。

インターフェースを実装するクラスは、インターフェースのみを知っている他のコードで使用できます。これにより、責任を分離し、オブジェクトから必要なものを明確にすることができます。 (呼び出し側のコードは、オブジェクトがインターフェイスで指定されたすべてのことを実行できることだけを認識します。他のメソッドについては認識しません。)

Fooable(これはインターフェイスの名前です)を期待する他の誰かのコードを使用している場合、実際にはそのようなクラスがないため、Fooableクラスのオブジェクトを要求されることはありません。 )。 Fooableを実装するいくつかのクラスのインスタンス、つまりそのインターフェイスですべてのことを実行できることを宣言するインスタンスを要求されるだけです。要するに、「Foo'dできる」もの。

3
Karl Knechtel

抽象クラスから派生するクラス、またはインターフェースを実装するクラスを記述し、それをインスタンス化します。

抽象クラスまたはインターフェースをインスタンス化することはできません-サブクラス/インプリメンターのいずれかをインスタンス化できます

抽象クラスや、派生クラスの1つだけをインスタンス化できるインターフェイスをインスタンス化することはできません。

あなたの例では

 MyAbstractClass ABC = new MyAbstractClass("name") {
    };

Suprisingを実装するクラスをインスタンス化している

2
AnonDCX

あなたが知っていることは正しいです。抽象クラスまたはインターフェースのオブジェクトは、不完全なクラスであるため作成できません(インターフェースはクラスと見なされていません)。

あなたができることは、もちろん抽象クラスであってはならない抽象クラスのサブクラスを実装することです。インターフェースの場合、インターフェースを実装し、インターフェースメソッドの本体を実装するクラスを作成する必要があります。

Oracleサイトの元のチュートリアル http://download.Oracle.com/javase/tutorial/Java/IandI/abstract.htmlhttp://download.Oracle.com /javase/tutorial/Java/concepts/interface.html

2
gigadot

いいえ、インターフェースまたは抽象クラスからオブジェクトを作成することはできません。

オブジェクトを作成する主な目的は、ラップされたメソッドとデータを利用することです。インターフェースには具体的な実装がないため、できません。

抽象クラスの場合、具象メソッドまたは抽象メソッド、あるいはその両方を使用できます。 API開発者が実装を持たないメソッドの使用を制限する方法はありません。

助けを願っています。

1
tsingh
public abstract class AbstractClass { ... }

public interface InterfaceClass { ... }

// This is the concrete class that extends the abstract class above and
// implements the interface above.  You will have to make sure that you implement
// any abstract methods from the AbstractClass and implement all method definitions
// from the InterfaceClass
public class Foo extends AbstractClass implements InterfaceClass { ... }
1
digiarnie

いいえ、ここでは抽象クラスのインスタンスを作成していません。むしろ、抽象クラスの匿名サブクラスのインスタンスを作成しています。そして、サブクラスオブジェクトを指す抽象クラス参照でメソッドを呼び出しています。

0
Peraiah Karanam