> Java > java지도 시간 > 본문

Java 값 전달 및 참조 전달에 대한 자세한 설명

高洛峰
풀어 주다: 2017-01-24 16:54:00
원래의
1502명이 탐색했습니다.

객체가 메소드에 매개변수로 전달되면 메소드는 객체의 속성을 변경하고 변경된 결과를 반환할 수 있습니다. 그러면 값으로 전달됩니까, 아니면 참조로 전달됩니까?
답변: 값 전송입니다. . Java 프로그래밍 언어에는 값 전달 매개변수만 있습니다. 객체 인스턴스가 메서드에 매개 변수로 전달되면 매개 변수의 값은 객체 참조의 복사본입니다. 동일한 개체를 가리키면 호출된 메서드에서 개체의 내용이 변경될 수 있지만 개체에 대한 참조(참조의 복사본이 아님)는 변경되지 않습니다.

Java 매개변수는 기본 유형이든 참조 유형이든 복사본으로 전달됩니다(값에 의해 전달된다고 말하는 또 다른 방법이 있지만 매개변수에 의해 전달된다고 하면 이해하기 더 쉽습니다. 값으로 전달하는 것은 일반적으로 주소로 전달하는 것과 관련이 있습니다).

매개변수 유형이 기본 유형인 경우 전달되는 것은 매개변수의 복사본입니다. 이는 원래 매개변수의 값입니다. 이는 앞서 설명한 값 전달과 동일합니다. 함수 내에서 복사본 값을 변경해도 원래 값은 변경되지 않습니다.

매개변수 유형이 참조 유형인 경우 전달되는 것은 참조 매개변수의 복사본이며 이 복사본은 매개변수의 주소를 저장합니다. 이 복사본의 주소가 함수에서 변경되지 않았지만 주소의 값이 변경된 경우 함수 내 변경 사항은 전달된 매개 변수에 영향을 미칩니다. new 등 함수에서 복사본의 주소가 변경되면 복사본은 새 주소를 가리키며, 이때 전달된 매개변수는 여전히 원래 주소를 가리키므로 매개변수의 값은 변경되지 않습니다. .

예:

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);
  }
 }
로그인 후 복사

표시 결과:

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
로그인 후 복사

도움을 주셔서 감사드리며, 모두가 PHP 중국어 웹사이트를 방문하시기 바랍니다.

Java 값 전달 및 참조 전달에 대한 자세한 내용은 PHP 중국어 웹사이트를 참고하세요!

관련 라벨:
원천:php.cn
본 웹사이트의 성명
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.
인기 튜토리얼
더>
최신 다운로드
더>
웹 효과
웹사이트 소스 코드
웹사이트 자료
프론트엔드 템플릿