gpt4 book ai didi

java - 为什么Object已经初始化了,其值还是null?

转载 作者:行者123 更新时间:2023-12-02 10:51:30 24 4
gpt4 key购买 nike

我遇到以下程序的问题,它有两个类 A 和 B,并且 A 类中的一个方法 getObject() 已在 B 类中重写,B 类扩展了 A 类。

我从基类构造函数调用 getObject() ,我相信它会调用类 B 中的重写方法,并且在运行时错误是空指针异常,为什么对象尚未初始化,即使它已经初始化?

class A {
Object object = new Object();

public A() {
System.out.println("A Class");
getObject();
}

public void getObject() {
System.out.println("Class A Version");
System.out.println(object.toString());
}
}

class B extends A {

Object object = new Object();

public B() {
System.out.println("B Class");
}

@Override
public void getObject() {
System.out.println("Class B Version");
System.out.println(object.toString());
}
}

public class Init {
public static void main(String[] args) {
new B();
}
}

输出

A Class
Exception in thread "main" Class B Version
java.lang.NullPointerException
at net.mindview.util.B.getObject(Init.java:28)
at net.mindview.util.A.<init>(Init.java:8)
at net.mindview.util.B.<init>(Init.java:21)
at net.mindview.util.Init.main(Init.java:34)

最佳答案

根据this answer :

The correct order of initialisation is:

  1. Static variable initialisers and static initialisation blocks, in textual order, if the class hasn't been previously initialised.
  2. The super() call in the constructor, whether explicit or implicit.
  3. Instance variable initialisers and instance initialisation blocks, in textual order.
  4. Remaining body of constructor after super().

See sections §2.17.5-6 of the Java Virtual Machine Specification.

所以基本上,在执行类 A 的构造函数期间,类 B 中的 object 尚未初始化(第 2 点:隐式 super() 调用)。

关于java - 为什么Object已经初始化了,其值还是null?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30879256/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com