Da meine ursprüngliche Antwort lautete "Warum ist es passiert" und nicht "Warum wurde die Sprache so gestaltet, dass es passiert ist", werde ich es noch einmal versuchen.
Um die Sache zu vereinfachen, verzichte ich auf den Methodenaufruf und zeige, was auf andere Weise geschieht.
String a = "hello";
String b = a;
String b = "howdy"
System.out.print(a) //prints hello
Damit die letzte Anweisung "Hallo" ausgibt, b muss auf das gleiche "Loch" im Speicher verweisen, das a zeigt auf (ein Zeiger). Das ist es, was Sie wollen, wenn Sie eine Referenzübergabe wünschen. Es gibt eine Reihe von Gründen, warum Java sich gegen diesen Weg entschieden hat:
-
Zeiger sind verwirrend Die Entwickler von Java haben versucht, einige der verwirrenden Dinge anderer Sprachen zu beseitigen. Zeiger sind neben der Operatorüberladung eines der am meisten missverstandenen und unsachgemäß verwendeten Konstrukte von C/C++.
-
Zeiger sind Sicherheitsrisiken Zeiger verursachen viele Sicherheitsprobleme, wenn sie missbraucht werden. Ein bösartiges Programm weist diesem Teil des Speichers etwas zu, und was Sie für Ihr Objekt hielten, gehört in Wirklichkeit einem anderen. (Java hat das größte Sicherheitsproblem, Pufferüberläufe, bereits mit geprüften Arrays beseitigt).
-
Abstraktion Leckage Wenn man anfängt, sich mit der Frage "Was befindet sich wo im Speicher?" zu beschäftigen, wird die Abstraktion weniger abstrakt. Abstraktionslecks schleichen sich zwar mit Sicherheit in eine Sprache ein, aber die Entwickler wollten sie nicht direkt einbauen.
-
Objekte sind alles, was Sie interessiert In Java ist alles ein Objekt, nicht der Raum, den ein Objekt einnimmt. Das Hinzufügen von Zeigern würde den Platz, den ein Objekt einnimmt, wichtig machen, obwohl.......
Sie könnten das, was Sie wollen, nachbilden, indem Sie ein "Hole"-Objekt erstellen. Sie könnten sogar Generika verwenden, um es typsicher zu machen. Zum Beispiel:
public class Hole<T> {
private T objectInHole;
public void putInHole(T object) {
this.objectInHole = object;
}
public T getOutOfHole() {
return objectInHole;
}
public String toString() {
return objectInHole.toString();
}
.....equals, hashCode, etc.
}
Hole<String> foo = new Hole<String)();
foo.putInHole(new String());
System.out.println(foo); //this prints nothing
thisWorks(foo);
System.out.println(foo);//this prints howdy
public static void thisWorks(Hole<String> foo){
foo.putInHole("howdy");
}
0 Stimmen
Ich bin mir nicht ganz sicher, was Sie damit sagen wollen. Bitte klären Sie es ein wenig?
0 Stimmen
Der vorherige Titel war nicht gut, denn es wäre unmöglich, den Inhalt Ihrer Frage über den Titel zu suchen.
0 Stimmen
Kein Problem, dieser Titel macht mehr Sinn :)
1 Stimmen
Stellen Sie sich Java-Referenzvariablen als Zeiger vor und alles wird klar ;)
2 Stimmen
Siehe auch stackoverflow.com/questions/2027/