webentwicklung-frage-antwort-db.com.de

So erstellen Sie ein Objekt einer abstrakten Klasse und Schnittstelle

Wie erstelle ich ein Objekt einer abstrakten Klasse und Schnittstelle? Ich weiß, dass wir ein Objekt einer abstrakten Klasse nicht direkt instanziieren können.

16
gautam

Sie können eine abstrakte Klasse oder eine Schnittstelle nicht instanziieren - Sie können eine ihrer Unterklassen/Implementierer instanziieren.

Beispiele dafür sind typisch für die Verwendung von Java Collections.

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

Sie verwenden den Schnittstellentyp List<T> als Typ, aber die Instanz selbst ist ein ArrayList<T>.

13
wkl

Um ein Objekt einer abstrakten Klasse zu erstellen, verwenden Sie new genauso wie das Erstellen von Objekten anderer nicht abstrakter Klassen mit nur einem kleinen Unterschied:

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());
    }

}

Auf dieselbe Weise können Sie ein Objekt vom Schnittstellentyp wie folgt erstellen:

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

Sie können eine Implementierung als anonyme Klasse bereitstellen:

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

Ebenso kann eine anonyme Klasse eine übergeordnete Klasse erweitern, anstatt eine Schnittstelle zu implementieren (sie kann jedoch nicht beide).

4
Dmitri
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
3
maerics

Es gibt zwei Möglichkeiten, dies zu erreichen.

1) Entweder erweitern/implementieren Sie die abstrakte Klasse/Schnittstelle in einer neuen Klasse, erstellen das Objekt dieser neuen Klasse und verwenden dieses Objekt dann je nach Bedarf.

2) Mit dem Compiler können Sie anonyme Objekte der Schnittstellen in Ihrem Code erstellen.

Für zB (new Runnable () {...});

Hoffe das hilft.

Viele Grüße. Mahendra Liya.

3
Mahendra Liya

Sie schreiben eine Klasse, die von der abstrakten Klasse abgeleitet wird, oder implementiert die Schnittstelle und instanziiert diese dann.

"instanziieren" bedeutet "ein Objekt erstellen von".

Sie können also keine direkt erstellen.

Der Zweck von Schnittstellen und abstrakten Klassen besteht darin, das Verhalten einer konkreten Klasse zu beschreiben, die die Schnittstelle implementiert oder die abstrakte Klasse erweitert.

Eine Klasse, die eine Schnittstelle implementiert, kann von anderem Code verwendet werden, der nur über die Schnittstelle Bescheid weiß. Dies hilft Ihnen, die Verantwortlichkeiten zu trennen und sich klar zu machen, was Sie von dem Objekt erwarten. (Der aufrufende Code weiß nur, dass das Objekt alle in der Schnittstelle angegebenen Aktionen ausführen kann; er kennt keine anderen Methoden, die es hat.)

Wenn Sie den Code einer anderen Person verwenden, der eine Fooable erwartet (wobei dies der Name einer Schnittstelle ist), werden Sie nicht wirklich nach einem Objekt einer Fooable-Klasse gefragt (da es nicht wirklich eine solche Klasse gibt). Sie werden nur nach einer Instanz einer Klasse gefragt, die Fooable implementiert, d. H. Sie gibt an, dass sie alle Funktionen in dieser Schnittstelle ausführen kann. Kurz gesagt, etwas, das "Foo'd sein kann".

2
Karl Knechtel

Was Sie wissen, ist richtig. Sie können kein Objekt einer abstrakten Klasse oder Schnittstelle erstellen, da sie eine unvollständige Klasse sind (Schnittstelle wird nicht einmal als Klasse betrachtet.)

Sie können eine Unterklasse abstrakter Klassen implementieren, die natürlich nicht abstrakt sein darf. Für das Interface müssen Sie eine Klasse erstellen, die das Interface implementiert und Körper von Interface-Methoden implementiert.

Hier finden Sie das ursprüngliche Tutorial auf der Oracle-Website, http://download.Oracle.com/javase/tutorial/Java/IandI/abstract.html und http://download.Oracle.com/javase/tutorial/ Java/concepts/interface.html

2
gigadot

NEIN, wir können kein Objekt aus einer Schnittstelle oder einer abstrakten Klasse erstellen, weil

Die Hauptabsicht beim Erstellen eines Objekts besteht darin, die umschlossenen Methoden und Daten zu verwenden. Da das Interface keine konkrete Implementierung hat, können wir dies nicht.

Für die abstrakte Klasse verfügen wir möglicherweise über eine konkrete Methode oder eine abstrakte Methode oder beides .. Es gibt für den API-Entwickler keine Möglichkeit, die Verwendung der Methode einzuschränken, die keine Implementierung hat.

Hoffe hilfe 

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

Nein, Sie erstellen hier nicht die Instanz Ihrer abstrakten Klasse. Sie erstellen stattdessen eine Instanz einer anonymen Unterklasse Ihrer abstrakten Klasse. Dann rufen Sie die Methode in Ihrer abstrakten Klassenreferenz auf, die auf das Unterklassenobjekt verweist.

0
Peraiah Karanam

Sie können die abstrakte Klasse oder eine Schnittstelle nicht instanziieren - Sie können eine ihrer Unterklassen/Implementierer instanziieren

Sie können eine abstrakte Klasse oder ein Interface nicht instanziieren. Sie können nur eine der abgeleiteten Klassen instanziieren.

In deinem Beispiel

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

Sie instanziieren jede Klasse, die Überraschung implementiert

0
AnonDCX