2017-12-10 6 views
-1

Ich war durch eine Theorie gekommen, dass abstrakte Klassenmethoden keinen Methodenkörper haben, nur die Methodensignatur. Und obwohl eine Methode in einer Methodendeklaration kein abstraktes Schlüsselwort zugewiesen hat, wird sie in JVM automatisch in ein Abstrakt konvertiert.
Also, wie kommt es, dass diese eat() Methode einen Körper hat und wie kommt es, dass es in Swan Klasse nicht übersteuern kann.Haben abstrakte Klassenmethoden einen Körper oder nicht?

public abstract class Animal { 

    protected int age; 

    public void eat() { 
     System.out.println("Animal is eating"); 
    } 

    public abstract String getName(); 
} 

class Swan extends Animal { 

    public String getName() { 
     return "Swan"; 
    } 
} 
+1

" Ich war durch eine Theorie gekommen, dass abstrakte Klassenmethoden keinen Körper haben. "Wo hast du das gelesen? Wir würden gerne wissen, um diese Quelle zu vermeiden (oder vielleicht haben Sie es falsch verstanden, so dass wir versuchen könnten, es zu klären). Sie haben gerade Gegenbeispiel gepostet, das funktioniert so gut ... – Pshemo

+0

@Phemo Diese Methode hat keinen Körper in der abstrakten Klasse, public abstract String getName(); –

+3

Es gibt einen Unterschied zwischen einer "abstrakten Methode" und einer "Methode in einer abstrakten Klasse". Ihr Beispiel enthält beides. –

Antwort

1

Vom Oracle tutorial:

Abstrakte Klassen im Vergleich zu Schnittstellen sind

Abstrakte Klassen ähnlich wie Schnittstellen. Sie können sie nicht instanziieren und sie können eine Mischung von Methoden enthalten, die mit oder ohne Implementierung deklariert wurden.

Wenn Sie eine Methode definieren, kann sie wie jede andere Superklassenmethode referenziert werden.

+0

Wie kommt dann essen Methode in abstrakte Klasse automatisch überschreiben, wenn Swan-Klasse die Animal-Klasse erweitert? Ist das, weil es eine normale Methode ist? –

+0

'essen()' wird nicht überschrieben. Wenn du 'eat()' nennst würde es in deinem Code die super class Methode aufrufen. Sie können jedoch essen() auch überschreiben, wenn Sie möchten. –

+0

Der Grund, dass essen() in Swan-Klasse überschrieben werden kann, ist, dass Sie die Super-Klasse-Methode richtig überschreiben können? –

0

Ich war durch eine Theorie gekommen, dass abstrakte Klassenmethoden keinen Methodenkörper haben, nur die Methodensignatur.

Das ist nicht eine Theorie ist, ist es eine Tatsache, in den JLS #8.4.3.1 'Abstract methods' angegeben, aber es gilt auch für abstrakte Methoden, nicht für alle Methoden in einer abstrakten Klasse .

Und obwohl eine Methode kein abstraktes Schlüsselwort in einer Methodendeklaration zugewiesen hat, wird sie in JVM automatisch in ein Abstrakt konvertiert.

Nein, tut es nicht. Nichts darüber in der JLS #8.1.1.1 'Abstract classes'.

Wie kommt das essen() -Methode hat einen Körper

Weil es nicht abstrakt ist.

und wie kommt es, dass es nicht in Swan-Klasse zu überschreiben.

Ich weiß nicht, was das bedeutet.

0

Ich hatte eine Theorie, dass abstrakte Klassenmethoden keinen Methodenkörper haben, nur die Methodensignatur.

Wie es passiert, können beide Java-Klassen und Methoden abstrakt sein. Eine abstrakte Methode ist eine Methode, die nur eine Signatur haben darf.

unter anderem eine abstrakte Java-Klasse:

  • abstrakte Methoden enthalten, konkrete Methoden oder beide
  • nicht direkt
  • definiert einen Typ instanziert werden (wie eine Schnittstelle der Fall ist)

Eine konkrete Java-Klasse:

  • kann nicht abstrakte Methoden enthalten (nur konkrete Methoden erlaubt sind)
  • direkt
  • einen Typ definieren kann instanziiert werden, aber Schnittstellen (und manchmal abstrakte Klassen) sind oft besser für diesen Zweck verwendet
Verwandte Themen