Java 为什么默认值会覆盖通过重写方法设置的值

Java 为什么默认值会覆盖通过重写方法设置的值,java,Java,设置具有默认值的变量,如public boolean test=false通过重写的方法使其在到达构造函数后设置为默认值。但是,如果我将其更改为公共布尔测试它的工作原理与我预期的一样 public static void main(String[] args) { /* False */ System.out.println(new Test2().test); } public static class Test { public Test() {

设置具有默认值的变量,如
public boolean test=false通过重写的方法使其在到达构造函数后设置为默认值。但是,如果我将其更改为
公共布尔测试它的工作原理与我预期的一样

public static void main(String[] args) {
    /* False */
    System.out.println(new Test2().test);
}

public static class Test {

    public Test() {
        this.test();

        /* True */
        System.out.println(((Test2) this).test);
    }

    public void test() {}

    public static class Test2 extends Test {

        public boolean test = false;

        public Test2() {
            /* False */
            System.out.println(this.test);
        }

        @Override
        public void test() {
            this.test = true;
        }
    }
}

我想知道是什么导致了这种行为,除了没有默认值之外,您是否可以采取任何措施来防止这种行为?

在Java中,在派生类构造函数中自动调用没有参数的基类构造函数

在您的例子中,当您创建Test2类的实例时,Java首先调用基类的构造函数(Test的无参数构造函数),该构造函数从派生类调用override Test()方法

字段test to value false的初始值设定项在构造函数中的任何其他逻辑之前的构造过程中处理,但在调用基类构造函数之后处理

在下面查找代码的执行顺序:

public static void main(String[] args) {
    System.out.println(new Test2().test); // 6 - print false
}

public static class Test {

    public Test() {
        this.test(); // 1 - call the test method from derivative class

        System.out.println(((Test2) this).test); // 3 - print true
    }

    public void test() {}

    public static class Test2 extends Test {

        public boolean test = false; // 4 - set the test field to false

        public Test2() {
            System.out.println(this.test); // 5 - print false
        }

        @Override
        public void test() {
            this.test = true; // 2 - set the test field to true
        }
    }
}

不要从超类构造函数调用重写的方法。这就是问题的原因。您期望的完整输出是什么?为什么?