有人跟我讲,将name进行静态赋值即可,但实例变量不也是属于成员变量吗,也是在整个类实例化的时候产生的啊,跟静态赋值有何区别吗?
伊谢尔伦2017-04-18 10:52:14
상위 클래스의 생성자는 하위 클래스의 생성자보다 먼저 실행되며, Base()->test()-->name.length()
는 null.length()
과 동일합니다. name
을 정적으로 작성하면 물론 괜찮습니다. 인스턴스 멤버가 초기화되기 전에 정적 멤버가 초기화되기 때문입니다.
순서는 대략 다음과 같습니다.
학부모반static{...}
상위 클래스의 정적 멤버
부모 클래스 구축 방법
하위 클래스static{...}
하위 클래스 정적 멤버
하위 클래스 구축 방법
巴扎黑2017-04-18 10:52:14
먼저 개념을 버리고 객체의 초기화 프로세스: 静态变量 > 静态初始化块 > 实例变量 > 构造器
부모-자식 클래스 관계가 있는 객체의 경우 중첩된 초기화 프로세스가 있습니다父类初始化流程 > 子类初始化流程
따라서 인스턴스화 프로세스 중에 상위 클래스 생성자를 호출하고 test()
메서드를 호출하면 하위 클래스의 name
에는 아직 값이 할당되지 않았고 여전히 null
이므로 null 포인터는 자연스럽게 보고되었습니다.
高洛峰2017-04-18 10:52:14
부모 클래스 name
에 Base
을 정의하면 오류가 발생하지 않습니다. Sub
을 인스턴스화하면 기본 생성자가 호출되고 기본 생성자는 상위 클래스의 생성자를 호출하기 때문에 상위 클래스의 생성자에서 test()
메서드를 사용하고 하위 클래스에 있습니다. 이 메소드를 다시 작성하여 서브클래스의 test
메소드에 name
을 사용하고 있는데, 현재 name
는 아직 초기화가 완료되지 않았습니다. 그래서 NullPointerException
신고하겠습니다.