Heim >Java >javaLernprogramm >Detaillierte Erläuterung der Java-Wertübergabe und Referenzübergabe

Detaillierte Erläuterung der Java-Wertübergabe und Referenzübergabe

高洛峰
高洛峰Original
2017-01-24 16:54:001514Durchsuche

Wenn ein Objekt als Parameter an eine Methode übergeben wird, kann die Methode die Eigenschaften des Objekts ändern und die geänderten Ergebnisse zurückgeben.
Antwort: Es handelt sich um einen Wert . Die Programmiersprache Java verfügt nur über Parameter mit Wertübergabe. Wenn eine Objektinstanz als Parameter an eine Methode übergeben wird, ist der Wert des Parameters eine Kopie der Referenz des Objekts. Wenn Sie auf dasselbe Objekt zeigen, kann der Inhalt des Objekts innerhalb der aufgerufenen Methode geändert werden, aber der Verweis auf das Objekt (keine Kopie des Verweises) ändert sich nie.

Java-Parameter, unabhängig davon, ob es sich um primitive Typen oder Referenztypen handelt, werden als Kopien übergeben (es gibt auch eine andere Möglichkeit, dies als Wert zu sagen, aber es ist einfacher zu verstehen, wenn gesagt wird, dass sie von a übergeben werden Die Übergabe von Werten erfolgt normalerweise relativ zur Übergabe von Adressen.

Wenn der Parametertyp ein primitiver Typ ist, wird eine Kopie des Parameters übergeben, bei der es sich um den Wert des ursprünglichen Parameters handelt. Dies ist derselbe wie bei der zuvor besprochenen Wertübergabe. Wenn Sie den Wert der Kopie innerhalb der Funktion ändern, ändert sich der ursprüngliche Wert nicht.

Wenn der Parametertyp ein Referenztyp ist, wird eine Kopie des Referenzparameters übergeben, und diese Kopie speichert die Adresse des Parameters. Wenn die Adresse dieser Kopie in der Funktion nicht geändert wird, der Wert in der Adresse jedoch geändert wird, wirkt sich die Änderung innerhalb der Funktion auf die übergebenen Parameter aus. Wenn die Adresse der Kopie in der Funktion geändert wird, z. B. „neu“, dann zeigt die Kopie auf eine neue Adresse. Zu diesem Zeitpunkt zeigt der übergebene Parameter immer noch auf die ursprüngliche Adresse, sodass der Wert des Parameters nicht geändert wird .

Beispiel:

public class ParamTest {
  public static void main(String[] args){
   /**
    * Test 1: Methods can't modify numeric parameters
    */
   System.out.println("Testing tripleValue:");
   double percent = 10;
   System.out.println("Before: percent=" + percent);
   tripleValue(percent);
   System.out.println("After: percent=" + percent);
  
   /**
   * Test 2: Methods can change the state of object parameters
   */
   System.out.println("\nTesting tripleSalary:");
   Employee harry = new Employee("Harry", 50000);
   System.out.println("Before: salary=" + harry.getSalary());
   tripleSalary(harry);
   System.out.println("After: salary=" + harry.getSalary());
  
   /**
   * Test 3: Methods can't attach new objects to object parameters
   */
   System.out.println("\nTesting swap:");
   Employee a = new Employee("Alice", 70000);
   Employee b = new Employee("Bob", 60000);
   System.out.println("Before: a=" + a.getName());
   System.out.println("Before: b=" + b.getName());
   swap(a, b);
   System.out.println("After: a=" + a.getName());
   System.out.println("After: b=" + b.getName());
  }
  
  private static void swap(Employee x, Employee y) {
   Employee temp = x;
   x=y;
   y=temp;
   System.out.println("End of method: x=" + x.getName());
   System.out.println("End of method: y=" + y.getName());
  }
  
  private static void tripleSalary(Employee x) {
   x.raiseSalary(200);
   System.out.println("End of method: salary=" + x.getSalary());
  }
  
  private static void tripleValue(double x) {
   x=3*x;
   System.out.println("End of Method X= "+x);
  }
 }

Ergebnisse anzeigen:

Testing tripleValue:
Before: percent=10.0
End of Method X= 30.0
After: percent=10.0
 
Testing tripleSalary:
Before: salary=50000.0
End of method: salary=150000.0
After: salary=150000.0
 
Testing swap:
Before: a=Alice
Before: b=Bob
End of method: x=Bob //可见引用的副本进行了交换
End of method: y=Alice
After: a=Alice //引用本身没有交换
After: b=Bob

Das Gelernte für alle war hilfreich und ich hoffe, dass alle die chinesische PHP-Website besuchen.

Ausführlichere Artikel zur Java-Wertübergabe und Referenzübergabe finden Sie auf der chinesischen PHP-Website!

Stellungnahme:
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn