자바 에서 함수 가 값 전달 인지 인용 전달 인지 연구

어떤 학우 들 은 나 와 마찬가지 로 일찍이 이 문제 에 대해 매우 의 심 스 러 웠 다 고 믿는다.인터넷 에서 도 다른 사람 이 말 하 는 관점 을 보고 평론 이 다르다.가치 전달 과 인용 전달 두 가지 가 있 고 가치 전달 만 있다 는 말 도 있 습 니 다.여기 서 개인 적 인 견해 만 말씀 드 리 겠 습 니 다.
일단 콘 셉 트 를 소개 해 드릴 게 요.
값 전달:(형식 매개 변수 유형 은 기본 데이터 유형):방법 호출 시 실제 매개 변 수 는 해당 하 는 형식 매개 변수 에 값 을 전달 합 니 다.형식 매개 변 수 는 실제 매개 변수의 값 으로 자신의 저장 장치 내용 을 초기 화 할 뿐 서로 다른 저장 장치 이기 때문에 방 법 집행 에서 형식 매개 변수 값 의 변 화 는 실제 매개 변수의 값 에 영향 을 주지 않 습 니 다.
인용 전달:(형식 매개 변수 유형 은 데이터 형식 매개 변수 참조):전송 주소 라 고도 합 니 다.방법 호출 시 실제 매개 변 수 는 대상(또는 배열)이다.이때 실제 매개 변수 와 형식 매개 변 수 는 같은 주 소 를 가리킨다.방법 집행 에서 형식 매개 변수 에 대한 조작 은 실제 매개 변수 에 대한 조작 이다.이 결 과 는 방법 이 끝 난 후에 보류 되 고 방법 집행 에서 형식 매개 변수의 변 화 는 실제 매개 변수 에 영향 을 줄 것 이다.
예 를 하나 보 겠 습 니 다.

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 변 수 는 영향 을 주지 않 습 니 다.
요약:
함수 매개 변수 전달 은 사실 값 을 부여 하 는 과정 이 고 기본 유형 은 수치 이 며 유형 이 전달 하 는 참조 대상 의 메모리 주 소 를 참조 합 니 다.
또 하 나 는 함수 의 매개 변 수 는 함수 내부 의 부분 변수 임 을 주의해 야 한다.외부 변수 와 혼동 하지 마 세 요.
위 에서 말 한 것 은 편집장 이 여러분 에 게 소개 한 자바 의 함수 가 값 전달 인지 인용 전달 인지 에 대한 문제 입 니 다.여러분 에 게 도움 이 되 기 를 바 랍 니 다.궁금 한 점 이 있 으 시 면 저 에 게 메 시 지 를 남 겨 주세요.편집장 은 제때에 여러분 에 게 답 할 것 입 니 다.여기 서도 저희 사이트 에 대한 여러분 의 지지 에 감 사 드 립 니 다!

좋은 웹페이지 즐겨찾기