English | 简体中文 | 繁體中文 | Русский язык | Français | Español | Português | Deutsch | 日本語 | 한국어 | Italiano | بالعربية
Kopieren Sie zuerst eine Interview/Fragebogen der Prüfung:
Wenn ein Objekt als Parameter an eine Methode übergeben wird, kann diese Methode die Eigenschaften dieses Objekts ändern und das geänderte Ergebnis zurückgeben. Dann ist es Wertepassung oder Referenzpassung?
Antwort:
Es ist ein Wertepassung. Der Methodenaufruf der Java-Sprache unterstützt nur den Wertepassung der Parameter. Wenn eine Objekteinstantz als Parameter an eine Methode übergeben wird, ist der Wert des Parameters eine Referenz auf dieses Objekt. Die Eigenschaften des Objekts können im Verlauf des Aufrufs geändert werden, aber die Änderung der Objektreferenz hat keinen Einfluss auf den Aufrufer.++In C# es kann der Wert eines Parameters geändert werden, indem eine Referenz oder ein Ausgabeparameter übergeben wird. Im C# kann der folgende Code geschrieben werden, aber dies ist in Java nicht möglich.
java中的按值传递和按址传递(按引用传递),要明白这两个概念,要理解按值和按址。
Lassen Sie uns einen einfachen Beispiel dazu geben:
Zum Beispiel, wenn Sie ins Ausland reisen und ein besonders gutes Bild machen, möchten Sie es mit Ihren Freunden teilen, dann gibt es zwei Möglichkeiten: Der erste Weg ist, das Bild direkt an Ihren Freund zu senden, das bedeutet, Sie senden dem Freund eine Kopie des Bildes; Der zweite Weg ist, wenn Sie dieses großartige Bild auf einen QQ (Weibo) hochladen, erhalten Sie eine Adresse (URL), um auf dieses Bild zuzugreifen, und teilen Sie diese URL dann mit Ihren Freunden.
Wie im obigen Beispiel, der erste Fall kann als Wertübermittlung betrachtet werden, der zweite Fall kann als Adressübermittlung (Referenzübermittlung) betrachtet werden. Nachdem Sie diese Konzepte verstanden haben, analysieren wir das weiter.
Über Wert übergeben:Nur wenn die Parameter Basisdatentypenvariablen sind, verwendet Java diese Übergebestrategie.
Wenn Sie das geteilte Bild an Ihren Freund weitergeben und dieser eine Kopie des Bildes erhält, dann beeinflussen die Änderungen, die der Freund am Bild vornimmt, nicht Ihr Bild, und die Änderungen, die Sie am Bild vornehmen, beeinflussen nicht das von Ihnen an den Freund weitergegebene Bild.
Über Adresse übergeben:Nur wenn die Parameter Referenztypenvariablen sind, verwendet Java diese Übergebestrategie.
Wenn Sie die URL-Adresse an Ihren Freund weitergeben, dann wenn Ihr Freund auch das Recht zur Änderung hat, führt er eine Operation am Bild durch, das von ihm angezeigte Bild ist das Ergebnis der von ihm durchgeführten Operationen.
Lassen Sie uns diesen Beispiel durch Code erklären:
package com.dufy.reforvalue; import java.util.Arrays; /** * java中 按值传递和按址传递 * Über Wert übergeben: Basisdatentypenvariablen-Über Wert übergeben, über Wert übergeben bedeutet, eine Kopie der Parameter zu erhalten * Über Adresse übergeben: Referenztypenvariablen-Über Adresse übergeben, über Adresse übergeben bedeutet, die Referenzadresse des Objekts zu übergeben * * @author dufy * @creation 2017Jahr2Monat9Tag */ public class ReferenceOrValue { /** * Basisdatentypen, über Wert übergeben * Beispiel: Teile dein Bild mit Freunden, dein Freund erhält eine tatsächliche Kopie des Bildes, * Du und deine Freunde können auf die eigenen Bilder zugreifen und Operationen daran vornehmen, ohne die Bilder der anderen zu beeinflussen! */ public static void testVal(int photo){ photo++;//dein Freund ändert das Bild System.out.println("Mein Freund sieht das Bild = " + photo); } /** * Referenztyp: Adressübergabe * Beispiel: Teile dein Bild mit Freunden, das geteilte Bild ist der URL (Adresse) eines von dir hochgeladenen Bildes im Internet, * Du und deine Freunde können über diese Adresse auf das Bild zugreifen und eine Operation daran vornehmen! */ public static void testRef(Photo photo){ photo.setPhoto("java Photo,Great!");//Ihr Freund ändert Ihr Bild System.out.println("Mein Freund sieht das Bild = " + photo.getPhoto()); } /** * Referenztyp: Adressübergabe * Da ein Array ein Referenztyp ist, wird eine Referenz daran übergeben. Daher wird in der Methode der Wert ihrer Referenz vertauscht, was auch zwangsläufig ihren ursprünglichen Wert beeinflusst. */ public static void testArrayRef(int[] array){ for (int i = 0; i < array.length; i++) { array[i] = 0; } System.out.println("testArrayRef array is = "+Arrays.toString(array)); } public static void main(String[] args) { //Eins: Wertübergabe int photo = 10;//Definieren Sie das zu sendende Bild testVal(photo);//Senden Sie das Bild an Ihren Freund, Ihr Freund erhält eine Kopie System.out.println("Ich sehe das Bild = " + photo); //Zwei: Adressübergabe Photo p = new Photo();//Definieren Sie ein Bildobjekt, das ich selbst fotografiert habe, java photo p.setPhoto("java photo"); testRef(p);//Senden Sie das Bildobjekt (d.h. die URL) an Ihren Freund, Ihr Freund erhält eine URL (Adresse), und erst wenn die URL geöffnet wird, ist es das Bild System.out.println("Mein Freund sieht das Bild = " + p.getPhoto()); //Drei: Ein Array ist auch ein Objekt, das Array liegt im Heap-Speicher. Die Referenz liegt im Stack. int array[] = {1,2,3,4,5}; testArrayRef(array); System.out.println("array is = "+Arrays.toString(array)); } /** * Foto-Klasse */ static class Photo{ String photo; public String getPhoto() { return photo; } public void setPhoto(String photo) { this.photo = photo; } } }
Das Ergebnis der Ausgabe ist wie folgt:
Mein Freund sieht das Bild = 11
Ich sehe das Bild = 10
Mein Freund sieht das Bild = java Photo, grossartig!
Mein Freund sieht das Bild = java Photo, grossartig!
testArrayRef array is = [0, 0, 0, 0, 0]
array is = [0, 0, 0, 0, 0]
Interessantes Detail: Gibt es das folgende Problem: Wie sollte diese Methode geschrieben werden?
public static void main(String[] args) { int a = 10; int b = 20; method(a,b);//Es muss nach dem Aufruf von method nur a= gedruckt werden100,b=200, Schreiben Sie die Methode method(a,b)! System.out.println("a = ", + a); System.out.println("b = ", + b); }
Es gibt sicherlich viele Menschen, die wie ich sind und ohne nachzudenken den folgenden Code schreiben:
private static void method(int a, int b) { a*=10; b*=10; }
Aber wenn Sie das Ergebnis ausführen, werden Sie feststellen, dass das erwartete Ergebnis nicht gedruckt wird!
Wenn Sie sich genau die obige Beschreibung ansehen, ist es nicht schwer zu verstehen, warum dieses Ergebnis auftritt!
Geben Sie mögliche korrekte Ergebnisse dieses Problems an:
private static void method(int a, int b) { System.out.println("a=",100,b=200"); System.exit(0); }
Wie bereits von mir vorgestellt, sind die Java-Wert- und Referenzübergabe (häufige Interviewfragen) hier vorgestellt. Ich hoffe, es hilft Ihnen weiter. Wenn Sie Fragen haben, hinterlassen Sie bitte eine Nachricht, ich werde umgehend antworten. Ich danke auch sehr für die Unterstützung der呐喊教程网站!
Erklärung: Der Inhalt dieses Artikels wurde aus dem Internet übernommen und gehört dem jeweiligen Urheber. Der Inhalt wurde von Internetnutzern freiwillig beigesteuert und hochgeladen. Diese Website besitzt keine Eigentumsrechte und hat den Inhalt nicht manuell bearbeitet. Sie übernimmt auch keine Haftung für rechtliche Konsequenzen. Wenn Sie verdächtige Urheberrechtsinhalte finden, sind Sie herzlich eingeladen, eine E-Mail an notice#w zu senden.3codebox.com (Bitte ersetzen Sie # durch @, wenn Sie eine Beschwerde einreichen, und fügen Sie relevante Beweise bei. Bei nachgewiesener Infringement wird die Website sofort den fraglichen Inhalten entnehmen.)