Klassen und Vererbung

maddin86

Mitglied
Angenommen ich habe folgende Klassen definiert:

Java:
class K1
{
int n = 1;
public int f(int a)
{ return a + n; }
}

Java:
class K2 extends K1
{
int n = 2;
public int f()
{ return n; }
}

Java:
class K3 extends K2
{
int n = 3;
public int f(int a)
{ return 2*a + n; }
}

Was von dem folgenden ist dann korrekt, und falls korrekt, welchen Wert hat s:

1)
Java:
K1 k = new K3(); int s = k.f(1) + 100*k.n;
2)
Java:
K2 k = new K3(); int s = k.f(1) + 100*k.n;
3)
Java:
K3 k = new K3(); int s = k.f(1) + 100*k.n;
4)
Java:
K1 k = new K2(); int s = k.f(1) + 100*k.n;
5)
Java:
K1 k = new K2(); int s = k.f() + 100*k.n;
6)
Java:
K2 k = new K2(); int s = k.f(1) + 100*k.n;
7)
Java:
K3 k = new K2(); int s = k.f(1) + 100*k.n;

Kann mir das mal einer erklären? Ich versteh das absolut nicht ???:L
 

Michael...

Top Contributor
Probier's doch einfach aus. Statt die Zeilen hier reinzuschreiben, hättest Du sie auch in ein IDE schreiben können ;-)
Was auf jeden Fall nicht geht ist Nr 7)
Java:
K3 k = new K2(); ...
Eine Zuweisung der Superklasse an ein Objekt der Subklasse ist nicht möglich - geht nur umgekehrt.

Nr 5) geht auch nicht
Java:
K1 k = new K2(); int s = k.f()...
da die Klasse K1 keine Methode f() besitzt

und was bei den anderen Varianten für s rauskommt kann man, wie gesagt, ausprobieren oder durch nachdenken herausfinden. Letzteres fördert eher das Verständnis zum Thema Vererbung ;-)
 

maddin86

Mitglied
Ich würde aber gerne verstehen warum das nicht geht bzw. warum das herauskommt, was herauskommt.
Ich habe gehofft das könnte mir hier jemand erläutern.
 

Michael...

Top Contributor
Warum das (Nr 5 und 7) nicht geht hab ich ja oben geschrieben. Bei
Java:
K1 k = new K3(); int s = k.f(1) + 100*k.n;
wird ein Objekt vom Typ K1 erzeugt - allerdings via Konstruktor K3. K3 überschreibt die Methode f(int a) von K1
--> k.n = 1 (da in K1 n=1) --> 100*k.n = 100
--> f(1) = 5 (da in K3 return 2*a+n)
--> s = 105

Vernünftig erklären kann ich das nicht - bin nicht vom Fach. Es liegt daran, dass beim Kompilieren festgelegt wird welche Attribute und Methoden aufgerufen werden.
Für den Kompiler ist k vom Typ K1, es wird quasi festgelegt, dass für k.n das Attribut n der Klasse K1 verwendet wird. Für k.f(1) wird festgelegt, dass am Objekt k eine Methode f aufgerufen wird die einen int als Übergabeparameter erwartet. Hier wird nicht die konkrete Methode festgelegt, sondern nur gesagt wie die Methode ausschaut, die aufgerufen werden soll. Durch das new K3() wird allerdings die Methode von K1 zur Laufzeit durch die Methode f(int a) aus K3 überladen, dadurch wird letztendlich zur Laufzeit n aus K1 benutzt und f(int a) aus K3.
Hoffe ich konnte das in meiner Laiensprache vernünftig ausdrücken.
Vielleicht findet sich hier auch ein Informatiker der das genauer/korrekt erklären kann.
 
S

SlaterB

Gast
> Ich habe gehofft das könnte mir hier jemand erläutern.

fang doch selber an, pro Fall einzeln:
1. vermuten
2. testen
3. fragen wenn du ein Ergebnis/ Compilerfehler nicht verstehst,

und nein, 'was ist K1 k = new K3(); ?' zählt dabei nicht als sinnvolle Frage,

eher: 'K3 erbt doch von K1, wieso kann ich ein neues K3-Objekt nicht in einer K1-Variablen speichern, die Fehlermeldung 'xy' ist mir dazu unverständlich'
(hypothetisches Beispiel)
 

maddin86

Mitglied
Also, als erstes achte ich darauf, dass ein Objekt k des Typs der Subklasse (z.B. K3) keine Zuweisung an eine Superklasse (z.B. K1 oder K2) erhält, richtig?

D.h.

Java:
K3 k = new K1();
geht nicht
Java:
K3 k = new K2();
geht nicht
Java:
K3 k = new K3();
geht
Java:
K1 k = new K3();
geht
Java:
K2 k = new K3();
geht
Java:
K2 k = new K1();
geht nicht

richtig?

1)
Java:
K1 k = new K3(); int s = k.f(1) + 100*k.n;
geht, s = 5+100 = 105
2)
Java:
K2 k = new K3(); int s = k.f(1) + 100*k.n;
geht, s = 5+200 = 205
3)
Java:
K3 k = new K3(); int s = k.f(1) + 100*k.n;
geht, s = 5+300 = 305
4)
Java:
K1 k = new K2(); int s = k.f(1) + 100*k.n;
geht nicht, da K2 keinen Parameter bei f() hat?
5)
Java:
K1 k = new K2(); int s = k.f() + 100*k.n;
geht, s = 2+100 = 102
6)
Java:
K2 k = new K2(); int s = k.f(1) + 100*k.n;
geht nicht, da K2 keinen Parameter bei f() hat?
7)
Java:
K3 k = new K2(); int s = k.f(1) + 100*k.n;
geht nicht, da Objekt von Typ der Subklasse (K3) Zuweisung an Superklasse (K2) erhält?
 
S

SlaterB

Gast
Also, als erstes achte ich darauf, dass ein Objekt k des Typs der Subklasse (z.B. K3) keine Zuweisung an eine Superklasse (z.B. K1 oder K2) erhält, richtig?
einem Objekt wird nichts zugewiesen, einer Variablen,
aber im Grunde richtiger Gedanke

D.h.
[..]
richtig?
nicht gerade die Liste der Aufgabenstellung, aber richtig, ist ja ein einfaches Prinzip

-----
ob nun alle ausgerechneten Zahlen einzeln stimmen werde ich für dich nicht schreiben,
das kann ein Computer machen..

4)
Java:
K1 k = new K2(); int s = k.f(1) + 100*k.n;
geht nicht, da K2 keinen Parameter bei f() hat?
k ist vom Typ K1, dass es überhaupt eine Klasse K2 gibt ist bei der Berechnung absolut irrelevant,
und selbst wenn k von Typ K2 wäre, wie bei 6.), so ist die Methode f mit Parameter immer noch vorhanden, von K1 geerbt, die verschwindet nicht

7)
Java:
K3 k = new K2(); int s = k.f(1) + 100*k.n;
geht nicht, da Objekt von Typ der Subklasse (K3) Zuweisung an Superklasse (K2) erhält?
stimmt
 

Landei

Top Contributor
ich glaube ich habs noch immer nicht verstanden :(

Ich denke, was du nicht verstehst, ist der Unterschied zwischen dem Typ des Objekts, das in der Variablen "drinsteckt" (auf das sie referenziert) und dem Typ der Variable selbst.

Java:
K1 k1 = new K2();

Die Regel ist, das etwas spezielleres "drinstecken" darf, als der Typ der Variablen vermuten lässt. Im wirklichen Leben wäre das sowas wie

Java:
Tee tee = new KamillenTee();

Nun ist Java eine statisch getypte Sprache, das heißt schon wärend des Compilierens wird die Typsicherheit geprüft. Der Compiler kann nur von "Tee" ausgehen, und nicht von "KamillenTee", denn drei Zeilen weiter kann ja jemand schreiben

Java:
tee = new HagebuttenTee();

Bei allen Berechnungen kann also immer nur von "Tee" ausgegangen werden. Wenn Tee keine Methode "minutenZumZiehen" hat, Pech gehabt, egal was in den Unterklassen implementiert ist. Aber wenn er eine hat (ob nun in Tee implementiert oder dort abstrakt und nur in den einzelnen Teesorten implementiert, oder eine default-Implementierung in Tee, die in den Sorten eventuell überschrieben wird - völlig schnuppe), kann der Compiler sicher sein, dass

Java:
int minuten = tee.minutenZumZiehen();

"in Ordnung" ist. Und jetzt schau dir mal dein Beispiel damit im Hinterkopf an.
 

maddin86

Mitglied
Was ich noch nicht verstanden habe:

1)
Java:
K1 k = new K3(); int s = k.f(1) + 100*k.n;
geht, s = 5+100 = 105

warum wird hier k.f(1) aus K3 genommen und k.n aus K1 ?

4)
Java:
K1 k = new K2(); int s = k.f(1) + 100*k.n;
geht, s = 2+100 = 102

warum wird hier beides aus K1 genommen? k.f(1) aus K1 weil f() in K2 keinen Parameter hat, richtig?
 
S

SlaterB

Gast
Attribute werden in der Tat nicht durch Subklassen überschrieben/ überdeckt,
deshalb sollte man die quasi nie nach außen verwenden (von ganz simplen Datenklassen abgesehen, um Unmengen getter/ setter zu vermeiden)

und eine Methode mit anderen Parametern hat wenig Einfluss auf andere Methoden, richtig
 

maddin86

Mitglied
D.h. also, die Methode f(int a) in K1 wird durch f() in K2 "ergänzt" aber durch f(int a) in K3 überschrieben?
Das Attribut int n = 1 wird aber weder durch int n = 2 in K2 noch durch int n = 3 in K3 "überschrieben" wenn k vom Typ K1 ist?

Also:

Java:
K1 k = new K3();

hier wird int n = 1 in K1 nicht von int n = 3 in K3 überschreiben, da es ein Attribut ist.
Aber f(int a) aus K1 wird von f(int a) aus K3 überschrieben, da es eine Methode mit identischer Parameterliste ist?

Wohingegen:

Java:
K1 k = new K2();

hier int n = 1 in K1 nicht von int n = 2 in K2 überschreiben wird, da es ein Attribut ist.
Aber f(int a) aus K1 wird von f() aus K2 nicht überschrieben, da es eine Methode mit anderer (leerer) Parameterliste ist?
 
S

SlaterB

Gast
stimmt alles

'ergänzen' drückt vielleicht noch eine nichtgegebene Nähe aus,
zu f(int) ist f() genauso nahe wie sort(List), also was völlig anderes, gleicher Methodenname hat für sich keine tiefere Bedeutung
 

maddin86

Mitglied
Schon mal vielen vielen Dank, das hat mich weiter gebracht! :)

Wenn ich jetzt noch verstehe (gut erklärt bekomme :D) warum

5)
Java:
K1 k = new K2(); int s = k.f() + 100*k.n;

nicht geht, dann hab ich es glaube ich gecheckt.

Also mein Gedankengang:

Die Variable k vom Typ K1 ist ein Objekt von K2. Stimmt das genau so ? Wie könnte man das "besser" formulieren?

Ich würde jetzt weiter vermuten (was falsch ist):

Die Methode f() ist in K2 definiert also ist k.f() = 2 (Das ist offensichtlich falsch)
Das Attribut n = 1 aus K1 wird nicht von n = 2 aus K2 überschreiben --> 100*k.n = 100 (Das müsste stimmen)

Ist die Methode f() aus K2 irrelevant da die Variable k vom Typ K1 ist?

Warum ist dann bei 1) k.f(1) = 5 (aus K3) ??
 
S

SlaterB

Gast
> Die Methode f() ist in K2 definiert also ist k.f() = 2 (Das ist offensichtlich falsch)

wieso ist das offensichtlich falsch, kommt bei dir ein anderer Wert raus?
richtig ist das k als K1 angesehen wird und es die Methode f() damit nicht gibt (in K1)

> Ist die Methode f() aus K2 irrelevant da die Variable k vom Typ K1 ist?

eben

> Warum ist dann bei 1) k.f(1) = 5 (aus K3) ??

Methoden mit gleicher Signatur dürften in Unterklassen überschrieben werden und werden dann statt der Methode der Oberklasse verwendet,
das ist die Grundlage der Polymorphie, ohne das ginge ja gar nix
 
Ähnliche Java Themen
  Titel Forum Antworten Datum
D Klassen und Vererbung Java Basics - Anfänger-Themen 2
A Vererbung Klassen im Bezug auf Auto´s Java Basics - Anfänger-Themen 18
A Klassen Vererbung und zusätzliche Unterklassen Java Basics - Anfänger-Themen 23
A Vererbung bei Klassen mit Objekt der Klasse im Konstruktor Java Basics - Anfänger-Themen 4
F Vererbung von Attributen zwischen zwei Klassen Java Basics - Anfänger-Themen 6
J Vererbung Hilfe zu Klassen / Vererbung Java Basics - Anfänger-Themen 12
K Vererbung equals-Methode bei Vererbung abstrakter Klassen Java Basics - Anfänger-Themen 8
J Klassen, Unterklassen, Vererbung - Compilerfehler Java Basics - Anfänger-Themen 11
Y Klassen, Vererbung, Konstruktoren Java Basics - Anfänger-Themen 13
T Vererbung und Zugriff auf Methoden von abgeleiteten Klassen Java Basics - Anfänger-Themen 2
L Vererbung - Wie Objekte verschiedener Klassen unterscheiden Java Basics - Anfänger-Themen 3
berliner Klassen Vererbung und Zugriff auf innere private Variable Java Basics - Anfänger-Themen 22
D Zusammenfassung von Klassen (Vererbung? Abstrakte Klass? ...?) Java Basics - Anfänger-Themen 8
N Klassen Vererbung aus KlassenBibliothek (jar) Java Basics - Anfänger-Themen 3
C Klassen/Vererbung/Exception Java Basics - Anfänger-Themen 2
L Klassen/Methoden/Objekt/Vererbung Java Basics - Anfänger-Themen 6
frau-u Problem mit Klassen und Vererbung - benutzen von Methoden Java Basics - Anfänger-Themen 2
L Klassen, Vererbung und Konstruktoren Java Basics - Anfänger-Themen 10
J Methodenaufrufe abstrakte Klassen, Interfaces Java Basics - Anfänger-Themen 17
M Abstrakte Klassen - Notation Java Basics - Anfänger-Themen 9
Detlef Bosau Nachladen von Klassen zur Laufzeit Java Basics - Anfänger-Themen 24
M Anonyme Klassen - Warum wird in der Konsole nichts ausgegeben? Java Basics - Anfänger-Themen 1
MoxMorris Einige Methoden aus verschiedenen Klassen nacheinander auszuführen läuft seltsam Java Basics - Anfänger-Themen 2
I Klassen von einem package laden, Statisches Feld auslesen und Objekt erstellen Java Basics - Anfänger-Themen 8
I 2 verschiedene Klassen mit gleichen Property vergleichen Java Basics - Anfänger-Themen 13
C Array von Klassen Java Basics - Anfänger-Themen 2
monsterherz 2 Klassen daher Probs mit dem Dateinamen Java Basics - Anfänger-Themen 9
C Kommunikation zwischen 2 Klassen Java Basics - Anfänger-Themen 9
I JPA Query für mehrere Klassen Java Basics - Anfänger-Themen 3
I @Entity Klassen, Service Beans etc. aus einem Share Projekt beziehen? Java Basics - Anfänger-Themen 26
S IntelliJ geht alle Klassen durch Java Basics - Anfänger-Themen 9
I Gleiche Klassen und Methoden in unterschiedlichen Projekten nutzen Java Basics - Anfänger-Themen 2
T variablen klassen übergreifend Java Basics - Anfänger-Themen 12
N Klassen Methoden anderer Klassen aufrufen Java Basics - Anfänger-Themen 4
D Klassen Klassen Kommunikation Java Basics - Anfänger-Themen 12
Encera Auf Objekte aus anderer Klassen zugreifen Java Basics - Anfänger-Themen 20
berserkerdq2 Zwei Klassen Erben von der Klasse A, die eine Klasse kann ich an Methoden übergeben, die als Parameter A haben, die andere nicht? Java Basics - Anfänger-Themen 3
M Andere Methoden in anderen Klassen aufrufen Java Basics - Anfänger-Themen 11
L Methoden in anderen Klassen nutzen Java Basics - Anfänger-Themen 6
L Best Practice Annotierte Klassen im Classpath herausfinden Java Basics - Anfänger-Themen 1
P Mit dem Scanner Klassen aufrufen Java Basics - Anfänger-Themen 3
O Klassen Zusammenspiel zwischen 2 Klassen Java Basics - Anfänger-Themen 1
K Zweite Ausgabe von vererbten Klassen Java Basics - Anfänger-Themen 3
M Wie können Klassen nicht-materialisierte Attribute haben, die nur über get/ set-Mehoden simuliert sind? Java Basics - Anfänger-Themen 6
Speedrunner klassen aufrufen Java Basics - Anfänger-Themen 41
M Log4J (v2) nachträglich in allen Klassen hinzufügen Java Basics - Anfänger-Themen 9
D importieren eigener Klassen Java Basics - Anfänger-Themen 12
W Wo ist der Wurm in meinem Grundverständnis von Klassen? Java Basics - Anfänger-Themen 22
S Daten/Klassen/Packages richtig updaten!? Java Basics - Anfänger-Themen 2
alice98 Erste Schritte Liste erstellen ohne vorgefertigte Klassen Java Basics - Anfänger-Themen 1
C Archiv für eigene Klassen Java Basics - Anfänger-Themen 9
S Objekte von zwei klassen in zwei verschiedene Textdateien schreiben Java Basics - Anfänger-Themen 5
elsaaaaaa Wochentag als String ausgeben mit JDK Klassen Java Basics - Anfänger-Themen 6
CptK Generics: Klassen die Interface implementieren, aber selbst nicht das Interface sind Java Basics - Anfänger-Themen 8
Z Mehtode bei Start des Programms ausführen (Klassen übergreifend) Java Basics - Anfänger-Themen 12
J Allgemeines Problem mit Klassen Java Basics - Anfänger-Themen 5
TimoN11 Java Klassen Global einbinden Java Basics - Anfänger-Themen 1
B Inventar als einzelne Klassen anlegen? Java Basics - Anfänger-Themen 12
G Java Klassen und Instanzmethoden Java Basics - Anfänger-Themen 15
C Kommunikation zwischen 2 Klassen Java Basics - Anfänger-Themen 3
T Vererbung Verschiedene Attribute für vererbte Klassen Java Basics - Anfänger-Themen 4
S Klassen instanziieren und verwenden von Getter und Setter Java Basics - Anfänger-Themen 4
B Variablen Variablen übertragen ohne Klassen Java Basics - Anfänger-Themen 5
C Fernseher-Aufgabe (Methoden, Klassen und Objekte) Java Basics - Anfänger-Themen 63
H Methoden in großen Klassen gruppieren oder auslagern? Java Basics - Anfänger-Themen 10
G Abstrakte Klassen Java Basics - Anfänger-Themen 11
Y Klassen Klassen und Objekte Java Basics - Anfänger-Themen 3
Y Klassen Klassen und Objekte mit set und get Java Basics - Anfänger-Themen 0
A Generischen Klassen Java Basics - Anfänger-Themen 8
A Generische Klassen/Interface Java Basics - Anfänger-Themen 1
J 2 klassen benutzen Java Basics - Anfänger-Themen 5
A Klassen und methoden Java Basics - Anfänger-Themen 15
A Bankweverwaltung mit Klassen und Methoden Java Basics - Anfänger-Themen 14
J Klassen Problem Java Basics - Anfänger-Themen 8
I Java Klassen "Graphics" und "MouseEvent" kombinieren Java Basics - Anfänger-Themen 7
I Klassen als Datentyp nutzen? Java Basics - Anfänger-Themen 11
M Aufsplitten von Methoden in andere Klassen Java Basics - Anfänger-Themen 2
M (Sehr großes Problem) Listen als static in anderen Klassen verwendet Java Basics - Anfänger-Themen 12
C Klassen objektorientiert aufteilen Java Basics - Anfänger-Themen 6
hello_autumn Klassen Anzahl sowie die Anzahl der Junit Tests ermitteln? Java Basics - Anfänger-Themen 8
A Auf Eigenschaften von Objekten anderer Klassen zugreifen Java Basics - Anfänger-Themen 5
F Klassen und Pakete Projektübergreifend (Eclipse) Java Basics - Anfänger-Themen 6
V_Fynn03 Klassen Überweisungen tätigen und einzahlen mit 2 Klassen Java Basics - Anfänger-Themen 1
W Abarbeitungsreihenfolge Anonyme Klassen Java Basics - Anfänger-Themen 2
V_Fynn03 Bruchrechner programmieren (2 Klassen) Java Basics - Anfänger-Themen 9
D OOP- Eine Klasse in mehrere Klassen aufteilen Java Basics - Anfänger-Themen 7
J Problem mit Array: 2 Klassen Java Basics - Anfänger-Themen 2
W Frage zu anonymen Klassen Java Basics - Anfänger-Themen 4
Curtis_MC Parameter-Übergabe bei Klassen und Methoden Java Basics - Anfänger-Themen 12
E Klassen implementieren Java Basics - Anfänger-Themen 94
T Interfaces in erbenden Klassen Java Basics - Anfänger-Themen 2
C Methoden/Klassen Übergabewerte Java Basics - Anfänger-Themen 8
C Java Klassen/Methoden/Übergabeparameter Java Basics - Anfänger-Themen 4
L Wie geht man bei mehreren Action Klassen vor? Java Basics - Anfänger-Themen 0
P Datentypen, Klassen, Operatoren, Wrapperklassen Java Basics - Anfänger-Themen 2
L Wie teilt man ein Programm in vernünftige Klassen ein? Java Basics - Anfänger-Themen 10
T Klassen Denkfehler im Klassen "dynamisch" instanzieren? Java Basics - Anfänger-Themen 4
P Zugriff auf Variablen anderer Klassen in Greenfoot Java Basics - Anfänger-Themen 1
A Methode, Klassen Java Basics - Anfänger-Themen 3
B UML Klassen Diagramm zu Java Code Programmieren und ausführen Java Basics - Anfänger-Themen 21

Ähnliche Java Themen

Neue Themen


Oben