java pass by value

krackmoe

Bekanntes Mitglied
Ich dachte Java kann nur pass by value?

Jetzt hab ich dieses Bsp:

Warum kommt mir nach dem Aufruf der Tricky Methode für pnt1.x und pnt1.y 100 100 raus?
Ich versteh nicht ganz, wie das funktioniert wenn es nur pass by value ist?

Java:
public static void tricky(Point arg1, Point arg2)
    {
      arg1.x = 100;
      arg1.y = 100;
    }
    public static void main(String [] args)
    {
      Point pnt1 = new Point(0,0);
      Point pnt2 = new Point(0,0);
      System.out.println("X: " + pnt1.x + " Y: " +pnt1.y);
      System.out.println("X: " + pnt2.x + " Y: " +pnt2.y);
      System.out.println(" ");
      tricky(pnt1,pnt2);
      System.out.println("X: " + pnt1.x + " Y:" + pnt1.y);
      System.out.println("X: " + pnt2.x + " Y: " +pnt2.y);
    }
 

Marco13

Top Contributor
Es wird eine Referenz übergeben. By Value. Der Inhalt des Objektes, auf das die Referenz zeigt, kann natürlich verändert werden.

"Call by reference" ist was anderes, was es so (bei den gängigen Sprachen) eigentlich nur in C++ gibt...
 

icarus2

Top Contributor
Du übergibst Kopien der Referenz auf das Objekt. Also änderst du die Objekte über die kopierte Referenz, was sich auf das ganze Programm auswirkt.
 

Marco13

Top Contributor
Hoppala, da hat zwischendrin noch ein "AFAIK" gefehlt. (Aber wenn ich das noch reingeschrieben hätte wäre ich nicht mehr erster gewesen :D )
 
N

niehier

Gast
manche streiten sich, ob es bei übergebenen Objektreferenzen nicht CBR ist, aber spätestens bei primitiven Datentypen wird klar, dass es CBV tatsächlich ist. Auch in der JLS wird nur CBV erwähnt.
 

Andi_CH

Top Contributor
manche streiten sich, ob es bei übergebenen Objektreferenzen nicht CBR ist, aber spätestens bei primitiven Datentypen wird klar, dass es CBV tatsächlich ist. Auch in der JLS wird nur CBV erwähnt.
Die haben auch mal behauptet, dass es in Java gar keine Refernzen gäbe bis die erste Nullpointer Exeption aufgetreten ist :D

Hm, zum Teil ist das was getippt wurde etwas schwierig zu lesen - liegt das an den Abkürzungen?
(JLS musst ich echt erst ergoogeln ;) und mit CBR verbinde ich halt das da :) )

Ich fasse mal zusammen:

Basistypen: Fall1 -> Werden als Kopie übergeben

Objekte: Fall 2 -> Da wird die Objektreferenz als Kopie übergeben und über die Referenz das Orignal verändert

Wrapperklassen: Fall 3 -> Da wird bei der Zuweisung ein neues Objekt kreiert und weil die Referenz eine Kopie ist, bewirkt die Zuweisung nichts (Wenn in Fall 2 innerhalb der Prozedur
Code:
i = new MyInteger(42)
stehen würde - nützte das auch nichts.)

Java:
public class Test2 {
	private static class MyInteger {
		private int value = 0;
		public void set (int i) {
			value = i;
		}
		@Override
		public String toString() {
			return "" + value;
		}
	}
	private static void gaga(int i) {
		i = 42;
	}
	private static void gugus(MyInteger i) {
		i.set(42);
	}
	private static void gugus(Integer i) {
		i = 42;
	}

	public static void main (String[] args) {
		int j = 5;
		System.out.println("Fall 1 " + j);
		gaga(j);
		System.out.println(j);
		MyInteger mi = new MyInteger();
		System.out.println("Fall 2 " + mi);
		gugus(mi);
		System.out.println(mi);
		Integer in = new Integer(5);
		System.out.println("Fall 3 " + in);
		gugus(in);
		System.out.println(in);
	}
}

Ausgabe:
Code:
Fall 1 : 1
1
Fall 2 : 2
42
Fall 3 : 3
3
 

Andi_CH

Top Contributor
Aehm noch ein Nachtrag - Der Unterschied zwischen Pointer und Referenz war mir nie klar und wird mir nie klar sein - das ist ein Synonym.

Müll und Abfall sind auch beides eben Abfall oder Müll :D

Nö manchmal - aber eben nur manchmal machen pointer bzw Referenzen Sinn - aber nur manchmal
 
M

maki

Gast
Aehm noch ein Nachtrag - Der Unterschied zwischen Pointer und Referenz war mir nie klar und wird mir nie klar sein - das ist ein Synonym.
Hehe... schon richtig, aber Pointer sind "böse" ;)
Zumindest was das Marketing betrifft.

In anderen Sprachen gibt es allerdings eine Unterscheidung (wenn auch nur marginal), wie in C/C++.
 

tfa

Top Contributor
Aehm noch ein Nachtrag - Der Unterschied zwischen Pointer und Referenz war mir nie klar und wird mir nie klar sein - das ist ein Synonym.

Die Unterscheidung kann man in Sprachen wie C++ machen. Ein Pointer zeigt irgendwo hin. Du kannst eine Zufallszahl erzeugen und sie nach (void*) casten - kein Problem. Eine Referenz zeigt immer auf ein Objekt (von null mal abgesehen) und hat den entsprechenden Typ.
 

Andi_CH

Top Contributor
Ach ja genau - ein referenz kann nie null sein (Ich hab zu lange C++ programmiert und habe fast nur schlechte Erfahrungen gemacht)
 

Andi_CH

Top Contributor
:bae: Ich sag ja immer C++ == D
Mit dieser [ZENSUR] Sprache kann man alles machen was verboten ist.
Zum Beispiel einem Buchstaben 1 dazu addieren - ähm das habe ich in all den Jahren Mathe nie gesehen.

Oh Schreck, denselben Schei.. kann java ja auch :-(

Soviel zum Thema Typensicherheit. :D

PS: Ich habe ja schon oft gesagt: Ich LIEBE Ada
 

xehpuk

Top Contributor
Zum Beispiel einem Buchstaben 1 dazu addieren - ähm das habe ich in all den Jahren Mathe nie gesehen.
Ich hatte mich schon gewundert, aber dann kam ja doch noch das:
Oh Schreck, denselben Schei.. kann java ja auch :-(
:)

Aber wenn das deine Haltung ist, was hältst du dann von Code wie
Code:
System.out.println(0);
,
Code:
System.out.println(new Object());
oder
Code:
String a = "" + 0;
?
 

Marco13

Top Contributor
Ohne jetzt pedantisch und (unangemessen?) "präzise" auf Definitionsdetails eingehen zu wollen: Eine Referenz ist (zumindest bei C++) ein eher "syntaktisches" Konstrukt. Ein Pointer ist schlicht und einfach eine Variable. Nämlich eine Variable, die eine Adresse speichert. Dort ist ein kleiner Speicherbereich, und in dem Speicherbereich steht eine Zahl, und diese Zahl ist eine Adresse. So weit so gut. Eine Referenz ist eigentlich nur ein anderer Name für dieselbe Variable. Schon etwas schwammig und unpräzise: Man könnte bei Referenzen zu jedem (festen aber beliebigen) Zeitpunkt eine "rein textuelle ersetzung" durchführen.
Code:
int a = 123;
int& b = a;
b = 345; // Hier könnte man auch "a = 345;" schreiben - 'b' ist nur eine Referenz

Richtig deutlich wird der Nutzen davon aber eben erst beim echten Call-By-Reference:
Code:
void modify(int &b)
{
    b = 345;
}

int a = 123;
modify(a); // Nachher ist a==345 - das 'b', das bei modify ankommt, ist nur "textell" ein anderer Name für 'a'

So, und jetzt haut mir ruhig die Ungenauigkeiten meiner Aussagen um die Ohren ;)
 

Andi_CH

Top Contributor
Aber wenn das deine Haltung ist, was hältst du dann von Code wie
Code:
System.out.println(0);
,
Code:
System.out.println(new Object());
oder
Code:
String a = "" + 0;
?

Offen gesagt nicht viel - impilizite Konversionen und impilzites aufrufen von Methoden sind sehr oft extrem verwirrend. (Welches ist die Prozedur mit dem am besten passenden Profil? Wird eine Berechnung als int oder double durchgeführt?)

Was wird in welcher Reihenfolge gecastet konvertiert zusammengefügt ....

(Und dann - hab ich gestern hier gelesen - gibt es doch tatsächlich Freaks die den Debugger verdammen - näme mich wunder wie man einen soclehn Fehler ohne den finden soll ???:L )

Oder ich schreibe eine neue Prozedur in einer Klasse und plötzlich treten Probleme an ganz anderer Stelle auf, weil vorher eine andere Prozdur mit dem Umweg über eine implizite Konversion verwendet wurde, meine neue plötzlich besser passt, aber gar nicht dafür gedacht ist - tja - zwar ein Gedankenexperiment, aber realistisch.

Was kommt raus bei
Code:
system.out.println("a" + 2 + 3 + "b")
(Moment ich will nicht erst irgendwelche Unterlagen wälzen um erst herauszufinden! ob int + int Vorrang vor String + String hat oder nicht)

Ada sagt da, dass es keinen Operator gibt um String und int zu addieren. Man kann den aber definieren wenn man will. Man kann auch Ada soweit bringen, dass es nicht mehr eindeutig ist ob nun zuerst die int zusammengzählt werden sollten oder nicht, aber dann meckert der Kompiler.

Warum soll da nicht stehen
Code:
System.out.println((new Object()).toString());
?

Ich sage ja, ich liebe Ada, denn da muss jeder Cast und jede Konversion explizit angegeben werden.
Da steht dann sinngemäss
Code:
println("a" + toString(1) + toString(2) + "b")
oder eben
Code:
println("a" + toString(1+2) + "b")

Der Unterschied zwischen Ada und C++ ist gewaltig, wenn es um die Zuverlässigkeit geht - wenn ein Ada Programm kompilierbar ist wird es zur Laufzeit wesentlich weniger Probleme aufzeigen als ein C++ Programm, dafür ist der Initalaufwand (Analyse Design Datenmodell) aufwändiger.

Java ist irgendwo dazwischen - Leider aus Marketinggründen zu nahe bei C(++).
 

Marco13

Top Contributor
In Anlehung an deine Signatur: Man kann Java auch leserlich schreiben, wenn man wert darauf legt. (Und ohne Ada zu kennen, äußere ich mal die Vermutung, dass man auch Ada unleserlich schreiben kann)
 

Andi_CH

Top Contributor
Hm Sicher hat nicht mit leserlich zu tun. (Das ist nur die Wartbarkeit)
Sicherheit hat so wie ich es in dem Zusammenhang verstehe mit Laufzeitfehlern zu tun.

Mit Java kann man sichere Programme schreiben - mit C und Assembler übrigens auch
Mit Ada muss man sauber programmieren - etwas noch Typenstureres hast du noch nie erlebt, erst flucht man dauernd, aber spätestens kurz vor DEM Meilenstein oder gar dem Projektende wenn eh alle hyperventilieren lernt man es schätzen ;-)
 
N

niehier

Gast
Pointer und referenz ist das gleiche, aber durch C usw. ist ersteres negativassoziiert ;) In Java gab es keine Pointer-Arithmetik, weswegen man den Unterschied vom eigentlich gleichen durch einen neuen Namen betonen wollte...

Was kommt raus bei
Code:
system.out.println("a" + 2 + 3 + "b")
(Moment ich will nicht erst irgendwelche Unterlagen wälzen um erst herauszufinden! ob int + int Vorrang vor String + String hat oder nicht)

Es gibt Operatorpräzedenzen und Auswertungsreihenfolgen von Ausdrücken, außerdem implizite und explizite Konvertierung, (Auto-/Un-)Boxing usw., die eigentlich, einmal gelernt, nicht so kompliziert sind und manchmal Ausdrücke gerade wegen weniger verwendeten Klammern lesbar machen.
 

Andi_CH

Top Contributor
Hast du meinen zweiten Satz auch gelesen?

Spätestens nach 10 Jahren und dem 7. Projekt in der 5. Programmiersprache weisst du das nicht mehr und beginnst eben nach Beschreibungen zu suchen. Das ist Schei.... hab ich schon zu oft erlebt.
Restriktive Sprachen kann eben nur schätzen wer die schon einmal wirklich eingesetzt hat (nicht nur in einen Studienprojektchen sondern in der harten Realität ;) ) im Gegensatz zu den Meisten hier habe ich das getan und habe sehr wohl eine sachliche Haltung den verschiedenen Sprachkonzepten gegenüber.

Tatsache ist, dass Ada Projekte IMMER fehlerfreier und dadurch Termingerechter fertig wurden als solche in anderen Sprachen. Ja, stimmt - man kann nicht alles in Ada machen z.B. GUIs ....
 
M

maki

Gast
Nebenbei bemerkt, Ada ist immer noch die Sprache No. 1 wenn es um Systeme in militärischen Flugzeugen/Hubschraubern geht.
 

Andi_CH

Top Contributor
Nebenbei bemerkt, Ada ist immer noch die Sprache No. 1 wenn es um Systeme in militärischen Flugzeugen/Hubschraubern geht.

Eigentlich für alle militärischen Systeme. Bei diesem System wird zum Glück nur Ada eingesetzt (In der Geschützsteuerung und dem Feuerleitsystem im Hintergrund) - um bösartigen Bemerkungen vorzubeugen - das System taugt was und die Leute von der Bundeswehr die es abgenommen haben, verstehen echt was von Systementwicklung ;)

Die Bedienkonsole (GUI) ist in C++ implementiert - worauf mussten wir Ada-Entwickler wohl meistens warten? Wo waren ca 90% aller Fehler zu suchen?
 

Andi_CH

Top Contributor
ICH war bei der Systemabnahme dabei, du nicht, aber es ist ja hier nichts Neues, dass das was ich sage grundsätzlich als falsch angenommen wird.

Ach noch was: Eine Systemabnahme im militärischen Umfeld umfasst VIEL mehr als nur das System als solches - dazu gehören Dokumentation (ja, auch die des Codes), Prüfnachweise und noch vieles mehr.
 
Zuletzt bearbeitet:
Ähnliche Java Themen
  Titel Forum Antworten Datum
feardorcha Java von Kopf bis Fuß "Java ist Pass-by-Value" Java Basics - Anfänger-Themen 6
H .java Dateien in Eclipse einbinden und ausführen Java Basics - Anfänger-Themen 1
onlyxlia Schlüsselworte Was meint man mit "einen Typ" in Java erstellen? Java Basics - Anfänger-Themen 2
O Java Kara geschweifte Klammern Java Basics - Anfänger-Themen 2
richis-fragen Mausrad logitech kann links und rechts klick wie in java abragen. Java Basics - Anfänger-Themen 15
XWing Java Klssenproblem Java Basics - Anfänger-Themen 4
R Umgebungsvariable java -cp gibt immer Java-Hilfe... Java Basics - Anfänger-Themen 3
farbenlos Csv Datei in Java einlesen Java Basics - Anfänger-Themen 18
F TableModelListener: java.lang.ArrayIndexOutOfBoundsException: 132 Java Basics - Anfänger-Themen 3
G Java 8 - Support-Ende Java Basics - Anfänger-Themen 7
T Java Weihnachtsbaum + Rahmen Java Basics - Anfänger-Themen 1
N Will mit Java anfangen Java Basics - Anfänger-Themen 13
Ü Java Array - Buchstaben als Zahlen ausgeben Java Basics - Anfänger-Themen 22
M Java Iterator Verständnisfrage Java Basics - Anfänger-Themen 6
M Java Mail Programm Java Basics - Anfänger-Themen 4
Sniper1000 Java 391 für Windows Java Basics - Anfänger-Themen 37
J Java long- in int-Variable umwandeln Java Basics - Anfänger-Themen 6
JaZuDemNo Java im Studium Java Basics - Anfänger-Themen 7
E Java Programm zur anzeige, ob Winter- oder Sommerzeit herrscht Java Basics - Anfänger-Themen 62
I QR code in Java selber generieren Java Basics - Anfänger-Themen 5
V Java-Ausnahmebehandlung: Behandlung geprüfter Ausnahmen Java Basics - Anfänger-Themen 1
krgewb Java Streams Java Basics - Anfänger-Themen 10
A Überwältigt von der komplexen Java Welt Java Basics - Anfänger-Themen 29
O Mehrfachvererbung auf Spezifikations- und Implementierungsebene in Java. Interfaces Java Basics - Anfänger-Themen 19
John_Sace Homogene Realisierung von Generics in Java ? Java Basics - Anfänger-Themen 19
P Meldung aus Java-Klasse in Thread an aufrufende Klasse Java Basics - Anfänger-Themen 1
R mit Java API arbeiten Java Basics - Anfänger-Themen 9
P JDK installieren Probleme bei der Java-Installation Java Basics - Anfänger-Themen 8
S Java: Wie sortiere ich eine ArrayList benutzerdefinierter Objekte nach einem bestimmten Attribut? Java Basics - Anfänger-Themen 2
Timo12345 JNLP File mit Java öffnen Java Basics - Anfänger-Themen 2
S Video Editierung mit Java.._ Java Basics - Anfänger-Themen 2
F Einstelungen in Java - CursorBlinkRate Java Basics - Anfänger-Themen 10
A PHP $_POST["name"] in Java Java Basics - Anfänger-Themen 3
vivansai21 Is there a oneliner to create a SortedSet filled with one or multiple elements in Java? Java Basics - Anfänger-Themen 9
Athro-Hiro Weißes Bild in Java erstellen Java Basics - Anfänger-Themen 3
Arjunreddy Can someone please tell me how to use a debugger in BlueJ(a Java environment) Java Basics - Anfänger-Themen 1
M Java assoziationen (UML) Java Basics - Anfänger-Themen 8
H Excel-Tabellen mit Java erstellen Java Basics - Anfänger-Themen 4
Simon16 Java ArrayListe von einer Klasse sortieren Java Basics - Anfänger-Themen 2
P Wie kann ich in meinem Java Programm etwas dauerhaft speichern? Java Basics - Anfänger-Themen 5
H Nutzt Eclipse alle CPU-Threads beim Ausführen von Java-Programmen? Java Basics - Anfänger-Themen 4
xXGrowGuruXx Java einstieg, leichte sache 0 verstanden Java Basics - Anfänger-Themen 7
A java.sql.SQLException: Data type mismatch. Java Basics - Anfänger-Themen 1
H Java-Programm zur Ausgabe von Zuständen Java Basics - Anfänger-Themen 80
N Java Spiel Figur auf dem Hintergrundbild bewegen. Java Basics - Anfänger-Themen 11
G Kann Java-Programm nicht als jar aufrufen, auch als EXE nicht Java Basics - Anfänger-Themen 19
N Java Taschenrechner hat Jemand vlt einen Tipp dafür wie ich jetzt die buttons verbinden kann und das Ergebnis auf dem textfield anzeigen lassen kann Java Basics - Anfänger-Themen 13
A Lerngruppe Java Java Basics - Anfänger-Themen 2
G Help me in the Java Program Java Basics - Anfänger-Themen 2
L Java- Vererbung Java Basics - Anfänger-Themen 4
LimDul Suche Java Stream Tutorial Java Basics - Anfänger-Themen 2
_so_far_away_ Ich möchte Java lernen Java Basics - Anfänger-Themen 11
benny1993 Java Programm erstellen für ein Fußball-Turnier Java Basics - Anfänger-Themen 3
M Datentypen While-Schleife eine Java Methode erstellen Java Basics - Anfänger-Themen 3
V Bild per Java Script austauschen Java Basics - Anfänger-Themen 7
MoxMorris this Keyword in Java Java Basics - Anfänger-Themen 14
D Wie kann man in Java nach Arrays auf Duplikate prüfen Java Basics - Anfänger-Themen 12
wolei JAVA Zeitdifferenz feststellen. Java Basics - Anfänger-Themen 4
DiyarcanZeren Rekursion in Java Java Basics - Anfänger-Themen 5
wolei Java generic interface in a generic class Java Basics - Anfänger-Themen 6
monsterherz Ablauf der Erstellung eines Java Programmes Java Basics - Anfänger-Themen 17
monsterherz Circle.java:5: error: <identifier> expected Java Basics - Anfänger-Themen 2
julian-fr Wie kann ich am besten Java lernen? Java Basics - Anfänger-Themen 17
A Java-Properties und -RessourceBundles Java Basics - Anfänger-Themen 5
lrnz22 Java-Basics-Aufgabe Java Basics - Anfänger-Themen 8
R Java kann nicht installiert werden Java Basics - Anfänger-Themen 8
marcelnedza Finde meinen Fehler in einer Methode nicht, Java Karol Java Basics - Anfänger-Themen 15
G In ein java Dokument Ton einbinden Java Basics - Anfänger-Themen 1
C was heisst es wenn java ']' erwartet ? Java Basics - Anfänger-Themen 2
KeinJavaFreak Erste Schritte Programm "Java(TM) Platform SE binary " nicht vorhanden Java Basics - Anfänger-Themen 1
KeinJavaFreak Erste Schritte Java "Executable Jar File" nicht vorhanden Java Basics - Anfänger-Themen 1
melisax Java 2D-Array Tabelle Java Basics - Anfänger-Themen 4
melisax Java Array Wert an bestimmtem Index angeben Java Basics - Anfänger-Themen 14
J Java Testklasse Java Basics - Anfänger-Themen 5
P Java Selenium . Parameterized.Parameters erzeugt eine Fehlermeldung Java Basics - Anfänger-Themen 14
W Java-Code mit Array Java Basics - Anfänger-Themen 14
W Java-Code Java Basics - Anfänger-Themen 2
P BeforeEach AfterEach werden nicht ausgeführt. Java / Selenium Java Basics - Anfänger-Themen 4
A Wie führe ich eine Batch-Datei von meiner Java-Anwendung aus? Java Basics - Anfänger-Themen 18
W Java code- TicTac toe Java Basics - Anfänger-Themen 51
Ostkreuz Java Docs Java Basics - Anfänger-Themen 9
R Java boolean Unterschied " == " und " = " Java Basics - Anfänger-Themen 3
D Java Programm mit Batch-Datei starten Java Basics - Anfänger-Themen 32
W Java-code Java Basics - Anfänger-Themen 8
W Java-code Java Basics - Anfänger-Themen 9
W Java-Code erklären Java Basics - Anfänger-Themen 6
A Java Kurs / Tutorial Java Basics - Anfänger-Themen 6
K Java Lotto Spiel; ich komme nicht weiter Java Basics - Anfänger-Themen 15
R Operatoren Rechenoperation in Java verwenden für Calculator Java Basics - Anfänger-Themen 2
P Java 2n Potenzieren Java Basics - Anfänger-Themen 1
J Java Hamster Java Basics - Anfänger-Themen 4
D Wie sehe ich ein Java-Programm? Java Basics - Anfänger-Themen 27
V Die Funktion des neuen Schlüsselworts in Java Java Basics - Anfänger-Themen 1
W Junit-Test (Java) Java Basics - Anfänger-Themen 4
W Testfälle bei Java ( Junit-Test) Java Basics - Anfänger-Themen 3
laxla123 If-else Java Java Basics - Anfänger-Themen 4
RashAGhul Java Verwaltungstool Erstellen mit kaum Wissen Java Basics - Anfänger-Themen 9
S Substring in java Java Basics - Anfänger-Themen 3
Z Operatoren Java Applikation Java Basics - Anfänger-Themen 8
Tw1Z Erste Schritte Sort in java Java Basics - Anfänger-Themen 2

Ähnliche Java Themen

Neue Themen


Oben