상위 클래스의 생성자는 하위 클래스의 생성자보다 먼저 실행되며, Base()->test()-->name.length()는 null.length()과 동일합니다. name을 정적으로 작성하면 물론 괜찮습니다. 인스턴스 멤버가 초기화되기 전에 정적 멤버가 초기화되기 때문입니다.
부모 클래스 name에 Base을 정의하면 오류가 발생하지 않습니다. Sub을 인스턴스화하면 기본 생성자가 호출되고 기본 생성자는 상위 클래스의 생성자를 호출하기 때문에 상위 클래스의 생성자에서 test() 메서드를 사용하고 하위 클래스에 있습니다. 이 메소드를 다시 작성하여 서브클래스의 test 메소드에 name을 사용하고 있는데, 현재 name는 아직 초기화가 완료되지 않았습니다. 그래서 NullPointerException 신고하겠습니다.
상위 클래스의 생성자는 하위 클래스의 생성자보다 먼저 실행되며,
Base()->test()-->name.length()
는null.length()
과 동일합니다.name
을 정적으로 작성하면 물론 괜찮습니다. 인스턴스 멤버가 초기화되기 전에 정적 멤버가 초기화되기 때문입니다.순서는 대략 다음과 같습니다.
학부모반
static{...}
상위 클래스의 정적 멤버
부모 클래스 구축 방법
하위 클래스
static{...}
하위 클래스 정적 멤버
하위 클래스 구축 방법
먼저 개념을 버리고 객체의 초기화 프로세스:
静态变量 > 静态初始化块 > 实例变量 > 构造器
부모-자식 클래스 관계가 있는 객체의 경우 중첩된 초기화 프로세스가 있습니다
父类初始化流程 > 子类初始化流程
따라서 인스턴스화 프로세스 중에 상위 클래스 생성자를 호출하고
test()
메서드를 호출하면 하위 클래스의name
에는 아직 값이 할당되지 않았고 여전히null
이므로 null 포인터는 자연스럽게 보고되었습니다.부모 클래스
name
에Base
을 정의하면 오류가 발생하지 않습니다.Sub
을 인스턴스화하면 기본 생성자가 호출되고 기본 생성자는 상위 클래스의 생성자를 호출하기 때문에 상위 클래스의 생성자에서test()
메서드를 사용하고 하위 클래스에 있습니다. 이 메소드를 다시 작성하여 서브클래스의test
메소드에name
을 사용하고 있는데, 현재name
는 아직 초기화가 완료되지 않았습니다. 그래서NullPointerException
신고하겠습니다.