Dieser Java-Code:
public class XYZ {
public static void main(){
int toyNumber = 5;
XYZ temp = new XYZ();
temp.play(toyNumber);
System.out.println("Toy number in main " + toyNumber);
}
void play(int toyNumber){
System.out.println("Toy number in play " + toyNumber);
toyNumber++;
System.out.println("Toy number in play after increement " + toyNumber);
}
}
gibt dies aus:
Spielzeugnummer im Spiel 5 Spielzeugnummer im Spiel nach Vereinbarung 6 Spielzeugnummer in Haupt 5
In C ++ kann ich die toyNumber
Variable als Referenz übergeben, um Schatten zu vermeiden, dh eine Kopie derselben Variablen wie unten zu erstellen:
void main(){
int toyNumber = 5;
play(toyNumber);
cout << "Toy number in main " << toyNumber << endl;
}
void play(int &toyNumber){
cout << "Toy number in play " << toyNumber << endl;
toyNumber++;
cout << "Toy number in play after increement " << toyNumber << endl;
}
und die C ++ - Ausgabe lautet wie folgt:
Spielzeugnummer im Spiel 5 Spielzeugnummer im Spiel nach Vereinbarung 6 Spielzeugnummer in Haupt 6
Meine Frage ist: Was ist der äquivalente Code in Java, um die gleiche Ausgabe wie der C ++ - Code zu erhalten, da Java eher als Wert als als Referenz übergeben wird ?
java
pass-by-reference
Student
quelle
quelle
toyNumber
in dermain
Methode deklarierte Variable in der Methode nicht im Gültigkeitsbereich liegtplay
. Das Shadowing in C ++ und Java erfolgt nur, wenn Bereiche verschachtelt sind. Siehe en.wikipedia.org/wiki/Variable_shadowing .Antworten:
Sie haben mehrere Möglichkeiten. Derjenige, der am sinnvollsten ist, hängt wirklich davon ab, was Sie versuchen zu tun.
Auswahl 1: Machen Sie toyNumber zu einer öffentlichen Mitgliedsvariablen in einer Klasse
Übergeben Sie dann einen Verweis auf ein MyToy an Ihre Methode.
Auswahl 2: Geben Sie den Wert zurück, anstatt ihn als Referenz zu übergeben
Diese Auswahl würde eine kleine Änderung an der Call-Site in main erfordern, damit sie lautet ,
toyNumber = temp.play(toyNumber);
.Wahl 3: Machen Sie es zu einer Klasse oder statischen Variablen
Wenn die beiden Funktionen Methoden für dieselbe Klasse oder Klasseninstanz sind, können Sie toyNumber in eine Klassenmitgliedsvariable konvertieren.
Auswahl 4: Erstellen Sie ein einzelnes Elementarray vom Typ int und übergeben Sie dieses
Dies wird als Hack betrachtet, wird jedoch manchmal verwendet, um Werte aus Inline-Klassenaufrufen zurückzugeben.
quelle
toyNumber = temp.play(toyNumber);
damit sie wie gewünscht funktioniert.Java wird nicht als Referenz aufgerufen, sondern nur als Wert
Aber alle Variablen vom Objekttyp sind tatsächlich Zeiger.
Wenn Sie also ein veränderbares Objekt verwenden, sehen Sie das gewünschte Verhalten
Ausgabe dieses Codes:
Sie können dieses Verhalten auch in Standardbibliotheken sehen. Zum Beispiel Collections.sort (); Collections.shuffle (); Diese Methoden geben keine neue Liste zurück, sondern ändern das Argumentobjekt.
Ausgabe dieses Codes:
quelle
play
ändern. zBmutableList[0] = mutableList[0] + 1;
. Wie Ernest Friedman-Hill vorschlägt.private static void play(StringBuilder toyNumber)
- wie nennt man das, wenn es zum Beispiel public static int ist, das eine Ganzzahl zurückgibt? Da ich eine Methode habe, die eine Nummer zurückgibt, diese aber nicht irgendwo anruft, wird sie nicht verwendet.Mach ein
Übergeben Sie dann einen Verweis auf eine Instanz davon. Beachten Sie, dass eine Methode, die den Status durch ihre Argumente mutiert, am besten vermieden wird, insbesondere im parallelen Code.
quelle
Sie können in Java keine Grundelemente als Referenz übergeben. Alle Variablen vom Objekttyp sind natürlich tatsächlich Zeiger, aber wir nennen sie "Referenzen", und sie werden auch immer als Wert übergeben.
In einer Situation, in der Sie wirklich ein Grundelement als Referenz übergeben müssen, deklarieren die Benutzer manchmal den Parameter als Array vom primitiven Typ und übergeben dann ein Array mit einem einzelnen Element als Argument. Sie übergeben also eine Referenz int [1] und können in der Methode den Inhalt des Arrays ändern.
quelle
Für eine schnelle Lösung können Sie AtomicInteger oder eine der atomaren Variablen verwenden, mit denen Sie den Wert innerhalb der Methode mithilfe der integrierten Methoden ändern können. Hier ist Beispielcode:
Ausgabe:
quelle
quelle