Java에서는 객체 전달 메커니즘에 대한 오해가 자주 발생합니다. 이 기사에서는 두 코드 조각의 차이점을 자세히 살펴보고 Java 매개변수 전달 동작의 기본 원칙을 조명합니다.
코드 A:
Foo myFoo; myFoo = createfoo(); public Foo createFoo() { Foo foo = new Foo(); return foo; }
코드 B:
Foo myFoo; createFoo(myFoo); public void createFoo(Foo foo) { Foo f = new Foo(); foo = f; }
일반적인 믿음과는 달리 Java는 참조가 아닌 값에 의한 전달을 활용합니다. 이는 객체가 인수로 전달되면 원본에 대한 직접 참조가 아닌 해당 참조의 복사본이 생성됨을 의미합니다.
첫 번째 줄에서 myFoo는 선언되었지만 할당되지 않았습니다. 두 번째 줄에서는 myFoo에 할당된 새 Foo 개체를 반환하는 createFoo 메서드를 호출합니다. 이 할당은 메소드 내에서 생성된 객체와 다른 새 객체를 생성합니다.
반대로, 코드 B는 myFoo 참조를 createFoo 메소드에 대한 인수로 전달합니다. 메소드 내에서 새로운 Foo 객체가 생성되어 foo 매개변수에 할당됩니다. 이어서 foo는 메소드 내의 지역 변수인 a에 할당됩니다. 이 재할당은 원래 참조 myFoo가 아닌 로컬 참조 foo를 효과적으로 수정합니다.
개념을 설명하려면 다음 클래스를 고려하세요.
public class Foo { private String attribute; public void setAttribute(String attribute) { this.attribute = attribute; } }
메인 클래스:
public class Main { public static void main(String[] args) { Foo f = new Foo("f"); changeReference(f); // Attempt to change reference modifyReference(f); // Attempt to modify object attribute } public static void changeReference(Foo a) { Foo b = new Foo("b"); a = b; } public static void modifyReference(Foo c) { c.setAttribute("c"); } }
메인 메소드 이후 Foo의 인스턴스를 생성하고 이를 f에 할당하고, 다른 객체에 대한 참조를 재할당하려고 시도하는 ChangeReference를 호출합니다. 그러나 이는 f 참조를 변경하지 않습니다.
반대로,modifyReference는 f와 동일한 객체인 c가 참조하는 객체의 속성을 수정합니다. 이는 참조 전달이 객체 자체가 아니라 참조의 복사본을 생성한다는 것을 보여줍니다.
Java의 값에 의한 전달 접근 방식은 원래 객체가 해당 범위 외부에서 의도치 않게 수정되지 않도록 보호하여 객체 불변성을 보장합니다. 이 원칙은 캡슐화를 촉진하고 강력하고 예측 가능한 코드 생성을 촉진합니다.
위 내용은 Java는 값 또는 참조로 객체를 전달합니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!