【问题标题】:Overloading in child class, unexpected behaviour [duplicate]子类中的重载,意外行为[重复]
【发布时间】:2017-09-16 07:55:45
【问题描述】:

下面的程序打印 ParentClass a() -

public class StaticBindingTest {

    public static void main(String[] args) {
        ParentClass p = new ChildClass();

        p.a("abc");
    }       
}

class ParentClass{

    public void a(Object o){
        System.out.println("ParentClass a()");  
    }
}

class ChildClass extends ParentClass{

    public void a(String s){
        System.out.println("ChildClass a()");   
    }
}

但是,如果我将 ParentClass a() 更改为接受 String,则程序会打印 Childclass a()。为什么? -

package com.my.test;

public class StaticBindingTest {

    public static void main(String[] args) {
        ParentClass p = new ChildClass();

        p.a("abc");
    }       
}

class ParentClass{

    public void a(String o){
        System.out.println("ParentClass a()");  
    }
}
class ChildClass extends ParentClass{

    public void a(String s){
        System.out.println("ChildClass a()");   
    }
}

【问题讨论】:

    标签: java binding static overriding overloading


    【解决方案1】:

    要调用哪个重载方法是在编译时决定的。调用哪个方法实现是在运行时决定的。

    在第一种情况下,ChildClass 基本上有两个 a 重载。一种接受String,一种接受Object

    您的变量p 的编译时类型是ParentClass。编译器实际上并不知道它实际上是一个ChildClass。那必须等到运行时。因此编译器查看ParentClass 并发现ParentClass 中只有一个a 重载,因此它决定调用该重载,从而调用输出。

    在第二种情况下,有 1 个重载,但 aChildClass 中有 2 个实现。

    编译器像往常一样将您的p 视为ParentClass,这一次,它选择接受String 的重载,这是这里唯一选择的。现在在运行时,a 被调用。由于p 实际上是一个ChildClass 实例,它调用ChildClass 中的实现,因此输出。

    【讨论】:

      【解决方案2】:

      原因是子类再Override父类的实现。当您定义与超类中的方法具有相同签名的方法时,将简要概述如何处理事情:

      在子类中,您可以重载从超类继承的方法(如在您的第一个示例中)。这种重载方法既不隐藏也不覆盖超类实例方法——它们是新方法,是子类独有的。


      当重写一个方法时,您可能想要使用@Override 注释来指示编译器您打算重写超类中的一个方法。 如果由于某种原因,编译器检测到该方法不存在于某个超类中,则会产生错误

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2016-02-14
        • 2015-12-30
        • 2014-09-25
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2015-11-17
        • 1970-01-01
        相关资源
        最近更新 更多