>  Q&A  >  본문

java - 请问下,这里为何会引发空指针异常?

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

黄舟黄舟2743일 전528

모든 응답(3)나는 대답할 것이다

  • 伊谢尔伦

    伊谢尔伦2017-04-18 10:52:14

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

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

    • 학부모반static{...}

    • 상위 클래스의 정적 멤버

    • 부모 클래스 구축 방법

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

    • 하위 클래스 정적 멤버

    • 하위 클래스 구축 방법

    회신하다
    0
  • 巴扎黑

    巴扎黑2017-04-18 10:52:14

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

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

    회신하다
    0
  • 高洛峰

    高洛峰2017-04-18 10:52:14

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

    회신하다
    0
  • 취소회신하다