了解 Java 继承中的方法重写和构造函数行为

问题描述 投票:0回答:1

我试图理解 Java 继承中方法重写、构造函数调用和变量遮蔽的行为。我有以下代码

class Base {
    int id = 1000; //Line n1

    Base() {
        Base(); //Line n2
    }

    void Base() { //Line n3
        System.out.println(++id); //Line n4
    }
}

class Derived extends Base {
    int id = 2000; //Line n5

    Derived() {} //Line n6

    void Base() { //Line n7
        System.out.println(--id); //Line n8
    }
}

public class Test {
    public static void main(String[] args) {
        Base base = new Derived(); //Line n9
    }
}

当我运行此代码时,它输出 -1

我知道 Derived 扩展了 Base,并且两个类都有一个 id 变量Base() 方法。顺序如下

  1. 调用 Derived 的构造函数
  2. 调用Base的构造函数
  3. 调用Base()方法,由于方法重写,执行的是子类中的方法。

因此,在我看来,结果将是1001。

java constructor overriding
1个回答
0
投票

这是因为 java 构造函数的工作方式。

构造函数的第一条指令将始终是

this.super()
,如果代码中未编写事件。

调用

this.super()
时,变量不受影响并具有默认值(整数为 0)。

因此,您要从 id 中删除 1(等于 0)。

您可以使用此代码进行测试:

class Base {
    int id = 1000;

    Base() {
        System.out.println("Super called");
        Base();
    }

    void Base() {
        System.out.println("Base called");
        System.out.println(++this.id);
    }
}

class Derived extends Base {
    int id = 2000;

    Derived() {
        System.out.println("==Super finished==");
        Base();
    }

    void Base() {
        System.out.println("Derived base called");
        System.out.println(--this.id);
    }
}

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

输出将是:

Super
Derived base called
-1
==Super finished==
Derived base called
1999
© www.soinside.com 2019 - 2024. All rights reserved.