有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

java如果基构造函数调用派生方法中重写的方法,并且方法使用samenamed(阴影)字段,会发生什么?

请验证我的理解/猜测,为什么下面的代码会抛出NPE,以及到底发生了什么:

  1. 在调用派生类的新派生()构造函数之后
  2. 派生构造函数立即调用基构造函数(发生隐式构造函数链接)
  3. 基本构造函数调用foobar()。没有不同的foobar()方法(基本版本和派生版本),所以这是“version”中的foobar(),在派生版本中被重写
  4. 这个单一的foobar()“version”(在Base\Derived之间共享)搜索要使用的str字段。由于foobar()在派生中被重写(“定义”),因此它需要派生的str(不能使用Base中的str)
  5. 此时,派生中的str不是init(因为在基本构造函数完成之前,派生构造函数无法开始工作),所以我们得到了NPE

另外,我知道不建议从构造函数调用非final或非私有的非静态方法。此外,对于C++中的虚拟方法,它派生的重写版本不会被调用在java中的基本构造中。p>

class Base {
    String str = "abc";

    Base() {
        foobar();
    }

    void foobar() {
        System.out.println(str.toUpperCase());
    }
}

class Derived extends Base {
    String str = "qwe";

    Derived() {
        foobar();
    }

    @Override
    void foobar() {
        System.out.println(str.toLowerCase());
    }
}

public class My {

    public static void main(String[] args) {
        new Derived();
    }
}

我自己的研究表明,在这些答案中没有相同的(阴影)字段变量(str),这增加了混淆。 answer1 answer2


共 (0) 个答案