5년 동안 Java로 작업, 오늘 "가치에 의한 전달"로 큰 놀라움을 얻었습니다.

5649 단어 javadevjournal
오늘은 OOP에 대한 간단한 Java 시험 문제를 보았습니다.

그 전에는 스택과 힙, 모든 것이 값으로 전달되는 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로 복귀
  • 풀스택 개발자로서 스타일 및 클라이언트 이벤트(javascript, JQuery) 작업에 50%의 시간을 사용합니다
  • 게으른 기술 문서 읽기, 항상 간단한 설명과 블로그를 선호합니다. 가능한 한 빨리 코드를 실행하기를 원하기 때문입니다
  • .

    내가 일하는 방식은 여전히 ​​좋고, 고객은 문제가 빨리 해결되는 것을 좋아하고 나는 우리 팀에서 슈퍼스타와 같습니다.

    그러나 나에게는 속도를 늦추고 코드를 위해 Google 대신 개념을 배우고 시행 착오 방법을 사용할 때입니다.

    좋은 웹페이지 즐겨찾기