当前位置: 首页 > 面试题库 >

Java转换为超类并调用重载方法

锺离晗昱
2023-03-14
问题内容
abstract class A {

    int met(A a) {
        return 0;
    }

    int met(B b) {
        return 1;
    }

    int met(C c) {
        return 2;
    }
}

class B extends A {

    int met(A a) {
        return 3;
    }

    int met(B b) {
        return 4;
    }

    int met(C c) {
        return 5;
    }
}

class C extends B {
    int f() {
        return ((A)this).met((A)this);
    }
}

public class teste {
    public static void main(String args[]) {
        C x = new C();
        System.out.println(x.f());
    }
}

程序将返回3,而我的预期值为0。为什么方法f中的第一个强制转换什么都不做,而第二个有效?是因为在A和B类中,met方法被重载,因此使用静态绑定吗?


问题答案:

这就是多态性的工作方式。请考虑以下示例:

A a = new C();
a.met(a);

如预期的那样,将调用正确的方法B#met(...)。对象的方法表不仅仅因为更改存储在其中的变量的类型而改变Object,因为an
Object和它的方法之间的绑定比存储类型和与其相关的方法之间的绑定更强大。第二种类型起作用,因为输入的类型被强制转换为该类型,A因此该方法将其识别为A(输入存储的Object类型比该类型具有更强的绑定)。



 类似资料:
  • 我有两个班,狗和比格犬。 类狗有方法:bark() 类Beagle有方法:bark()和hunt() 如果我这样做 这调用了Beagle的树皮函数。然而,如果我说, Eclipse生成错误。如果仍然是的实例(鉴于它调用了Beagle的函数),它应该仍然能够调用函数?或者如果它不再是类型,为什么它不调用Dog的函数?我不知道如何将这两种行为相互平衡。

  • 问题内容: 我正在学习Java入门课程,我们才刚刚开始学习继承。我正在完成一项任务,要求我们创建一个具有名称和年龄的“宠物”超类。和三个子类,每个子类都有自己的独特特征(我选择了“狗”,“猫”和“鸟”)。构建完所有这些之后,我们将创建一个Main类来测试所有内容,这就是我遇到问题的地方。我试图在中调用这些独特特征的方法,但似乎只能找到超类中的方法。 这是主类: 这是我的超人 这是子类之一(它们看起

  • 问题内容: 假设我有以下两个课程 如果我启动一个beta类型的新对象,如何执行在alpha类而不是beta中找到的逻辑?我可以使用<-我想知道是否可行。 Eclipse IDE中的自动键入功能使我可以选择从class 或class中进行选择。 问题答案: 你可以做: 注意,这是对父级的引用,但是super()是它的构造函数。

  • 问题内容: 对于以下代码,为什么打印A,B?我希望它能打印B,B。而且,由JVM执行的方法调用是动态还是静态评估? 问题答案: 重载由编译器 静态 确定。 重写 是在执行时完成的,但这不是这里的因素。 的静态类型为A,因此第一个方法调用解析为。

  • 问题内容: 我希望结果是: 汽车通话方式:红色 宝马的致电方式:颜色为黑色 汽车通话方式:颜色为黑色 但是,我得到的结果是: 汽车通话方式:红色 宝马的致电方式:颜色为黑色 宝马的致电方式:颜色为黑色 我哪里错了?以及如何使用超类中的方法在子类对象中获取数据?我可以在BMW课堂上写一个方法来做到这一点。但是,为什么强制转换不起作用?谢谢你! 好!谢谢! 我明白了为什么投射不起作用。 因此,我在BM

  • 我在调用覆盖方法的子类方法时遇到了问题,所以我创建了一个小应用程序来测试它。当超类调用其子类覆盖的方法时,仍然调用超类的方法版本,而不是子类的版本,后者覆盖了超类的方法,应该是被调用的方法。 预期输出: