Method Call by ist ein Standardbegriff für Informatik. Methodenaufrufe werden in Wertschöpfungsaufrufe (Aufruf durch Referenz) und Referenzaufrufe (Anruf nach Wert) gemäß der Parameterübergabesituation unterteilt. Es gibt viele Definitionen dieser beiden Arten von Aufrufen in der Welt. Das häufigste Sprichwort ist, dass der Wert der Wertaufruf ist und die Adresse der Referenzaufruf ist. Dies ist eigentlich sehr unangemessen. Diese Aussagen können uns leicht daran erinnern, dass das Übergeben von Java -Objektparametern ein Referenzaufruf ist. Tatsächlich ist das Übergeben von Javas Objektparametern immer noch ein Wertaufruf.
Verwenden wir zunächst einen Code, um zu bestätigen, warum das Übergeben von Java -Objektparametern ein Wertschall ist.
public class Angestellte {public String name = null; öffentlicher Mitarbeiter (String n) {this.name = n; } // Zwei Mitarbeiterobjekte öffentlich statischer void -Swap (Mitarbeiter E1, Mitarbeiter E2) {Mitarbeiter temp = e1; e1 = e2; e2 = temp; System.out.println (e1.name+""+e2.name); // Print -Ergebnis: li si zhang san} // Hauptfunktion Public static void main (String [] args) {Mitarbeiterarbeiter = neuer Mitarbeiter ("Zhang san"); Mitarbeitermanager = neuer Mitarbeiter ("Li Si"); Swap (Arbeiter, Manager); System.out.println (Worker.name+""+Manager.Name); // Das Druckergebnis ist still: Zhang San li si}}Das obige Ergebnis ist sehr enttäuschend. Obwohl der Inhalt der formalen Parameterobjekte E1 und E2 ausgetauscht wurde, tauschten der tatsächliche Parameterobjekte -Mitarbeiter und der Manager keinen Inhalt aus. Der wichtigste Grund hierfür ist, dass die formalen Parameter E1 und E2 die Adresskopien des tatsächlichen Parameter -Arbeiters und des Managers sind.
Wie wir alle wissen, stellen in Java Objektvariablennamen tatsächlich die Adresse des Objekts im Heap dar (professioneller Begriff wird als Objektreferenz bezeichnet). Wenn die Java -Methode aufgerufen wird, übergeben die Parameter einen Verweis auf das Objekt. Wichtig ist, dass die Speicheradressen, die durch formale Parameter und tatsächliche Parameter besetzt sind, nicht gleich. Die Inhalte in formalen Parametern sind nur eine Kopie der in den tatsächlichen Parametern gespeicherten Objektreferenz.
Wenn Sie den lokalen variablen Bereich des Java -Stacks in der JVM -Speicherverwaltung (siehe "Virtual Machine Architecture" Java) verstehen, werden Sie den obigen Satz sehr gut verstehen. Wenn das JVM das obige Programm ausführt, wird die Hauptmethode ausgeführt und die SWAP -Methode zwei Speicherplätze namens Stapelrahmen im Java -Stack drückt. Es gibt ein Stück Speicher, der als lokaler variabler Bereich im Hauptstapelrahmen bezeichnet wird, um Verweise auf den tatsächlichen Parameterobjekte Worker und Manager zu speichern. Der lokale variable Bereich im Swap Stack Frame speichert Verweise auf die formalen Parameterobjekte E1 und E2. Obwohl die Referenzwerte von E1 und E2 die gleichen sind wie die von Arbeitnehmer und Manager, belegen sie einen anderen Speicherplatz. Wenn die Referenzen zwischen E1 und E2 ausgetauscht werden, zeigt die folgende Abbildung deutlich, dass sie die Referenzwerte des Arbeiters und des Managers überhaupt nicht beeinflusst.
Das Übergeben von Java -Objektparametern ist immer noch ein Wertschall, obwohl die Adresse (Referenz) übergeben wird. Es ist Zeit, den Referenzaufruf und den Wert aufzurufen, eine genaue Definition.
Rufen Sie nach Wert auf: Während des Parameterübergabeprozesses belegen formale Parameter und tatsächliche Parameter zwei völlig unterschiedliche Speicherplätze. Der vom formale Parameter gespeicherte Inhalt ist eine Kopie des vom tatsächlichen Parameter gespeicherten Inhalts. Tatsächlich erfüllt die Übergabe von Java -Objekten diese Definition, außer dass der von formale Parameter und tatsächliche Parameter gespeicherte Inhalt nicht der variable Wert im herkömmlichen Sinne ist, sondern die Adresse der Variablen. Nun, denken Sie zurück: Ist die Adresse einer Variablen nicht auch ein Wert?
Aufruf durch Referenz: Während des Vorgangs des Parameterübergangs sind formale Parameter und tatsächliche Parameter vollständig der gleiche Speicherraum, und die beiden unterscheiden sich nicht voneinander. In der Tat sind formale Parameternamen und tatsächliche Parameternamen nur unterschiedliche Symbole in der Programmierung. Während des Programmbetriebs ist der im Speicher gespeicherte Raum das Wichtigste. Unterschiedliche Variablennamen geben den Speicherspeicherraum nicht unterschiedlich an.
Im Allgemeinen sind die Grundlagen der beiden Anrufe nicht, ob der Wert oder die Adresse übergeben werden (schließlich ist die Adresse auch ein Wert), sondern ob die formalen Parameter und die tatsächlichen Parameter den gleichen Speicherplatz einnehmen. Tatsächlich ist der in C/C ++ bestehende Zeigerparameter auch ein Wertaufruf. Wenn Sie es nicht glauben, probieren Sie den folgenden C -Code aus!
#include <stdio.h> void Swap (int *a1, int *b1) {int *t = a1; A1 = B1; B1 = t; } int main () {int x1 = 100; int x2 = 200; int *a = & x1; int *b = & x2; printf (" %d %d/n",*a,*b); tauschen (a, b); printf (" %d %d/n",*a,*b); Rückkehr 0; }C/C ++ hat jedoch Referenzaufrufe, eine variable Deklarationsmethode, die als Referenz int A bezeichnet wird. int & ra = a; wo ra ein Alias von a ist. Es gibt keinen Unterschied zwischen den beiden im Gedächtnis und nimmt den gleichen Speicherraum ein. Die Übergabe von Parametern durch Referenz (Alias) steht im Einklang mit den Eigenschaften von Referenzaufrufen. Sie können die laufenden Ergebnisse von Void -Swap (int & a1, int & b1) ausprobieren.
In diesem Artikel sollten Sie wissen, ob Java -Methodenparameter als Referenz oder Wert bezeichnet werden.