Wann Methode abstract?

Diskutiere Wann Methode abstract? im Java Basics - Anfänger-Themen Bereich.
S

sehrVerzweifelterStudent

Hallo zusammen,
es ist mir auch nach längerer Internet-Recherche nicht ganz klar, wann eine Methode abstrakt sein soll..
1) Kann man generell sagen, dass jede Methode ohne Body abstract ist?
2) Wie sieht es bei Interfaces aus?
3) Hat man eine abstract Methode in einer Klasse, sollte man dann auch die Klasse abstract machen? Falls ja, bei Interfaces auch?
4) Wenn eine Methode static ist, kann sie nicht abstract sein, und andersrum oder? Weil ich soll z.B. in einem Interface X eine Klassenmethode m2() schreiben, ohne Parameter, welches double zurückliefert. Also dachte ich mir erst static double m2(); aber da die Methode ja keinen Body hat muss sei abstract sein? Und somit nicht static, aber es ist doch eine KLASSENmethode gefordert...

LG!
P.S. So generelle Sachen, wie z.B. eine Klasse "Tier", welche Erben "Hund", "Kuh" etc hat, sodass "Tier" abstrakt sein soll, hab ich verstanden. Aber ich muss in der Klausur mit Klassen-/ Interfacenamen "X", "Y" etc. arbeiten, sodass man sich das nicht so einfach herleiten kann..
 
L

LimDul

Die technischen Rahmenbedingungen
* Wenn eine Methode abstrakt ist, darf sie keine Body haben
* Wenn eine Methode nicht abstrakt ist, muss sie einen Body haben
* In einem Interface sind quasi alle Methoden (außer die mit default implementierungen) abstrakt - da muss man das nicht mehr angeben
* Wenn eine Klasse mindestens eine Abstrakte Methode hat, muss die Klasse abstrakt sein
* Von abstrakten Klassen, kann man keine Objekte erzeugen.

Das sind die technischen Rahmenbedingungen. Fachlich gilt:
* Eine Methode ist abstrakt, wenn man in der Schnittstelle der Klasse eine Funktionalität X bereitstellen will, aber keine Implementierung angeben kann oder will. Die Implementierung muss dann in den Ableitungen gemacht werden.
 
T

temi

Eine Klasse muss abstrakt sein, sobald man eine abstrakte Methode hat.
Eine Klasse sollte abstrakt sein, wenn man nicht möchte, dass sie direkt instantiierbar ist (siehe dein Beispiel "Tier").
Eine Methode sollte abstrakt sein, wenn man erreichen möchte, dass der Nutzer der Klasse diese Methode selbst implementieren muss.

Die Gründe für die beiden letzteren Punkte können vielfältig sein. Vielleicht fällt mir noch ein gutes Beispiel ein.
 
W

White_Fox

Mal ein Beispiel für deine Klasse Tier:

Nehmen wir an, jedes Tier soll eine Methode implementieren um Stoffwechselabfallprodukte loszuwerden. Du ergänzt also die Klasse Tier um eine Methode kacken();. Diese Methode soll jetzt zwar für jedes Tier vorhanden sein, daher muß sie in Tier irgendwie deklariert werden. Aber:
  • Ein Hund läßt seinen Haufen da wo er ihn fallenläßt und schert sich nicht mehr drum
  • Eine Katze gräbt erst ein Loch, erledigt ihr Geschäft, schart es danach zu und prüft anschließend sogar, ob es noch unangenehm riecht.
  • Ein Vogel prüft vor dem Abwuf im Flug ob er noch etwas damit treffen kann...
Also wird die Methode kacken() für jedes Tier anders implementiert werden müssen. Dann kannst du die Methode kacken() als abstrakt markieren, dann mußt sich jeder, der eine Klasse von Tier ableitet, selber um die Implementierung kümmern. Aber du kannst trotzdem sicher sein, daß jedes Tier diese Methode anbietet.
 
S

sehrVerzweifelterStudent

Danke schonmal, das hat einiges an Klarheit gebracht :)
Hier jetzt mal eine konkrete Aufgabe:

Schreiben Sie ein public-Interface X, das eine Objektmethode m1 mit Rückgabetyp java.lang.Exception hat, wobei m1 einen double-Parameter n und einen String-Parameter str hat.
Schreiben Sie ein public-InterfaceY, das von X erbt und zusätzlich eine Klassenmethode m2 ohne Parameter hat, die double zurückliefert.
Schreiben Sie eine public-Klasse XY, die X und Methode m1 implementiert. Konkret soll Methode m1 eine Referenz auf ein Objekt vom Typ NullPointerException zurückliefern, das mit Konstruktor ohne Parameter eingerichtet wird. Klasse XY soll ein public-Attribut p vom Typ char haben sowie einen public-Konstruktor ohne Parameter. Der Konstruktor soll p auf den Wert 42 setzen. Weiter soll XY eine protected-Objektmethode m3 mit Ruckgabe true oder false und Parameter xy vom Typ XY haben, aber nicht implementieren.

Hierzu meine Lösung:

//(In der Musterlösung ist weder das Interface, noch m1() abstract, warum?)
public abstract Interface X{
public abstract Exception m1(double n, String str);
}

//(In der Musterlösung ist weder das Interface, noch m2() abstract, warum?)
public Interface Y extends X{
abstract double m2();
}

//(Gleich wie in der Musterlösung, hier plötzlich dann doch abstract.)
abstract public class XY implements X{
public char p;
public XY(){
p=42;
}
Public Exception m1(double n, String str){
return new NullPointerException();
}
abstract protected boolean m3(XY xy);

}
 
W

White_Fox

//(In der Musterlösung ist weder das Interface, noch m1() abstract, warum?)
//(In der Musterlösung ist weder das Interface, noch m2() abstract, warum?)
Ein Interface ist eine rein abstrakte Angelegenheit, du kannst ein Interface nicht instanzieren. Manche gehen soweit daß sie Interface und abstrakte Klasse gleichsetzen (was meiner Meinung nach aber Quatsch ist).
Deswegen wird in einem Interface nichts mehr als abstrakt deklariert: weil das eh klar ist.
 
T

temi

In der Praxis wird man sehr oft Kombinationen aus Interfaces, abstrakten und nicht abstrakten Klassen begegnen. Das Interface legt dabei in der Regel fest, welche Methoden vorhanden sein müssen. In abstrakten Klassen werden gemeinsame Teile implementiert und dann von weiteren Klassen weiter spezifiziert. Schau dir dazu gerne mal die Klassen von Java an, z.B. ArrayList

Deren Vererbungshistorie sieht folgendermaßen aus:

java.lang.Object
java.util.AbstractCollection<E>
java.util.AbstractList<E>
java.util.ArrayList<E>

Und folgende Interfaces werden implementiert:

Serializable, Cloneable, Iterable<E>, Collection<E>, List<E>, RandomAccess
 
T

temi

ein public-InterfaceY, das von X erbt und zusätzlich eine Klassenmethode m2 ohne Parameter hat, die double zurückliefert.
Stolpert noch jemand hier über diese Anforderung?

Das müsste ja eine statische Methode sein, die dann allerdings auch im Interface sowohl einen Body haben als auch einen (anscheinend nicht näher definierten) konkreten Wert zurück liefern müsste.

Wie sieht denn die Musterlösung dazu aus?
 
S

sehrVerzweifelterStudent

Stolpert noch jemand hier über diese Anforderung?

Das müsste ja eine statische Methode sein, die dann allerdings auch im Interface sowohl einen Body haben als auch einen (anscheinend nicht näher definierten) konkreten Wert zurück liefern müsste.

Wie sieht denn die Musterlösung dazu aus?
Genau wie meine Lösung, und ja das hat mich auch verwirrt
 
Thema: 

Wann Methode abstract?

Passende Stellenanzeigen aus deiner Region:
Anzeige

Neue Themen

Anzeige

Anzeige
Oben