【问题标题】:how to call parent class mothod如何调用父类方法
【发布时间】:2020-01-14 04:41:49
【问题描述】:

我正在研究运行时多态性,我找到了一个这样的例子

class Bike {
    void run() {
        System.out.println("running");
    }
}

class Splender extends Bike {
    void run(){
        System.out.println("running safely with 60km");
    }

   public static void main(String args[]){
       Bike b = new Splender (); //upcasting
       b.run();
   }
}

这里 Bike 类对象 b 可以访问 Splender 的方法 run 没关系, 那么我们可以访问 Bike 的 run() 方法吗?如果是,那怎么办?如果不是那为什么?

【问题讨论】:

    标签: java polymorphism overriding upcasting run-time-polymorphism


    【解决方案1】:

    不,是overriddenSplender 发送的。您使用Splender 的实例,因此将使用它的方法版本。

    不过,您可以在覆盖它时访问它。

    @Override
    void run() {
        super.run();
        System.out.println("running safely with 60km");
    }
    

    8.4.8.1. Overriding (by Instance Methods)

    可以使用包含关键字super 的方法调用表达式(第15.12 节)来访问被覆盖的方法。 限定名称或对超类类型的强制转换在尝试访问被覆盖的方法时无效。

    【讨论】:

    • b 是 Bike 的对象,为什么它不访问 Bike 方法?
    • @dev_swat b 的实际(或运行时)类型是 Splender,它会覆盖该方法。当涉及到方法覆盖时,变量的声明类型无关紧要
    • “不过,您可以在覆盖它时访问它。” - 只是为了澄清一点:“你可以在覆盖 [类] 的同时访问 [函数]”。
    • @Quaffel 不过,我并没有重写课程
    • 在上面的例子中,你做到了。它没有任何问题。但是,我只是想澄清一下,调用父级的#run() 实现不限于被覆盖函数内的范围。 “覆盖类”的表述可能有点误导,因为它不是指经典意义上的“覆盖”。
    猜你喜欢
    • 2016-02-14
    • 2014-01-02
    • 1970-01-01
    • 2011-01-03
    • 1970-01-01
    • 1970-01-01
    • 2018-09-09
    • 2012-10-08
    • 2017-11-09
    相关资源
    最近更新 更多