java - 请问下,这里为何会引发空指针异常?
黄舟
黄舟 2017-04-18 10:50:14
0
3
564

有人跟我讲,将name进行静态赋值即可,但实例变量不也是属于成员变量吗,也是在整个类实例化的时候产生的啊,跟静态赋值有何区别吗?

黄舟
黄舟

人生最曼妙的风景,竟是内心的淡定与从容!

모든 응답(3)
伊谢尔伦

상위 클래스의 생성자는 하위 클래스의 생성자보다 먼저 실행되며, Base()->test()-->name.length()null.length()과 동일합니다.
name을 정적으로 작성하면 물론 괜찮습니다. 인스턴스 멤버가 초기화되기 전에 정적 멤버가 초기화되기 때문입니다.

순서는 대략 다음과 같습니다.

  • 학부모반static{...}

  • 상위 클래스의 정적 멤버

  • 부모 클래스 구축 방법

  • 하위 클래스static{...}

  • 하위 클래스 정적 멤버

  • 하위 클래스 구축 방법

巴扎黑

먼저 개념을 버리고 객체의 초기화 프로세스:
静态变量 > 静态初始化块 > 实例变量 > 构造器
부모-자식 클래스 관계가 있는 객체의 경우 중첩된 초기화 프로세스가 있습니다
父类初始化流程 > 子类初始化流程

따라서 인스턴스화 프로세스 중에 상위 클래스 생성자를 호출하고 test() 메서드를 호출하면 하위 클래스의 name에는 아직 값이 할당되지 않았고 여전히 null이므로 null 포인터는 자연스럽게 보고되었습니다.

小葫芦

부모 클래스 nameBase을 정의하면 오류가 발생하지 않습니다. Sub을 인스턴스화하면 기본 생성자가 호출되고 기본 생성자는 상위 클래스의 생성자를 호출하기 때문에 상위 클래스의 생성자에서 test() 메서드를 사용하고 하위 클래스에 있습니다. 이 메소드를 다시 작성하여 서브클래스의 test 메소드에 name을 사용하고 있는데, 현재 name는 아직 초기화가 완료되지 않았습니다. 그래서 NullPointerException 신고하겠습니다.

최신 다운로드
더>
웹 효과
웹사이트 소스 코드
웹사이트 자료
프론트엔드 템플릿