방법 호출은 표준 컴퓨터 과학 용어입니다. 메소드 통화는 매개 변수 전달 상황에 따라 값 호출 (참조 별 호출) 및 참조 통화 (값별로)로 나뉩니다. 세계에는이 두 가지 유형의 전화에 대한 많은 정의가 있습니다. 가장 일반적인 말은 값이 값 호출이고 주소는 참조 호출이라는 것입니다. 이것은 실제로 매우 부적절합니다. 이 진술은 Java의 객체 매개 변수 전달이 참조 호출임을 쉽게 상기시킬 수 있습니다. 실제로 Java의 객체 매개 변수 전달은 여전히 값 호출입니다.
먼저 코드를 사용하여 Java Object 매개 변수가 통과하는 이유를 확인하겠습니다.
공개 클래스 직원 {public String name = null; 공공 직원 (문자열 n) {this.name = n; } // 두 명의 직원 개체 스왑 공용 정적 무효 스왑 (Employee E1, Employee E2) {Employee temp = e1; e1 = e2; e2 = 온도; System.out.println (e1.name+""+e2.name); // 인쇄 결과 : Li Si Zhang San} // 메인 함수 public static void main (String [] args) {Employee Worker = New Employee ( "Zhang San"); 직원 관리자 = 신입 사원 ( "Li Si"); 스왑 (작업자, 관리자); System.out.println (worker.name+""+manger.name); // 인쇄 결과는 여전히 다음과 같습니다. Zhang San Li Si}}위의 결과는 매우 실망 스럽습니다. 공식 매개 변수 객체 E1 및 E2의 내용이 교환되었지만 실제 매개 변수 객체 작업자와 관리자는 내용을 교환하지 않았습니다. 여기서 가장 중요한 이유는 공식 매개 변수 E1 및 E2가 실제 매개 변수 작업자 및 관리자의 주소 사본이기 때문입니다.
우리 모두 알다시피, Java에서 객체 변수 이름은 실제로 힙의 객체의 주소를 나타냅니다 (전문 용어를 객체 참조라고합니다). Java 메소드가 호출되면 매개 변수는 객체에 대한 참조를 전달합니다. 중요하게도, 공식적인 매개 변수와 실제 매개 변수에 의해 점유 된 메모리 주소는 동일하지 않습니다. 공식 매개 변수의 내용은 실제 매개 변수에 저장된 객체 참조의 사본 일뿐입니다.
JVM 메모리 관리 ( "Java Virtual Machine Architecture"참조)에서 Java 스택의 로컬 가변 영역을 이해하고 있다면 위의 문장을 잘 이해할 수 있습니다. JVM이 위의 프로그램을 실행하면 기본 메소드를 실행하면 스왑 메소드가 Java 스택에서 스택 프레임이라는 두 개의 메모리 공간을 푸시합니다. 메인 스택 프레임에는 로컬 변수 영역이라는 메모리가 있습니다. 실제 매개 변수 객체 작업자 및 관리자에 대한 참조를 저장합니다. 스왑 스택 프레임의 로컬 변수 영역은 공식 매개 변수 객체 E1 및 E2에 대한 참조를 저장합니다. E1 및 E2의 기준 값은 작업자 및 관리자의 기준 값과 동일하지만 다른 메모리 공간을 차지합니다. E1과 E2 사이의 참조가 교환되면 아래 그림은 그것이 작업자와 관리자의 기준 값에 전혀 영향을 미치지 않음을 분명히 보여줍니다.
주소 (참조)가 전달되지만 Java Object 매개 변수 전달은 여전히 값 호출입니다. 이제 참조 통화 및 가치를 정확한 정의로 제공 할 때입니다.
값으로 호출 : 매개 변수 전달 프로세스 중에 공식 매개 변수와 실제 매개 변수는 완전히 다른 두 가지 메모리 공간을 차지합니다. 공식 매개 변수에 의해 저장된 내용은 실제 매개 변수에 의해 저장된 내용의 사본입니다. 실제로, Java 객체의 통과는 공식 매개 변수와 실제 매개 변수에 의해 저장된 내용이 기존의 의미에서 변수 값이 아니라 변수의 주소라는 점을 제외 하고이 정의를 충족합니다. 글쎄, 다시 생각하십시오 : 변수의 주소도 값이 아닌가?
참조로 호출 : 매개 변수 통과 프로세스 중에 공식 매개 변수와 실제 매개 변수는 완전히 동일한 메모리 공간이며, 둘은 서로 구별되지 않습니다. 실제로 공식 매개 변수 이름과 실제 매개 변수 이름은 프로그래밍에서 다른 기호입니다. 프로그램 작업 중에 메모리에 저장된 공간이 가장 중요한 것입니다. 다른 변수 이름은 메모리 저장 공간을 다르게 점유하지 않습니다.
일반적으로, 두 호출의 기본 사항은 값 또는 주소가 전달되는지 (결국 주소도 값이라도) 공식 매개 변수와 실제 매개 변수가 동일한 메모리 공간을 차지하는지 여부입니다. 실제로 C/C ++로 전달되는 포인터 매개 변수도 값 호출입니다. 믿지 않으면 다음 C 코드를 사용해보십시오!
#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); 스왑 (a, b); printf ( " %d %d/n",*a,*b); 반환 0; }그러나 C/C ++는 참조 호출을 가지고 있으며, 이는 참조 int a라는 가변 선언 방법입니다. int & ra = a; 여기서 ra는 a의 별칭입니다. 메모리에서 둘 사이에는 차이가 없으며 동일한 메모리 공간을 차지합니다. 참조 (별칭)를 통해 매개 변수를 전달하는 것은 참조 통화의 특성과 일치합니다. void swap (int & a1, int & b1)의 실행 결과를 시도 할 수 있습니다.
이 기사를 통해 Java 메소드 매개 변수를 참조 또는 값이라고하는지 알아야합니다.