Java Language
객체 참조
수색…
비고
이것은 "Null Pointer Exception"을 이해하는 데 도움이됩니다. 객체 참조가 null이기 때문에 그 중 하나를 얻지 만 프로그램 코드는 프로그램이 객체 참조에 무언가를 사용하기를 기대합니다. 그러나, 그 자체의 주제에 합당한 ...
메소드 매개 변수로서의 객체 참조
이 주제에서는 오브젝트 참조 의 개념을 설명합니다. 자바 프로그래밍에 익숙하지 않은 사람들을 대상으로합니다. 클래스 정의, 메인 메소드, 객체 인스턴스, 객체에 "on"메소드를 호출하고 메소드에 매개 변수를 전달하는 것과 같은 몇 가지 용어와 의미에 대해 잘 알고 있어야합니다.
public class Person {
private String name;
public void setName(String name) { this.name = name; }
public String getName() { return name; }
public static void main(String [] arguments) {
Person person = new Person();
person.setName("Bob");
int i = 5;
setPersonName(person, i);
System.out.println(person.getName() + " " + i);
}
private static void setPersonName(Person person, int num) {
person.setName("Linda");
num = 99;
}
}
Java 프로그래밍을 완벽하게 수행하려면이 예를 머리 위쪽에있는 다른 사람에게 설명 할 수 있어야합니다. 이 개념은 Java가 작동하는 방식을 이해하는 기본입니다.
보시다시피, 우리는 변수 person
객체를 인스턴스화하는 main
을 가지고 있고, 그 객체의 name
필드를 "Bob"
으로 설정하는 메소드를 호출합니다. 그런 다음 다른 메소드를 호출하고 person
을 두 개의 매개 변수 중 하나로 전달합니다. 다른 매개 변수는 5로 설정된 정수 변수입니다.
호출 된 메소드는 전달 된 객체의 name
값을 "Linda"로 설정하고 전달 된 정수 변수를 99로 설정 한 다음 반환합니다.
그래서 무엇이 인쇄 될까요?
Linda 5
그렇다면 왜 person
대한 변경이 main
에서 효력을 발생합니까? 그러나 정수에 대한 변경은 그렇지 않습니다.
호출이 발생하면 main 메소드는 person
에 대한 객체 참조 를 setPersonName
메소드에 전달합니다. setAnotherName
이 해당 객체에 대해 변경 한 사항은 해당 객체의 일부이므로 메소드가 반환 될 때 해당 변경 사항이 해당 객체의 일부가됩니다.
동일한 것을 말하기위한 또 다른 방법 : person
이 객체를 가리키고 (관심이 있다면 힙에 저장 됨). 메소드가 해당 객체에 대해 수행 한 모든 변경은 "해당 객체에서"수행되며 변경하는 메소드가 여전히 활성 상태인지 또는 반환되었는지 여부에 영향을받지 않습니다. 메서드가 반환되면 개체에 대한 모든 변경 내용이 해당 개체에 저장됩니다.
이것을 전달 된 정수와 대조하십시오. 이것은 원시 int (Integer 객체 인스턴스가 아님)이므로 "값을 기준으로"전달됩니다. 즉, 전달 된 원래 정수에 대한 포인터가 아닌 해당 값이 메서드에 제공됩니다. 메소드는 메소드의 자체 목적이지만 메소드 호출이 사용될 때 사용되는 변수에는 영향을 미치지 않습니다.
Java에서는 모든 프리미티브가 값으로 전달됩니다. 객체는 참조로 전달됩니다. 즉, 객체에 대한 포인터가 매개 변수로 가져 오는 메소드에 전달됩니다.
덜 명백한 점은 호출 된 메서드가 새 객체를 만들고 매개 변수 중 하나로 반환 할 수 없음을 의미합니다. 메소드가 메소드 호출에 의해 직접 또는 간접적으로 작성된 오브젝트를 리턴하는 유일한 f}은 메소드의 리턴 값입니다. 처음에는 어떻게 작동하지 않는지, 어떻게 작동하는지 봅시다.
우리의 작은 예제에 또 다른 방법을 추가해 보겠습니다.
private static void getAnotherObjectNot(Person person) {
person = new Person();
person.setName("George");
}
main
에 setAnotherName
대한 호출 아래에서이 메서드와 다른 println 호출을 호출 해 봅시다.
getAnotherObjectNot(person);
System.out.println(person.getName());
이제 프로그램은 다음과 같이 출력 할 것입니다 :
Linda 5
Linda
조지가 있었던 물건은 어떻게 된거야? 음, 전달 된 매개 변수는 Linda에 대한 포인터였습니다. getAnotherObjectNot
메소드가 새 객체를 getAnotherObjectNot
Linda 객체에 대한 참조가 George 객체에 대한 참조로 바뀌 었습니다. Linda 객체가 (힙에) 여전히 존재하지만, main
메소드는 여전히 그 getAnotherObjectNot
접근 할 수 있습니다. 그러나 getAnotherObjectNot
메소드는 아무런 참조가 없으므로 이후에 아무 것도 할 수 없습니다. 코드의 작성자가 메서드를 사용하여 새 객체를 만들고 다시 전달할 것으로 보이지만 그렇지 않으면 작동하지 않습니다.
그것이 작가가하기를 원하는 것이라면, 그는 다음과 같이 메소드에서 새로 생성 된 객체를 반환해야합니다.
private static Person getAnotherObject() {
Person person = new Person();
person.setName("Mary");
return person;
}
다음과 같이 호출하십시오.
Person mary;
mary = getAnotherObject();
System.out.println(mary.getName());
전체 프로그램 출력은 다음과 같습니다.
Linda 5
Linda
Mary
다음은 두 프로그램이 모두 포함 된 전체 프로그램입니다.
public class Person {
private String name;
public void setName(String name) { this.name = name; }
public String getName() { return name; }
public static void main(String [] arguments) {
Person person = new Person();
person.setName("Bob");
int i = 5;
setPersonName(person, i);
System.out.println(person.getName() + " " + i);
getAnotherObjectNot(person);
System.out.println(person.getName());
Person person;
person = getAnotherObject();
System.out.println(person.getName());
}
private static void setPersonName(Person person, int num) {
person.setName("Linda");
num = 99;
}
private static void getAnotherObjectNot(Person person) {
person = new Person();
person.setMyName("George");
}
private static person getAnotherObject() {
Person person = new Person();
person.setMyName("Mary");
return person;
}
}