pass-by-value - 자바 매개변수 객체 - Java는 "참조에 의한 전달"또는 "값에 의한 전달"입니까?

자바 매개변수 전달 방법 / java / methods / parameter-passing / pass-by-reference

나는 항상 Java가 pass-by-reference를 사용한다고 생각했습니다 .

22 revs, 18 users 14%



Answer #1

C ++ : 참고 : 잘못된 코드-메모리 누수! 그러나 그것은 요점을 보여줍니다.

void cppMethod(int val, int &ref, Dog obj, Dog &objRef, Dog *objPtr, Dog *&objPtrRef)
{
    val = 7; // 사본 수정
    ref = 7; // 원래 변수를 수정합니다.
    obj.SetName("obj"); // 전달 된 Dog의 사본을 수정합니다.
    objRef.SetName("objRef"); // 전달 된 원래 Dog 수정
    objPtr->SetName("objPtr"); // 가리키는 원래 Dog를 수정합니다.
                               // 전달 된 포인터의 복사본에 의해.
    objPtr = new Dog("newObjPtr");  // 포인터의 복사본을 수정합니다.
                                   // 원래 객체를 그대로 둡니다.
    objPtrRef->SetName("objRefPtr"); // 가리키는 원래 Dog를 수정합니다.
                                    // 전달 된 원래 포인터에 의해.
    objPtrRef = new Dog("newObjPtrRef"); // 전달 된 원래 포인터를 수정합니다.
}

int main()
{
    int a = 0;
    int b = 0;
    Dog d0 = Dog("d0");
    Dog d1 = Dog("d1");
    Dog *d2 = new Dog("d2");
    Dog *d3 = new Dog("d3");
    cppMethod(a, b, d0, d1, d2, d3);
    // a는 여전히 0으로 설정됩니다.
    // b는 이제 7로 설정됩니다.
    // d0에는 여전히 "d0"이라는 이름이 있습니다.
    // d1은 이제 "objRef"라는 이름을 갖습니다.
    // d2는 이제 "objPtr"이라는 이름을 갖습니다.
    // d3는 이제 "newObjPtrRef"라는 이름을 갖습니다.
}

자바에서는

public static void javaMethod(int val, Dog objPtr)
{
   val = 7; // 사본 수정
   objPtr.SetName("objPtr") // 가리키는 원래 Dog를 수정합니다.
                            // 전달 된 포인터의 복사본에 의해.
   objPtr = new Dog("newObjPtr");  // 포인터의 복사본을 수정합니다.
                                  // 원래 객체를 그대로 둡니다.
}

public static void main()
{
    int a = 0;
    Dog d0 = new Dog("d0");
    javaMethod(a, d0);
    // a는 여전히 0으로 설정됩니다.
    // d0은 이제 "objPtr"이라는 이름을 갖습니다.
}