【问题标题】:invoking overloaded methods by casting classes with 'this' keyword通过使用 'this' 关键字强制转换类来调用重载方法
【发布时间】:2016-12-06 15:22:17
【问题描述】:

这是考试中给我的一个编码问题,我似乎无法弄清楚发生了什么,如果有人能告诉我发生了什么会很有帮助:)

class A1 {
    void m1() {
        System.out.println("A");
    }
}

class B1 extends A1 {
    void m1() {
        System.out.println("B");
    }
}

class C1 extends B1 {
    void m1() {
        System.out.println("C");
    }
}

public class D1 extends C1 {

    void m1() {
        System.out.println("D");
    }

    void m2() {
        m1();
        ((C1) this).m1();
        ((B1) this).m1();
        ((A1) this).m1();
    }

    public static void main(String args[]) {
        new D1().m2();
    }

}

这会产生输出:

D
D
D
D

我的预期输出:

D
C
B
A

我想知道为什么即使使用强制转换和“this”关键字,它仍然在同一个类中调用方法。

【问题讨论】:

  • Java inheritance的可能重复
  • 因为尽管您转换为该类型,但您的实例仍然是最派生的。因此,当您调用 m1 时,也会使用最衍生的方法,该方法在 D 中定义。

标签: java class inheritance


【解决方案1】:

即使您告诉编译器将其视为超级实例,所有实例仍然是同一个实例。

void m2() {
        m1();
        ((C1) this).m1();
        ((B1) this).m1();
        ((A1) this).m1();
    }

如果你有一个 VW Polo 并将它们全部转换为 Car,它仍然是一个 Polo 并且仍然会调用它自己的方法。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-11-07
    • 1970-01-01
    • 2019-05-03
    • 1970-01-01
    • 2017-04-19
    • 1970-01-01
    • 2016-01-06
    相关资源
    最近更新 更多