Java Klausurfrage Methoden

alexde

Cadet 4th Year
Registriert
Okt. 2007
Beiträge
106
Hiho habe eine Frage zu einer Klausur bei uns in der Fh.

Also es handelt sich um 2 Klassen:
1:
public class Punkt3d {

public double x,y,z;

public Punkt3d(double x, double y, double z){

this.x = x;
this.y = y;
this.z = z;

}

public void modPunkt3d(Punkt3d p){
p.x = 10.0;
p = new Punkt3d(15.0, 13.0, 14.0);

2:
public class Mein3dPunkt {

/**
* @param args
*/
public static void main(String[] args) {
Punkt3d p = new Punkt3d(1.0,2.0,3.0);
p.modPunkt3d(p);
System.out.println("x= "+p.x+" y= "+p.y+" z= "+p.z);

Die Frage ist nun was die Ausgabe ist. Laut Explipse ist die Ausgabe: "x= 10.0 y= 2.0 z= 3.0"

Nun mein großes aber wieso sind die Werte X-Y-Z nicht die aus der 1.Klasse,
also: p = new Punkt3d(15.0, 13.0, 14.0); ????? Kann mir bitte einer helfen ..

Gruss
alex
 
Du machst nen Punkt 1;2;3.. Das Objekt übergibst du, dann änderst du den x Wert auf 10 somit 10;2;3 :)
 
Bitte nachlesen und verstehen, denn viele Leute raffen es nicht :-)

"Java is Pass-by-Value, Dammit!" : http://javadude.com/articles/passbyvalue.htm

Figure 5: (Java) Pass-by-value example

public void foo(Dog d) {
d = new Dog("Fifi"); // creating the "Fifi" dog
}

Dog aDog = new Dog("Max"); // creating the "Max" dog
// at this point, aDog points to the "Max" dog
foo(aDog);
// aDog still points to the "Max" dog

the variable passed in (aDog) is not modified! After calling foo, aDog still points to the "Max" Dog!
 
sooorrrrry^^ kann man das auch kürzer erklären weil wir die klausur morsche schreiben^^ bzw mein englisch is net so super
p = new Punkt3d(15.0, 13.0, 14.0)
meine frage is nur wieso diese werte nicht für p genommen werden
 
alexde schrieb:
sooorrrrry^^ kann man das auch kürzer erklären weil wir die klausur morsche schreiben^^ bzw mein englisch is net so super
p = new Punkt3d(15.0, 13.0, 14.0)
meine frage is nur wieso diese werte nicht für p genommen werden

weil da ein neues Objekt erstellst bzw. ein anderes Objekt. Die Werte von anderen Punkt3d ändern sich aber nicht.
Du müsstest p.x= 15.0; p.y = 13.0; p.z = 14.0 schreiben, dann würden sich erst die Werte ändern. Das ist ein Vorteil von OOP.
 
Habe ein beispiel rein kopiert ...

Aber nach der Klausur solltest du das noch mal nachlesen, denn das ist bei Java elementar!

Die verlinkte Beschreibung von "Scott Stanchfield" ist halt so ausführlich, weil es immer wider falsch verstanden wird (auch ein Grund warum ich den Link in meiner Sammlung habe und andauernd irgendwo poste :-) ).
 
Das hat was mit der Art der Parameterübergabe zu tun.
Da gibt es im allgemeinen call by value, call by result, call by value-result, call by reference und call by name wobei call by value und call by reference am bekanntesten sind. Java kann (soweit ich weiß) nur call by value.

Könnte Java call by reference und die Methode modPunkt3d würde für den Parameter p call by reference verwenden, würdest du das raushaben, was du dir vorgestellt hast.
 
Zuletzt bearbeitet:
hab ich das richtig verstanden, das die punkte dann parallel nebereinander exisitieren???un die könnte ich dann den anderen punkt abrufen?
 
Du übergibst nicht die Variable p sondern das in ihr gespeicherte Punkt3d-Objekt. Deine Methode modPunkt3d speichert jetzt ein neues Punkt3d-Objekt in einer lokalen Variable p. Das ist deiner main-Methode egal, denn sie hat nicht ihre Variable p übergeben, sondern das Objekt, auf das sie verweist.

Dein neues Punk3d-Objekt wird nach dem Ausführen der Methode relativ schnell vom Garbage-Collector entsorgt, weil keiner mehr weiß, dass es das überhaupt gibt. Willst du damit außerhalb der Methode arbeiten musst es es zurückgeben.
 
Zuletzt bearbeitet:
Jain der Zweite Punkt "stirbt" beim verlassen von "modPunkt3d", da Niemand mehr auf ihn verweist.

Und innerhalb von "modPunkt3d" kommnst du nach dem Aufruf von "p = new Punkt3d(15.0, 13.0, 14.0); " nicht mehr an den übergebenen Punkt ran, da du keine Referenz/Verweis mehr auf ihn hast.
 
Ich denke mal Zunra hat es auf den Punkt gebracht und alle Unklarheiten beseitigt :)
 
hier im thread werden einige dinge ein wenig verdreht..

public static void main(String[] args) {
Punkt3d p = new Punkt3d(1.0,2.0,3.0);
p.modPunkt3d(p);
System.out.println("x= "+p.x+" y= "+p.y+" z= "+p.z);
}

hinter p verbirgt sich technisch gesehen ein object-identifier, also eine referenz auf ein objekt. mit new Punkt3d(..) erzeugst du ein objekt mit einer eindeutigen id. diese id wird in die lokale variable p im kontext von main() gespeichert.
wenn du jetzt p.modPunkt3d(p); aufrufst übergibt du den object-identifier in p an die Methode modPunkt3d (und zwar als kopie!).

public void modPunkt3d(Punkt3d p){
p.x = 10.0;
p = new Punkt3d(15.0, 13.0, 14.0);
}

hier ist p ebenfalls eine lokale variable, die aber durch den aufruf von modPunkt3d durch die object-id aus der main methode belegt ist (durch die eben angedeutete kopie). mit p.x = 10.0; greifst du auf dieses objekt zu, da der object-identifier immernoch der gleiche ist den du beim aufruf übergeben hast.
p = new Punkt3d(15.0, 13.0, 14.0); belegt im anschluss dann die lokale variable p neu, und zwar mit nem object-identifier von einem neuen object. das p aus modPunkt3d befindet sich aber auf ner anderen speicheradresse als das p aus main(), weshalb main() vom neuen objekt nichts zu sehen bekommt.

es ist nicht möglich, dass du innerhalb von modPunkt3d ein neues objekt erzeugst und die zugehörige object-id über eines der argumente direkt an main() übergibst. das unterstützt java nicht.
 
so wie es IceMatrix schon beschrieben hat ist es genau richtig.

public void modPunkt3d(Punkt3d p) {
System.out.println(p.toString());
p.x = 10.0;
p = new Punkt3d(15.0, 13.0, 14.0);
System.out.println(p.toString());
}

ersetze die Methode mal wie folgt und du bekommst als Ausgabe die Speicheradresse der einzelnen Objekte.
Das könnte noch etwas für Klarheit sorgen.
 
Wie in dem von Zunra verlinkten Artikel beschrieben ist, handelt es sich bei den "Referenzen" in Java eigentlich um Zeiger auf Objekte. Der Zeiger p in der Methode modPunkt3d ist nicht derselbe Zeiger wie der Zeiger p in main(), er zeigt nur anfangs auf dasselbe Objekt. Die Zuweisung p = new Punkt3d(...) biegt jetzt nur diesen Zeiger um, so daß er auf ein anderes Objekt zeigt (den neu angelegten Punkt). Der Zeiger in main() ändert sich dadurch nicht.
 
das entscheidende bei dem problem ist die unterscheidung call-by-reference und call-by-value. objekte werden bei java immer per call-by-reference übergeben, objekt-ids aber per call-by-value.
 
Aus dem Link in #3:

The problem we're facing here is statements like

In Java, Objects are passed by reference, and primitives are passed by value.

This is half incorrect. Everyone can easily agree that primitives are passed by value; there's no such thing in Java as a pointer/reference to a primitive.

However, Objects are not passed by reference. A correct statement would be Object references are passed by value.

:)
 
danke leute habt uns sehr geholfen^^ genau diese aufgabe kam auch dran :-D
Beste Community
 
Zurück
Oben