OOP This-Referenzs > wo liegt mein Denkfehler?

innocent

Mitglied
Hey!

Arbeite mich für die Uni nach und nach in Java ein. Momentan bin ich bei der fleißigen Lektüre der Insel. Nebenbei muss ich in einer Gruppe ein Kartenspiel in Java implementieren.

Jetzt habe ich eine Methode Push(object,ip) geschrieben, mit welcher man Objekte über eine Socketverbindung schieben kann. Nun ließt man, dass es immer schlecht sei, Objekte als Parameter zu übergeben, da das prozedurale Programmierung sei.

Gut, ursprünglich wollte ich die Push()-Methode an Objekte vererben. Dabei bin ich auf ein Problem mit der This-Referenz gestoßen.


Hier ein Programm, welches mein Problem verdeutlichen soll: Prozedural:
Java:
class Mutter {
	String Variable = "Elternelement > Mutter";
	public void Push() {
		
	}
	public void Push(Sohn asd) {
		System.out.println(asd.Variable);
	}
	public void Push(Mutter asd) {
		System.out.println(asd.Variable);
	}
}

class Sohn extends Mutter {
	String Variable = "Kindelement > Sohn";
}

public class ThisReferenz {
	public static void main(String[] args) {
		Sohn sohn = new Sohn();
		Mutter mutter = new Mutter();
		System.out.println("laeuft");
		System.out.println("Sohn.Push()");	
		sohn.Push(sohn);
		System.out.println("Mutter.Push()");
		mutter.Push(mutter);
	}
}
Der "Fehler" im Programm: Ich muss das Objekt, welches ich auf der Konsole ausgeben will, übergeben. Aber es funktioniert.

OOP:
Java:
class Eltern {
	private String Variable = "Elternelement > Mutter";
	public void Push() {
		System.out.println(this.Variable);
	}
}

class Kind extends Eltern {
	private String Variable = "Kindelement > Sohn";
}

public class ThisReferenz2 {
	public static void main(String[] args) {
		Kind sohn = new Kind();
		Eltern mutter = new Eltern();
		System.out.println("Laeuft");
		System.out.println("sohn.Push()");	
		sohn.Push();
		System.out.println("mutter.Push()");
		mutter.Push();
	}
}
Ausgabe:
Code:
Laeuft
sohn.Push()
Elternelement > Mutter
mutter.Push()
Elternelement > Mutter




Die Push()-Methode steht hier als Synonym für meine Netzwerkmethode. Habe ich einen Fehler, oder überschreibt die Eltern-Variable die des Kindes?
Ich dachte, nur die Methode wird vererbt und würde dann über this auf die Variable des Kindes zugreifen. Dem scheint nicht so zu sein.
 

faetzminator

Gesperrter Benutzer
Variablen werden nicht vererbt... Du kannst das ganze aber über Getter- und/oder Setter-Methoden lösen.
Des Weiteren sollten Methoden Camel Case mit beginnendem Kleinbuchstaben geschrieben werden, in deinem Fall also [c]push()[/c].
 

ne0n2005

Mitglied
Also der Moment in dem einen da Licht aufgegangen ist, was du meintest war echt schön ;)
(Soll jetzt nicht heißen das du dich schlecht ausgedrückt hast oder so, ich liege gerade Krank im Bett und bin nicht ganz mit allen grauen Zellen dabei)

Also da die variable private gesetzt ist dürfte sie ja schonmal nicht die des Kindes überdecken, da sie ja im Kind garnicht exziestiert. Wobei sich die Ausgabe ja glaube ich nicht ändert, wenn du das private wegmachen wirst.

Ich würde jetzt sagen das das push vom Kind halt über den this Zeiger immernoch auf die Eltern zeigt, quasi als hättest du Eltern.variable im system.out.


Jedoch kann ich da auch nur mutmaßen wieso sich der this-Zeiger da so verhällt und bin mal auf die antwort von jemanden gespannt der sich da auskennt.
 
Zuletzt bearbeitet:

Landei

Top Contributor
Variablen- und Methodennamen schreibt man in Java klein.

In Sohn hast du eine neue Variable "Variable", die die mütterliche gewissermaßen "überdeckt". Das hier sollte funktionieren:

Java:
class Sohn extends Mutter {
    public Sohn() {
       Variable = "Kindelement > Sohn";
    }
}

Damit überschreibst du die vorhandene Variable und erzeugst keine neue.
 

innocent

Mitglied
Variablen werden nicht vererbt... Du kannst das ganze aber über Getter- und/oder Setter-Methoden lösen.
Des Weiteren sollten Methoden Camel Case mit beginnendem Kleinbuchstaben geschrieben werden, in deinem Fall also [c]push()[/c].

Danke, kleine Methodennamen, werde ich mir merken.

Hier geht's jetzt aber nicht um die Variablen. Das Ganze soll nur ein Beispiel für mein Netzwerkproblem sein. Dort habe ich verschiedene Objekte, die ich mittels objectreferenz.push() auf den Server schieben will.

Das funktioniert hier ja leider nicht, da die dazu benötigte This-Referenz auch beim Kind-Objekt die Mutter-Variable ausgibt.

Variablen- und Methodennamen schreibt man in Java klein.

In Sohn hast du eine neue Variable "Variable", die die mütterliche gewissermaßen "überdeckt". Das hier sollte funktionieren:

Java:
class Sohn extends Mutter {
    public Sohn() {
       Variable = "Kindelement > Sohn";
    }
}

Damit überschreibst du die vorhandene Variable und erzeugst keine neue.

Werde ich gleich testen! Aber wenn ich das überschreibe, kann ich dann noch auf die Muttervariable zugreifen, wenn ich ein Mutterobjekt benutze? Spirch: mutterobjekt.push()?

wer sagt den sowas?

Steht im "Java ist auch eine Insel"-Buch.
 
S

SlaterB

Gast
@ARadauer

das sagt doch jeder,
man muss es nur richtig lesen

> Person p = ..;
> String name = p.getName();
ist in aller Regel besser als
> Person p = ..;
> String name = PersonMethoden.getName(p);

dass damit sämliche Parameter verboten sind, ist nur eine falsche Folgerung
 

Landei

Top Contributor
Natürlich sind Variablen der Elternklasse (sofern nicht private) auch in der Kindklasse sichtbar. Dass man einfach eine gleichnamige Variable in der Kindklasse "drüberdefinieren" darf, ohne Warnung und so, ist schon ziemlich starker Tobak. Da kein halbwegs erfahrener Java-Programmierer überhaupt auf so eine Idee kommen würde, ist die allgemeine Konfusion vorprogrammiert :-D
 

ne0n2005

Mitglied
[Java]
public class Eltern {
String s = "alt";

public void printString() {
System.out.println(s);
}
public class Kind extends Eltern{
String s = "jung";
}
[/Java]
e.printString(); //alt
k.printString(); //alt
________________________________________
[Java]
public class Eltern {
String s = "alt";

public void printString() {
System.out.println(s);
}
public class Kind extends Eltern{
String s = "jung";

public Kind() {
s = "jung2";
super.s = "jung3";
}
}
[/Java]
e.printString(); //alt
k.printString(); //jung3
e.printString(); //alt <- - sind ja andere Objekte
_________________________________________
[Java]
public class Eltern {
String s = "alt";

public void printString() {
System.out.println(s);
}
public class Kind extends Eltern{
public Kind() {
s = "jung";
}
}
[/Java]
e.printString(); //alt
k.printString(); //jung
__________________________
[Java]
public class Eltern {
String s = "alt";

public void printString() {
System.out.println(s);
}
public class Kind extends Eltern{
String s = "jung";

public void printString() {
System.out.println(s);
}
}
[/Java]
e.printString(); //alt
k.printString(); //jung

So wie der letzt Fall aussieht war wohl die Idee von "innocent", das das Kind die Methode zur Stringausgabe erbt und somit einen eigenen String names s ausgeben kann. Jedoch scheint die Vererbung dort etwas anderes zu funktionieren wie man es intuitiv erwarte würde, denn die geerbte Methode im Kind schafft es sogar auf eine Variable zuzugreifen die private ist, also normal garnicht im Kind sichtbar ist. somit bleibt eigentlich keine andere möglichkeit, das aus dem this.varibale in der Klasse Kind ein super.variable geworden ist.

ich fand es jetzt mal ganz interessant sich einige Fällte zu überlegen und nachzuvollziehen wieso es in welchem Fall zu welcher testausgabe kam.

mfg neon
 

ne0n2005

Mitglied
ps: innocent, nutz doch nächstesmal die Forensuche :p

nein, spaß bei Seite, ich finde das einen recht interessanten Post von dir, weil dein Gedankengang mit dem this-Zeiger zumindest für mich garnicht so abwegig ist.
 
Zuletzt bearbeitet:

innocent

Mitglied
Hmm. Gut, die Variablen habe ich als Privat geklariert.

Ich hatte mir das so vorgestellt, dass die Push()-Methode an das Kind vererbt wird. Greife ich nun über eine Objektreferenz des Kindelements auf die geerbte Methode zu, müsste this doch die Objekt-Variable des Kindelements übergeben, oder nicht?


Noch mal gesagt:
Das hier ist nur als Beispiel gedacht. Ich möchte eine wesentlich komplexere Push()-Methode an die Netzwerkpakete vererben. Aber damit die funktioniert muss ich auf die jeweiligen Netzwerkpakete mit This zugreifen.


ps: innocent, nutz doch nächstesmal die Forensuche :p

Haha ^^
Ich bin generell erst über diverse Suchen im Internet auf dieses Forum gestoßen.
 
Zuletzt bearbeitet:

ne0n2005

Mitglied
Ich hatte den String in Eltern bewusst nicht private gesetzt, da er somit ja nicht in Kind sichtbare wäre, und die "Verwirrung" ja nur halb so groß wäre.

Das this wird ja scheinbar durch einen Zeiger auf die Superklasse Eltern. Also musst du dich jetzt wohl von der Methode trennen und wie bereits einer meiner Vorredner schon gemeint hat auf getter und setter Methoden zurückgreifen.
 

innocent

Mitglied
Wozu Getter und Setter, wenn ich mit push() auf das aufgerufene Objekt über das Netzwerk schicken will?

Wie gesagt, das hier ist nur ein Beispiel, ich verstehe nicht, warum es nicht funktioniert. Ich dachte This gibt immer die Referenz auf das aktuelle Objekt zurück und nicht eine Referenz auf das Superobjekt.
 

innocent

Mitglied
Und warum funktioniert es dann in meinem Beispiel nicht? Wo liegt da der Fehler? Wie gesagt, es geht nicht darum, die Strings auszugeben, das ist nur ein Synonym für eine komplexere Methode die eine Objekt-Referenz erwartet und über das Netzwerk verschickt.
 
M

maki

Gast
Und warum funktioniert es dann in meinem Beispiel nicht? Wo liegt da der Fehler?
Wurde doch lang & breit diskutiert, warum private membervariablen statisch gebunden werden und nicht dynamisch.

Public/protected/package protected bzw. getter wären die Lösung.
 

Michael...

Top Contributor
this referenziert zwar auf das Kindobjekt, die aufgerufene Methode push() ist aber in der Superklasse implementiert und kennt nur deren Variable Variable, sie weiss garnichts von einer gleichnamigen Variable in der Subklasse (Sie weiss ja noch nicht mal, dass es eine Subklasse gibt/geben könnte).
Da Variablen - wie des Öfteren erwähnt - nicht vererbt werden, kann man sie auch nicht überschreiben. Es handelt sich also um zwei verschiedene Variablen.

Mögliche Vorgehensweisen: die Variable in der Superklasse protected machen und in der Subklasse deren Inhalt überschreiben oder per setMethode von aussen zugänglich machen.
 
M

maki

Gast
..
Da Variablen - wie des Öfteren erwähnt - nicht vererbt werden, kann man sie auch nicht überschreiben. ..
Sorry, aber das stimmt so nicht.

Variablen werden immer vererbt, aber deswegen sind sie nicht sichtbar.
Wenn der Compiler eine private Variable findet, dann linkt er sie statisch, gibt ja keinen Grund für dynamisches Linken zur Laufzeit, und das ist das Problem hier.
 

innocent

Mitglied
So, noch etwas gelesen. Jetzt habe ich kapiert, worauf Ihr hinaus wolltet! Dankeschoen!

Java:
class Eltern {
	private String Variable;
	public void Push() {
		System.out.println(this.Variable);
	}
	public void set(String var) {
		this.Variable = var;
	}
}

class Kind extends Eltern {
	public String Variable;
}

public class ThisReferenz2 {
	public static void main(String[] args) {
		Kind sohn = new Kind();
		Eltern mutter = new Eltern();
		mutter.set("Mutterelement");
		sohn.set("Sohnelement");
		System.out.println("Laeuft");
		System.out.println("sohn.Push()");	
		sohn.Push();
		System.out.println("mutter.Push()");
		mutter.Push();
	}
}

Ausgabe:
Laeuft
sohn.Push()
Sohnelement
mutter.Push()
Mutterelement
 
Ähnliche Java Themen
  Titel Forum Antworten Datum
ohneInformatik; Dynamische Zinsen. Wo liegt der Fehler? Java Basics - Anfänger-Themen 4
J Mein Programm läuft bei der ersten Eingabe nicht mehr weiter, woran liegt das? Java Basics - Anfänger-Themen 6
J Anfänger, Fehler; "Der Hund liegt begraben" Java Basics - Anfänger-Themen 3
R Fehlermeldung aber WO liegt der Fehler? Java Basics - Anfänger-Themen 7
M BerechneEtwas Weiss jemand woran es liegt Java Basics - Anfänger-Themen 8
W Wo liegt der Fehler? Java Basics - Anfänger-Themen 8
B Keine Ausgabe .. Woran liegt das? Ich komme nicht weiter Java Basics - Anfänger-Themen 14
A Class not found - Jar liegt am classpath Java Basics - Anfänger-Themen 2
G Input/Output Wo liegt mein Fehler? Java Basics - Anfänger-Themen 4
P wo liegt der Fehler? Java Basics - Anfänger-Themen 2
W Compiler-Fehler Fehler - <identifier> expected, wo liegt mein Fehler? Java Basics - Anfänger-Themen 4
B Compiler-Fehler Wo liegt der Fehler? Java Basics - Anfänger-Themen 3
M Wo liegt der Unterschied? Deklaration Klasse oder Konstruktur Java Basics - Anfänger-Themen 3
M Liegt hier bereits ein Bad Smell vor? Java Basics - Anfänger-Themen 9
J Wo liegt nur an dieser einfachen Bedingung mein Fehler? Java Basics - Anfänger-Themen 8
R Schaffe es nicht Random-Programmierung zu vollenden. Wo liegt der Fehler in diesem Code? Java Basics - Anfänger-Themen 13
J Wo liegt der Fehler? Java Basics - Anfänger-Themen 7
J ResultSet.getStrin - doch kein String? oder wo liegt das Problem? Java Basics - Anfänger-Themen 3
S GaussJordan in Java, wo liegt mein Fehler? Java Basics - Anfänger-Themen 4
A Datum prüfen, ob es vor einem anderen Datum liegt Java Basics - Anfänger-Themen 2
T Wo liegt der Fehler ? -.- Java Basics - Anfänger-Themen 3
P Datentypen Fehler nur wo liegt das Problem? Java Basics - Anfänger-Themen 7
R NullPointerException ,wo liegt der Fehler? Java Basics - Anfänger-Themen 2
K OOP Methoden überladen, wo liegt das Problem? Java Basics - Anfänger-Themen 22
D wo liegt der Fehler? (JTable) Java Basics - Anfänger-Themen 11
D Primzahlen ausgeben. Wo liegt der Fehler? Java Basics - Anfänger-Themen 4
M NullPointerException - Fehler beheben, nur, wo liegt er? Java Basics - Anfänger-Themen 13
D Wo liegt der Fehler? Java Basics - Anfänger-Themen 11
F wo liegt der Fehler?? Java Basics - Anfänger-Themen 7
B Class wird nicht gefunde obwohl sie im gleichen Ordner liegt Java Basics - Anfänger-Themen 8
Screen Scanner Arrays wo liegt mein Fehler? Java Basics - Anfänger-Themen 11
Screen Wo liegt der Fehler? Java Basics - Anfänger-Themen 3
G Variable welche in anderer Klasse liegt, verändern. Java Basics - Anfänger-Themen 2
K Wo liegt der Fehler wieder ? Java Basics - Anfänger-Themen 14
I String, Split, match, wo liegt mein Fehler ? Java Basics - Anfänger-Themen 4
K Hallo, woran liegt der Fehler ? Java Basics - Anfänger-Themen 6
M Felder (Wo liegt der Fehler?) Java Basics - Anfänger-Themen 2
P Wo liegt der Fehler? *verzweifel* Java Basics - Anfänger-Themen 10
J Arrays: Wo liegt das Problem? Java Basics - Anfänger-Themen 6
Z Wo liegt der Fehler? Java Basics - Anfänger-Themen 8
S Array bleibt leer, wo liegt mein Fehler? Verzeichnisinhalt s Java Basics - Anfänger-Themen 8
H In welchem Ordner liegt das jar file? Java Basics - Anfänger-Themen 2
E Wo liegt hier der Fehler? Java Basics - Anfänger-Themen 13
L wo liegt hier der fehler? Java Basics - Anfänger-Themen 3
M Wo liegt der Quelltext von System.out.println() Java Basics - Anfänger-Themen 3
M JTable updaten woran liegt es bloß? Java Basics - Anfänger-Themen 2
R Wo liegt der Fehler? Java Basics - Anfänger-Themen 10
W Wo liegt denn heir der Fehler? Java Basics - Anfänger-Themen 10
N wo liegt daran der fehler? Java Basics - Anfänger-Themen 6
H weiss nicht wo hier der fehler liegt Java Basics - Anfänger-Themen 3
A wo liegt der fehler im programm? Java Basics - Anfänger-Themen 9
A Warum wird mein jdk nicht gefunden? Java Basics - Anfänger-Themen 3
J Layout Manager, welcher ist der Richtige für mein Program? Java Basics - Anfänger-Themen 1
dennis_lnz Klassen Wie kann ich mein Java Textadventure verbessern, um ein Klassendiagramm zu erstellen? Java Basics - Anfänger-Themen 9
J Größter gemeinsamer Teiler: mein Code Java Basics - Anfänger-Themen 6
J Mein Java Programm lässt sich nicht mehr bearbeiten Java Basics - Anfänger-Themen 2
I Methoden Wieso wird mein Array "a" verändert und meine Variable "a" nicht? Java Basics - Anfänger-Themen 4
Alen123 Warum funktioniert mein Code nicht? Java Basics - Anfänger-Themen 64
sserio Wieso funktioniert mein Programm nicht Java Basics - Anfänger-Themen 2
sserio Wieso funktioniert mein TableView nicht /JavaFX. Java Basics - Anfänger-Themen 4
M Mein quellcode wird nicht in der Konsole ausgegeben Java Basics - Anfänger-Themen 3
J Nach dem Exportieren funktioniert mein Programm nicht mehr Java Basics - Anfänger-Themen 8
P Mein Programm wird zwar erfolgreich Compiliert, öffnet sich aber nicht Java Basics - Anfänger-Themen 6
W Wie ziehe ich von einer bestimmten Zahl, Zahlen ab, bis mein Ergebnis null beträgt? Java Basics - Anfänger-Themen 10
J Kann ich mein Programm so schreiben? Java Basics - Anfänger-Themen 4
S Mein erstes eigenes Projekt - Aufbau und Strukturierung Java Basics - Anfänger-Themen 6
A Java die richtige Programmiersprache für mein Projekt? Java Basics - Anfänger-Themen 1
T Mein Programm hat Fehler Java Basics - Anfänger-Themen 4
S Brauche hilfe in Java [Fehler in mein Code]? Java Basics - Anfänger-Themen 2
S Wie ende ich mein Pogrammierung? [Hilfe] Java Basics - Anfänger-Themen 1
R Mein Plugin funktioniert nicht? Java Basics - Anfänger-Themen 10
J Mein Programm beendet sich ohne mein Zutun Java Basics - Anfänger-Themen 9
A Eine Krone in der Textausgabe - Mein Code Java Basics - Anfänger-Themen 11
M Warum berechnet mein Primzahlenprog zu hohe Zahlen nicht? Java Basics - Anfänger-Themen 20
M OOP Mein erstes Textadventure... Java Basics - Anfänger-Themen 3
G Mein Java Projekt funktioniert nicht Java Basics - Anfänger-Themen 5
W Wieso funktioniert mein Switch Case nicht ?! Java Basics - Anfänger-Themen 9
L Mein Taschenrechner lässt sich plötzlich nicht mehr öffnen Java Basics - Anfänger-Themen 5
x-tshainge Mein Programm lässt sich nicht Starten Java Basics - Anfänger-Themen 8
W Warum läuft mein Programm nicht? Java Basics - Anfänger-Themen 14
W Warum funktioniert mein Programm nicht ? Java Basics - Anfänger-Themen 12
W Warum funktioniert mein Programm nicht ? Java Basics - Anfänger-Themen 6
W Ist mein Struktogram richtig erstellt worden? Java Basics - Anfänger-Themen 4
W Erste Schritte Warum funktioniert mein Programm nicht ? ~if Anweisung~ Java Basics - Anfänger-Themen 4
A Erste Schritte Mein Programm erkennt die variable EinAus.readInt nicht Java Basics - Anfänger-Themen 15
N Warum terminiert mein Programm nicht? Java Basics - Anfänger-Themen 13
G Wie kann ich mein Quellcode als Programm vom desktop starten? Java Basics - Anfänger-Themen 1
P Wie kann ich mein Programm zu einer App umwandeln? Java Basics - Anfänger-Themen 4
M Mein erstes Programm Java Basics - Anfänger-Themen 3
A Mein 1x1 Programm funktioniert nicht? Java Basics - Anfänger-Themen 2
G Variablen Was ist mein Fehler? Java Basics - Anfänger-Themen 2
C Warum funktioniert mein If Statement nicht richtig? Java Basics - Anfänger-Themen 18
B Drucken: Default Paper von Drucker? Mein Drucker druckt falsch Java Basics - Anfänger-Themen 3
stylegangsta Input/Output Hat eclipse eine Macke oder mein Code Array Datei einlesen Java Basics - Anfänger-Themen 5
M Mein erstes Java Programm Java Basics - Anfänger-Themen 5
S Wieso wird mein JFrame transparent dargestellt? Java Basics - Anfänger-Themen 5
N mein RegEx Java Basics - Anfänger-Themen 2
N Mein Bubblesort sortiert mein Array nicht Java Basics - Anfänger-Themen 2
W Wie hat mein Lehrer das gemacht. Java Basics - Anfänger-Themen 2
Z Klassen Warum wird mein Objekt nicht erkannt? Java Basics - Anfänger-Themen 2

Ähnliche Java Themen

Neue Themen


Oben