5년 동안 Java로 작업, 오늘 "가치에 의한 전달"로 큰 놀라움을 얻었습니다.
5649 단어 javadevjournal
그 전에는 스택과 힙, 모든 것이 값으로 전달되는 Java 규칙을 알고 있었습니다.
그리고 값은 힙에 있는 객체가 아니라 스택에 저장되는 참조 주소를 의미합니다.
이 질문을 살펴보겠습니다.
이 실행 코드의 출력은 무엇입니까?
class Person {
private String name;
public Person(String name) {this.name = name;}
public String toString() {return name;}
}
public class Tester {
public static Person checkPerson(Person p) {
if (p == null) {
p = new Person("Joe");
} else {
p = null;
}
return p;
}
public static void main(String[] args) {
Person p = null;
checkPerson(p);
System.out.print(p);
p = new Person("Mary");
checkPerson(p);
System.out.print(p);
}
}
대답
가) 조눌
B) 널널
다) 메리널
D) nullMary
checkPeson() 메소드 로직
if (p == null) {
p = new Person("Joe");
} else {
p = null;
}
아하, 첫 번째 인쇄는 "Joe"여야 합니다. null을 전달하기 때문입니다.
망설임 없이 바로 답 A - 조눌을 선택하지만 정답은 D) nullMary
무엇을 기다립니다? 첫 번째 인쇄는 null입니다.
하지만 이미 메소드에 p = new Person("Joe") 이 있습니까?
I start to doubt about did Java pass the reference of object to the method?
미친 인터넷 검색 끝에 마침내 그 이유를 이해했습니다.
By simple value in "everything pass by value" mean a copy of reference address value (not the real reference value)
메서드에 전달하는 매개변수는 실제 매개변수의 복제본이며 로컬 변수(메서드 본문 내에서 선언된 변수)입니다.
실제 값은 여전히 null 값을 가리키며 메서드 실행 후 아무런 효과가 없습니다.
정답이 있는 이유 nullMary
소프트웨어 개발에서 7년, Java에서 5년을 보낸 후, 아, 부끄러운 일입니다. 언젠가는 선배지만 이 이후에는 모든 것이 무너집니다.
이 중요한 포인트가 나에게 없다는 것을 믿을 수 없었습니다.
내 변명
대학에서 Java를 배우고 C#으로 처음 직장을 잡은 후 Ruby, VBA를 배우고 마지막으로 Java로 복귀
내가 일하는 방식은 여전히 좋고, 고객은 문제가 빨리 해결되는 것을 좋아하고 나는 우리 팀에서 슈퍼스타와 같습니다.
그러나 나에게는 속도를 늦추고 코드를 위해 Google 대신 개념을 배우고 시행 착오 방법을 사용할 때입니다.
Reference
이 문제에 관하여(5년 동안 Java로 작업, 오늘 "가치에 의한 전달"로 큰 놀라움을 얻었습니다.), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://dev.to/docvominh/5-years-working-with-java-got-big-surprise-today-with-pass-by-value-1d0n텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)