자바 파라미터 전달이 "값"이거나 "는 참조에 의해 전달"?

자바 프로그래밍 언어는 가장 큰 퍼즐 중 하나입니다 자바가되는 값에 의해 전달 되는 참조에 의해 전달 . 나는 종종이 질문 면접에서 면접관을 요청하지만, 문제의 이해가 매우 옳지 않아 많은 면접은 여전히 존재한다.
여기에 그림 삽입 설명
많은 인터뷰는이 방법을 이해할 수있다 :

  • 데이터의 유형에 기초하여, 투과형의 경우, 전사 프레스 값
  • 투과형의 기반이되는 경우 레퍼런스를 누른다.

정확이 이해? 그들은 심지어 우리가 대부분의 사람들이 "참조로 값이 아닌 기본 유형 패스에 의해 전달 된 기본 유형"을 확인하는 방법을 함께 살펴 보자, 자신의 아이디어를 테스트하기 위해 샘플 코드를 작성할 수있는 아이디어는 :

매개 변수로 전달 기본 데이터 유형

/**
 * 基础类型数据作为参数传递
 * @Author: danding
 * @Date: 2019/11/5
 */
public class TestParams {

    public static void main(String[] args){
        int x = 6;
        System.out.println("x的初始值为:" + x);
        add(x);
        System.out.println("x的最终值为:" + x);
    }

    public static void add(int x){
        x = x + 1;
        System.out.println("add 方法中的x值为:" + x);
    }

}

결과 :

x的初始值为:6
add 方法中的x值为:7
x的最终值为:6

인수로 비 기본 유형
첫째, 우리는 클래스를 정의

/**
 * 定义一个女朋友的类
 * (简陋了点,只有年龄,但不影响我们使用呀)
 * @Author: danding
 * @Date: 2019/11/5
 */
public class GrilFriend {
    private int age;

    public GrilFriend(int age) {
        this.age = age;
    }

    public int getAge() {
        return age;
    }

    public void setAge(int age) {
        this.age = age;
    }
}

그런 다음 우리는 인스턴스를 생성하고 매개 변수로 전달합니다

/**
 * 基础类型数据作为参数传递
 * @Author: danding
 * @Date: 2019/11/5
 */
public class TestParams {

    public static void main(String[] args){
        GrilFriend gril = new GrilFriend(18);
        System.out.println("女朋友的初始年龄为:" + gril.getAge());
        add(gril);
        System.out.println("女朋友的最终年龄为:" + gril.getAge());
    }

    private static void add(GrilFriend friend){
        friend.setAge(friend.getAge()+1);
        System.out.println("女朋友在方法中的年龄为:" + friend.getAge());
    }

}

결과 :

女朋友的初始年龄为:18
女朋友在方法中的年龄为:19
女朋友的最终年龄为:19

인수로 비 기본 유형이 값은 실제로 수정 될 때.

많은 학생들이 시간은 위의 두 가지 예를 확인하기 위해, 그들은 자신의 결론에 도달한다 :

당신이 전달하는 경우 기본 데이터 유형은 다른 참조에 의해 전달 값 전송 프레스의 유형이다.

이 설명에서, 이러한 이해는 잘못, 잘못된, 틀린 . 여기서 우리는 결국 자바 파라미터 지나가는 값으로 전달하거나 전달 참조 우려 있습니까?

먼저, 그 정답 : 는 기본 데이터 유형이나 파라미터의 참조 타입인지 자바 파라미터 전달이없는 기준 통과하여 값으로 전달된다!

첫째, 우리는 값으로 패스의 의미를 이해하거나 참조로 전달해야합니다.

  • 값으로 전달 : 메소드 파라미터 값을 다른 변수에 복사하고 복사 대상물을 통과 그것을 통과 값이라한다.
  • 참조로 전달 : 방법에 따라 실제 파라미터 또는 별명에 대한 참조를 전달 참조로 전달 이유라고.

Dehen 나쁜 당신이 나쁜 노인, 난 당신이 나쁜 리뷰를 설명 할게, 당신은 귀신 믿는 .....

천천히 오는 할머니 (아, 아니, 작은 시리즈)에 들어 ...

객체는 메소드의 파라미터로서 전달 될 때,이 방법에서는 단부 인 "으로 값 패스"또는 "는 참조에 의해 전달"로 여기에, 오브젝트의 속성을 변경할 수 있는가?

A : 예, 값에 의해 전달. 자바 언어에만 "값으로."매개 변수를 전달 방법 매개 변수로 오브젝트 인스턴스에 전달되면, 상기 파라미터 값은 참조 된 객체의 복사본이다. 같은 객체에 대한 포인트, 방법에서 변경 될 수 있습니다 콘텐츠 객체라고하지만, 객체 참조 (참조가 아닌 사본)을 변경하지 않습니다.

매개 변수 전달의 유형에 기초

값에 의해 전달로 위의 예는 이것이 우리가 이의가 없어야합니다, 확인되었습니다.

비 기반 형 송신 파라미터

객체의 다음 유형에 대한 우리의 초점은 매개 변수로 전달

예 이전에 먼저보기 :

public class TestParams {

    public static void main(String[] args){
        Person p1 = new Person();
        System.out.println(p1);
        change(p1);
        System.out.println(p1);
    }

    private static void change(Person p2){
        p2 = new Person();
    }

}

class Person{

}

영업 실적

Person@677327b6
Person@677327b6

인쇄는 2 개 개의 어드레스 값 동일인임을 알 수 후, 즉 전체 통화의 변화 () 메소드는 인 변수는 변경되지.

이는 다음과 같이 전사 공정의 개략은 다음과

는 Person P1 = 새로운 사람 ()을 수행 할 때, 타임 코드를 상기 힙 메모리에 저장된 Person 클래스 오브젝트의 인스턴스를 열어 프로그램 메모리 공간, 메모리 셀이 동시에 스택 메모리 개방 메모리 셀 인 상기 도면에 객체 참조 인스턴스, 즉 포인트를 저장하는 데 사용.

사용자가 저장 부 변화 내용을 전송할 변수 P2의 () 메소드 : 상기 변경 (P1)를 수행 할 때의 코드 인 경우, 파라미터로서 전달 명이 변경 () 메소드는 것을 주목해야한다! 이후, P2에 대한 저장 장치의 모든 동작의 변화 ()에있어서, 상기 메모리 셀과 아무은 사람 지적 않음 P2 점이다!

여자 친구의 예를 위, 시대의 여자 친구가 아직 과정에서 수정되지 않는 학생들이 말을 이번에는? 당신이 그것의 사본을 전달하는 경우에는 연령의 여자 친구가 할 수정하지 않겠습니까?

우리는도 1의 예에서 메모리 여자 친구에 코드를 다시 걸을 경우, 당신은 그들의 진실을 이해해야합니다.
참조 사본 이른바하지만 포인트 나 실물은 수정하거나 실제 개체에 대한 속성입니다.

난 그냥 기억, 위의 설명은 모든 의심을 제거 할 수 있기를 바랍니다 자바 매개 변수 전달,이 값에 의해 전달되는 기본 데이터 유형 또는 매개 변수 참조의 유형인지 여부, 참조에 의해 전달하지! . 당신은 메모리와 저장 공간이 다른 개체와 프로그램의 더 명확하고 상세한 설명을 할 것이다, 참조의 지역을 힙을 이해하고 스택 때 읽기 자바 힙 스택 VS를 .


당신이 할 수있는 미래에 "짧은 단계, 천 마일,"희망 : 사방 꿈의 말 서식지가있다! 주니어 어서!

있는 공개 문제 : "자바 자신감" , 매일 업데이트 자바 지식 오, 당신의 도착을 기대하지 않습니다!

  • "보내기 그룹 10 프로그래머, 진행 상황을".
  • "보내기 인터뷰를 정보 BATJ 인터뷰, 비디오 인터뷰 해적을받을."
  • "보내기 재미 알고리즘을 비디오 자습서의"재미 알고리즘 "시리즈를 받기 위해".
  • "보내지 마십시오 1024 "...
    매일 혜택

추천

출처www.cnblogs.com/java-friend/p/11797656.html