Klassen Verwendung abstrakter Klassen

friednoodles

Aktives Mitglied
Ich beschäftige mich gerade mit abstrakten Klassen und habe ein Problem beim Aufrufen dieser.
Das ist meine abstrakte Klasse:
Java:
public abstract class AbstractClass {

    public abstract void abstractMethod();

    public void implementedMethod() {
        System.out.println("-> konkrete Methode aus der abstrakten Klasse");
    }
}
Und hier meine implementierende Klasse
Java:
public class ImplementingClass extends AbstractClass {

    public void abstractMethod() {
        System.out.println("-> abstrakte Methode konkretisiert");
    }

    public void implementedMethod() {
        System.out.println("-> Ich wurde überschrieben!");
    }

}

Und mein Aufruf in der Main:
Java:
        ImplementingClass a = new ImplementingClass();
        AbstractClass b = new ImplementingClass();
        
        a.abstractMethod();
        a.implementedMethod();
        
        b.abstractMethod();    
        b.implementedMethod();

1. Was genau passiert in der zweiten Zeile der Main? Erstelle ich ein Objekt der implementierenden Klasse und weise ihm der Variable b vom Typ der abstrakten Klasse zu? Kann mir jemand den Unterschied zwischen Zeile 1 und 2 der Main erklären?
2. Was ist der unterschied zwischen den Methodenaufrufen mit a.methode(); und b.methode(); ? Es kommen alle vier Konsolenausgaben aus der implementierenden Klasse, aber b.abstractMethod(); scheint erst in die abstrakte Klasse zu gehen?
3. Wie ruft man die konkrete Methode der Abstrakten Klasse auf?
 
Erstelle ich ein Objekt der implementierenden Klasse und weise ihm der Variable b vom Typ der abstrakten Klasse zu?
Ja.

Kann mir jemand den Unterschied zwischen Zeile 1 und 2 der Main erklären?
a hat den statischen Typ ImplementingClass
a hat den statischen Typ AbstractClass.
Beide haben den gleichen dyadischen Typ.
Der Unterscheid ist, dass der Compiler nur den statischen Typ prüft. Auf b kannst du zB nur die Methoden aufrufen, die AbstractClass deklariert.

Was ist der unterschied zwischen den Methodenaufrufen mit a.methode(); und b.methode(); ? Es kommen alle vier Konsolenausgaben aus der implementierenden Klasse,
Keiner. Die Methode ist in AbstractClass deklariert, daher kannst du sie in beiden Fällen aufrufen. Beide male ist es der gleiche Dynamische Typ, daher gleiches Verhalten.

aber b.abstractMethod(); scheint erst in die abstrakte Klasse zu gehen?
Was meinst du damit?

3. Wie ruft man die konkrete Methode der Abstrakten Klasse auf?
Wenn du sie überschreibst von außen gar nicht, nur die überschreibende Klasse kann sie dann mit super.implementedMethod() aufrufen.
 
Was meinst du damit?

Wenn ich in Eclipse mit der Maus über die vier Methoden gehe sticht b.abstractMethod(); farblich heraus. Wenn ich das richtig verstanden habe liegt das daran das abstractMethod(); aus der abstrakten Klasse im Prinzip als Schnittstelle fungiert?

Scheint banal zu sein, aber ich will nur sicher gehen das ich es richtig verstanden habe.
 
Also ich weiss jetzt nicht genau, was Du mit "sticht farblich heraus" meinst. Mein Eclipse zeigt die Funktionen normal an. Lediglich links von den Zeilennummern sehe bei den Funktionen kleine Dreiecke und die haben unterschiedliche Farbe.

Generell ist es bei eclipse meistens so, dass bei allen Anzeigen der Grund angezeigt wird, wenn man mit der Maus drüber geht. Und bei mir kommen dann Popups die besagen "implements AbstractClass.abstractMethod" und "overrides AbstractClass.implementedMethod".

Aber evtl. hast Du eine andere Version von Eclipse oder ein AddOn zeigt etwas mehr an. Aber dann kannst Du bestimmt auch mit der Maus einmal auf die farbliche Markierung gehen um zu sehen, was eclipse Dir da sagen will.
 
Java:
        a.abstractMethod(); //void ImplementingClass.abstractMethod()
        a.implementedMethod(); //void ImplementingClass.implementedMethod()

        b.abstractMethod(); //void AbstractClass.abstractMethod()
        b.implementedMethod(); //void AbstractClass.implementedMethod()

In den Kommentaren steht was auftaucht wenn ich mit der Maus über die Aufrufe gehe.

Beide Objekte a und b wurden mit dem selben dynamischen Typ erstellt und Verhalten sich daher identisch.
Warum besteht dann der folgende Unterschied?

Bei
Java:
b.abstractMethod();
ist ein grüner Punkt mit einem A, was mir vermutlich anzeigen soll das es sich um eine abstrakte Methode handelt.

Bei
Java:
a.abstractMethod();
hat der grüne Punkt kein A, obwohl es sich aber um die selbe abstrakte Methode handelt.

Es will einfach noch nicht Klick machen bei mir...
 
Wichtig ist erst einmal: Was da passiert hast Du soweit verstanden? Unabhängig davon, was Eclipse Dir als Hilfestellung noch zeigen will?

Anscheinend zeigt Dir Eclipse bei Aufrufen noch einmal Details zu der aufgerufenen Funktion an. Und dabei zeigt er Dir den Aufruf der abstrakten Methode auf der abstrakten Klasse farblich etwas anders da. Das wird daran liegen, dass eben AbstractClass.abstractMethod() erst einmal abstract ist.

Die Grünen Punkte / A habe ich im Outline Fenster. Grüner Punkt bedeutet, dass es sich um eine public Methode handelt. A bedeutet, dass die Funktion abstract ist.

Bei a.abstractMethod() ist a doch vom Typ ImplementingClass und abstractMethod ist in ImplementingClass nicht Abstract, daher ist dort kein A.
 
Wichtig ist erst einmal: Was da passiert hast Du soweit verstanden?
Unabhängig davon, was Eclipse Dir als Hilfestellung noch zeigen will?
Ja, soweit hab ich das alles verstanden.

Bei a.abstractMethod() ist a doch vom Typ ImplementingClass und abstractMethod ist in ImplementingClass nicht Abstract, daher ist dort kein A.
Eigentlich ziemlich einfach diese Erklärung, keine Ahnung warum das so lange gedauert hat das zu verstehen.
 
Eigentlich ziemlich einfach diese Erklärung, keine Ahnung warum das so lange gedauert hat das zu verstehen.

Sowas kann gerade am Anfang schnell mal sein. Die modernen Entwicklungsumgebungen bieten so viel an an Unterstützung. Das man da am Anfang leicht verwirrt wird, kann ich sehr gut verstehen. Und ich finde es gut, dass Du das nicht einfach ignorierst sondern direkt hinterfragst!
 

Zurück
Oben