자바 에서 함수 가 값 전달 인지 인용 전달 인지 연구
일단 콘 셉 트 를 소개 해 드릴 게 요.
값 전달:(형식 매개 변수 유형 은 기본 데이터 유형):방법 호출 시 실제 매개 변 수 는 해당 하 는 형식 매개 변수 에 값 을 전달 합 니 다.형식 매개 변 수 는 실제 매개 변수의 값 으로 자신의 저장 장치 내용 을 초기 화 할 뿐 서로 다른 저장 장치 이기 때문에 방 법 집행 에서 형식 매개 변수 값 의 변 화 는 실제 매개 변수의 값 에 영향 을 주지 않 습 니 다.
인용 전달:(형식 매개 변수 유형 은 데이터 형식 매개 변수 참조):전송 주소 라 고도 합 니 다.방법 호출 시 실제 매개 변 수 는 대상(또는 배열)이다.이때 실제 매개 변수 와 형식 매개 변 수 는 같은 주 소 를 가리킨다.방법 집행 에서 형식 매개 변수 에 대한 조작 은 실제 매개 변수 에 대한 조작 이다.이 결 과 는 방법 이 끝 난 후에 보류 되 고 방법 집행 에서 형식 매개 변수의 변 화 는 실제 매개 변수 에 영향 을 줄 것 이다.
예 를 하나 보 겠 습 니 다.
public class Test1 {
public static void main(String[] args) {
int a = 10;
changeNum(a);
System.out.println("main a=" + a);
}
static void changeNum(int a) {
a = 100;
System.out.println("changeNum a=" + a);
}
}
결과:changeNum a=100
main a=10
이 는 기본 적 인 수치 유형 에 대해 사실은 하나의 수치의 복사 본 을 전달 하고 함수 에 들 어간 후에 원래 의 값 과 관계 가 없 으 며 함수 에서 이 수의 값 을 바 꾸 어도 원래 의 값 에 영향 을 주지 않 는 다 는 것 을 의미한다.
예 를 하나 더 보다.
public class P {
String name = "P";
public P(String name) {
this.name = name;
}
@Override
public String toString() {
return name;
}
}
public class Test {
static P p1 = new P("p1");
public static void main(String[] args) {
P p = new P("P");
System.out.println("before change p:" + p.toString);
changeObj(p);
System.out.println("after change p:" + p.toString());
}
static void changeObj(P p) {
p = new P("pp");
System.out.println("change p:" + p.toString());
//p = p1;
//System.out.println(p.toString());
}
}
이 예 에서 의 운행 결 과 는 무엇 일 까요?이 예 에서 들 어 오 는 것 은 대상 형식의 데이터 입 니 다.
먼저 추측 해 보 겠 습 니 다.만약 에 들 어 온 것 이 대상 의 인용 이 라면 함수 에서 이 인용 이 가리 키 는 대상 을 바 꾸 었 습 니 다.그러면 외부 인용'p'는 새로 만 든 P('pp')의 대상 을 가리 키 는 것 이 어야 합 니 다.
그래서 추측 한 결 과 는:
before change p:P
change p:pp
after change p:pp
그럼 결 과 를 실제 운행 해 봅 시다.실제 결 과 는:
before change p:P
change p:pp
after change p:P
생각 하 는 게 달라!!!
이것 은 우리 로 하여 금 매우 의 심 스 럽 게 한다.왜 함수 가 인용 이 가리 키 는 대상 을 바 꾸 지 않 았 을 까?
사실은 이 렇 습 니 다.먼저'='할당 작업 의 의 미 를 이해 해 야 합 니 다.
기본 형식 에 있어 서"="할당 작업 은 메모리 주소 의 값 을 직접 바 꾸 는 것 입 니 다.
인용 형식 에 있어'='할당 은 인용 변수 가 가리 키 는 메모리 주 소 를 바 꾸 는 것 입 니 다.
할당 작업 후
인용 한 할당 값 은 원래 의 대상 에 영향 을 주지 않 았 습 니 다.'hello'대상 은 여전히 존재 합 니 다.다만 str 는 새로운'World'대상 을 가리 키 고 있 습 니 다.
할당 작업 을 이해 한 후,현재 함수 의 매개 변 수 를 전달 합 니 다.
함수 의 매개 변 수 는 실제 적 으로 함수 내부 의 국부 변수 이 고 외부 에서 이 매개 변 수 를 전달 하 는 것 은 실제 적 으로 값 을 부여 하 는 과정 이다.
첫 번 째 예 를 들 어 int 형식 이름 을 a 로 정의 하 는 형식 매개 변 수 를 전달 합 니 다.사실은 이름 을 b 로 바 꿀 수 있 습 니 다.
그 다음 에 외부 변수 a 의 값 을 함수 에 전달 하 는 변 수 는 바로 할당 입 니 다.기본 유형의 할당 은 외부 a 변수의 10 할당 을 함수 변수 a 에 주 는 것 입 니 다.그래서 이것 은 두 개의 변수 이 고 이들 은 아무런 관계 가 없습니다.
따라서 함수 내부 변수 에 대한 변화 도 외부 변수 에 영향 을 주지 않 습 니 다.
다시 말 하면 인용 유형의 전달 은 사실 하나의 이치 이다.
전달 할 때 한 대상 의 메모리 주 소 를 함수 내부 의 참조 형식 에 할당 하 는 부분 변수 입 니 다.
위의 그림 에서 보 듯 이 두 변 수 는 같은 대상 을 가리킨다.
두 번 째 예 에서 우 리 는 함수 내부 에 대상 을 새로 만 들 고 내부 변수 p 에 값 을 다시 부여 합 니 다.사실은 내부 변수의 인용 이 가리 키 는 대상 을 바 꾸 었 습 니 다.아래 그림 과 같 습 니 다.
그래서 외부 p 변 수 는 영향 을 주지 않 습 니 다.
요약:
함수 매개 변수 전달 은 사실 값 을 부여 하 는 과정 이 고 기본 유형 은 수치 이 며 유형 이 전달 하 는 참조 대상 의 메모리 주 소 를 참조 합 니 다.
또 하 나 는 함수 의 매개 변 수 는 함수 내부 의 부분 변수 임 을 주의해 야 한다.외부 변수 와 혼동 하지 마 세 요.
위 에서 말 한 것 은 편집장 이 여러분 에 게 소개 한 자바 의 함수 가 값 전달 인지 인용 전달 인지 에 대한 문제 입 니 다.여러분 에 게 도움 이 되 기 를 바 랍 니 다.궁금 한 점 이 있 으 시 면 저 에 게 메 시 지 를 남 겨 주세요.편집장 은 제때에 여러분 에 게 답 할 것 입 니 다.여기 서도 저희 사이트 에 대한 여러분 의 지지 에 감 사 드 립 니 다!
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
Is Eclipse IDE dying?In 2014 the Eclipse IDE is the leading development environment for Java with a market share of approximately 65%. but ac...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.