webentwicklung-frage-antwort-db.com.de

Warum können wir keine abstrakte Klasse in JAVA instanziieren?

Ich verstehe:

  1. Da die abstrakte Klasse nichts für sich ist, d. H. Ein Fahrzeug, möchten wir aus diesem Grund ein Objekt einer konkreten Implementierung erstellen, z. B. Auto, Fahrrad usw.
  2. Konstruktor einer abstrakten Klasse wird während der Objektverkettung aufgerufen.

  3. Wir können ein Objekt der Abstract-Klasse niemals direkt erstellen, selbst wenn es einen Konstruktor enthält und alle Methoden implementiert sind 

warum ? Ich schaue aus der Perspektive des Compilers, warum Java diese erzwingt?

Vielen Dank 

10
sandejai

Dies ist keine technische Einschränkung, sondern (wie Sie darauf hingewiesen haben) eine logische. Java (und viele andere Sprachen) erzwingen verschiedene Regeln, nicht weil sie nicht gebrochen werden können, sondern weil dies ein absichtlicher Teil der Sprache ist.

10
Eli Iser

Eine abstrakte Klasse ist nicht vollständig! Der Autor hat es als abstrakt markiert, um Ihnen mitzuteilen, dass einige Implementierungen im Code fehlen . Der Autor hat einen Teil der Arbeit erledigt, aber Sie müssen einige Punkte selbst ausfüllen, damit es funktioniert. Mit dem Schlüsselwort abstract wird sichergestellt, dass niemand diese unvollständige Klasse versehentlich initiiert.

Denken Sie daran, ein Auto zu reparieren. Jemand hat die Bremsbeläge entfernt und wird sie am nächsten Tag ersetzen. Um zu verhindern, dass jemand versehentlich dieses Auto fährt (bei dem keine Bremsen installiert sind), installiert der Mechaniker eine Verriegelung am Lenkrad. Es ist eine ausfallsichere Maßnahme.

17
kevin

rocketboy zeigt einige mechanistische Gründe, aber es gibt einen konzeptionellen Grund.

Eine abstrakte Klasse repräsentiert ein abstraktes Konzept. Nehmen Sie Ihr Fahrzeugbeispiel. Sie können kein Fahrzeug bauen, das nicht genauer ist. Sie können eine Reihe von Fahrzeugen haben, die aus den 2004er Begleitfahrzeugen 2004 Corolla und Ford 98 und 1984 CS36 (eine Art Yacht) bestehen können, einer Klasse 4 Glühwürmchen-Klasse für Massenguttransporte (die mit den Stabilisatoren) Nehmen Sie eine davon einzeln und nennen Sie sie ein Fahrzeug, aber Sie können nicht etwas haben, das nur ein Fahrzeug ist, und nicht eines dieser oder ein anderes bestimmtes Fahrzeug.

Abstrakte Klassen repräsentieren solche abstrakten Konzepte wie Fahrzeug. Daher ist die Idee der Instanziierung nicht sinnlich, denn um sie instanziieren zu können, müssen Sie wissen, was Sie instanziieren.

5
Taylor
  1. Wenn eine Klasse mit dem Schlüsselwort abstract markiert ist, wird sie als abstrakte Klasse bezeichnet. Es kann NICHT mit einem neuen Operator instanziiert werden. Eine abstrakte Klasse kann jedoch als Oberklasse-Referenz für das Unterklassenobjekt verwendet werden

  2. Eine Klasse, die NICHT eine abstrakte Klasse ist, wird als konkrete Klasse bezeichnet

  3. Es gibt so viele abstrakte Klassen in der Java-API, und die meisten von ihnen sind in der GUI Library und im Collections Framework enthalten

  4. Eine abstrakte Klasse muss erweitert werden und eine abstrakte Methode muss überschrieben werden

  5. Wenn eine Methode mit dem Schlüsselwort abstract deklariert wird, sollte sie KEIN body haben. Nur es kann Name, Parameter und Rückgabetyp haben, NICHT aber den Body

  6. Wenn Sie eine abstrakte Methode haben, muss die Klasse ebenfalls als abtracr deklariert sein, d. H. Eine konkrete Klasse kann keine abstrakten Methoden haben. Nur eine abstrakte Klasse kann abstrakte Methoden haben

  7. Neben den abstrakten Methoden kann eine abstrakte Klasse auch Instanzmitglieder, Instanzinitialisierer, Konstruktoren, statische Initialisierer und statische Member enthalten. Hier werden die Konstruktoren und der Instanzinitialisierer der abstrakten Klasse aufgerufen, wenn die Unterklasse der abstrakten Klasse instanziiert wird und der statische Initialisierer der abstrakten Klasse aufgerufen wird, wenn die abstrakte Klasse von der JVM geladen wird

  8. Wenn eine konkrete Klasse eine abstrakte Klasse erweitert, muss sie alle abstrakten Methoden der abstrakten Oberklasse überschreiben. Dies wird als Implementierung einer abstrakten Klasse bezeichnet

  9. Für die teilweise Implementierung einer abstrakten Klasse können wir eine abstrakte Unterklasse verwenden, die die abstrakte Superklasse erweitern kann. In dieser Situation überschreibt die Unterklasse alle abstrakten Methoden der abstrakten Oberklasse NICHT. Die teilweise Implementierung einer abstrakten Superklasse oder einer Schnittstelle kann nur von den abstrakten Klassen durchgeführt werden. Eine konkrete Klasse kann NICHT für die teilweise Implementierung einer abstrakten Klasse verwendet werden, da konkrete Klassen KEINE abstrakten Methoden haben können

  10. Abstrakte Klassen und abstrakte Methoden können NICHT mit dem Schlüsselwort final deklariert werden, d. H. Eine Klasse kann abstrakt oder final sein. Ähnlich kann eine Methode abstrakt oder final sein

  11. Abstrakte Methoden können NICHT mit dem Schlüsselwort private deklariert werden

  12. Abstrakte Methoden können NICHT mit dem Schlüsselwort synchronisiert werden. Selbst wenn Sie eine sichere Thread-Methode benötigen, kann die überschriebene Methode während der Implementierung der abstrakten Klasse (wenn die abstrakte Methode durch die Conrete-Unterklasse überschrieben wird) mit dem Schlüsselwort synchronisiert markiert werden

  13. Abstrakte Methoden können NICHT mit dem Schlüsselwort static markiert werden. Da statische Methoden NICHT nur überschrieben werden können, können sie durch die statischen Unterklassenmethoden ausgeblendet werden

  14. Abstrakte Methode kann NICHT mit dem Schlüsselwort native markiert werden

  15. Abstrakte Methode kann NICHT mit dem Schlüsselwort strictfp markiert werden

  16. Daher können nur Sie den Zugriffsmodifizierer (außer private), type und Parameter mit einer abstrakten Methode verwenden

  17. Eine Conrete-Klasse kann NICHT über Instanzmethoden verfügen, aber eine abstrakte Klasse kann über abstrakte Methoden, statische Member, Instanzmitglieder, statische Initialisierer, Konstruktoren und Instanzinitialisierer verfügen

  18. Wenn eine abstrakte Klasse eine Schnittstelle implementiert oder eine andere abstrakte Klasse erweitert, müssen Sie NICHT alle abstrakten Methoden der Schnittstelle überschreiben. Dies ist jedoch NICHT das gleiche wie bei den konkreten Klassen

  19. Es kann auch vorkommen, dass eine abstrakte Klasse KEINE der abstrakten Methoden besitzt

  20. Eine abstrakte Klasse kann NICHT mit einem neuen Operator instanziiert werden. Weil eine Zusammenfassung abstrakte Methoden haben kann, d. H. Methoden ohne Körper (oder Implementierung). Da ein Objekt KEINE abstrakten Methoden haben kann und JVM den Speicher der abstrakten Methoden NICHT zuordnen kann

4
alexvipul

Weil eine abstrakte Klasse eine Skelettstruktur ist (ein unvollständiges Konstrukt, wenn Sie dürfen), daher der Begriff Zusammenfassung.

abstract class Person(){
   abstract void Speak();
}

Bedeutet, dass jeder Person sprechen muss. Das bedeutet, dass jede Person wissen muss, wie man spricht (die speak() implementieren). new Person() kann das nicht haben, also ist es nicht erlaubt.

1
rocketboy

Sie können eine Schnittstelle oder eine abstrakte Klasse nicht instanziieren, da dies dem objektorientierten Modell widersprechen würde. Weiterlesen

1
Sunil S

Was ich verstehe, dass abstrakte Klassen abstrakte (leere Methoden ohne Implementierung) enthalten können. Wenn wir ein Objekt instanziieren und die leere Methode aufrufen, wird es nicht funktionieren und kann zu Problemen führen. Daher erzwingt der Compiler diese RULE.

1
sandejai

Eine abstrakte Klasse ist eine als abstrakt deklarierte Klasse. Es kann abstrakte Methoden enthalten oder nicht. 

Wir müssen abstrakte Klassen und abstrakte Methoden mit dem Schlüsselwort abstrakt deklarieren.

Abstrakte Klassen können nicht instanziiert werden. Dies bedeutet, dass wir kein Objekt für die Abstract-Klasse erstellen können. Wir können Unterklassen für abstrakte Klassen erstellen.

Eine abstrakte Klasse kann abstrakte Methoden haben oder nicht, abstrakte Methoden in dem Sinne, dass eine Methode deklariert werden kann, ohne dass eine Body-Implementierung als abstrakte Methode bezeichnet wird. In diesem Fall weiß die JVM also nicht, wie viel Speicher sie für diese abstrakte Methode reservieren muss, da für die abstrakte Methode keine Rumpfimplementierung vorhanden ist. Daher kann die JVM beim Erstellen der Instanz für die Abstract-Klasse keinen Speicher für die abstrakten Methoden zuordnen. Daher kann JVM die Instanz nicht für die Abstract-Klasse erstellen. Damit wir das Objekt nicht für die Abstract-Klasse erstellen können. 

Es ist auch möglich, dass wir eine Abstract-Klasse mit allen konkreten Methoden erstellen können, dh auch ohne abstrakte Methoden. In diesem Fall können wir auch keine Instanz für die Abstract-Klasse erstellen. Warum, weil das abstrakte Schlüsselwort der JVM einfach anzeigt, dass die Klasse nicht instanziiert werden kann. 

Die Entwickler von Java haben die JVM so erstellt, dass die JVM die Instanz für diese Klasse nicht erstellen kann, wenn sie ein abstraktes Schlüsselwort für eine Klasse findet.

1
Sumedh Tambat

abstract it self sagt: in Gedanken oder als Idee vorhanden, aber keine physische oder konkrete Existenz. In Java-Begriff, abstrakte Schlüsselwortdefinition, wenn abstrakt vor einem Klassennamen steht, teilt JDK der JVM mit, dass dieses Klassenobjekt verworfen werden soll Initiation. Es ist korrekt, abstrakte Klassen können mehrere Konstruktoren haben, jedoch nur für Konstruktorketten. 

1
Rudra

Sie KÖNNEN eine abstrakte Klasse instanziieren. Sie müssen nur eine konkrete Unterklasse angeben. 

0
Srinath Shah

Da eine abstrakte Klasse eine unvollständige Klasse ist (unvollständig in dem Sinne, dass sie abstrakte Methoden ohne Text und Ausgabe enthält), können wir keine Instanz oder ein Objekt erstellen. so wie Sie es für eine Schnittstelle sagen.

0
Sonu patel

ein sehr einfacher Grund, warum jvm das Spiel einschränkt, um abstrakte Klassen und Schnittstellen zu instanziieren. 

Angenommen, der Compiler erlaubt uns, beide ok zu instanziieren. 

Angenommen, meine abstrakte Klasse enthält 5 abstrakte Methode. Nur Methodenprototyp und kein Methodenkörper. 

Wie wir wissen, erzeugt jeder Methodenaufruf einen separaten Stack im Java-Stack-Bereich von jvm Diese Speicherzuweisung erfolgte basierend auf der Methodenstruktur Nach der Ausführung zerstört dieser Stack das Recht.

Wenn meine Methode also keinen Körper enthält, bedeutet dies, wie der Speicher von jvm vorhergesagt werden kann, um diese Methode zuzuordnen 

Zweitens, wenn kein Rumpf bedeutet, dass keine Methode ausgeführt wird, wird sie niemals aus Ihrem Java-Stack-Bereich zerstört. Es besteht die Möglichkeit, dass Sie einen Speicherausfallfehler erhalten. 

Um diese beiden Fälle zu berücksichtigen, beschränken wir uns darauf, sowohl die Schnittstelle als auch die abstrakte Klasse zu instanziieren

0
naila naseem

Sie können eine abstrakte Klasse nicht instanziieren, da sie Ihrer Klasse lediglich eine Struktur verleiht, die sie erweitert.

Und wenn Sie Ihre Klasse initiieren wollen, warum wollen Sie sie dann als abstract definieren?

0
Ankita P.

Da Java eingeschränkt ist, können wir die abstrakte Klasse nicht instanziieren. Weil im Allgemeinen abstraktes Szenario unvollständig bedeutet, können wir keine Objekte aus unvollständigen Dingen machen. Wir müssen die vollständige Implementierung einer abstrakten Klasse in einer konkreten Klasse bereitstellen. Aber wir können das Objekt einer abstrakten Klasse nicht erstellen.

0
Bharti Rawat