父级和子级中的方法签名相似时的Java行为

时间:2018-09-06 05:25:48

标签: java

对于父类和子类中具有相同名称和不同参数的方法,我有以下3种情况。

案例1:

class Parent
{
    public void hello(Object obj)
    {
        System.out.println("Parent");
    }       
}

class Child extends Parent
{   
    public void hello(String obj)
    {
        System.out.println("Child");
    }
}

情况2:

class Parent
{
    public void hello(String obj)
    {
        System.out.println("Parent");
    }   
}

class Child extends Parent
{

    public void hello(Object obj)
    {
        System.out.println("Child");
    }
}

情况3:

class Parent
{
    public void hello(Object obj)
    {
        System.out.println("Parent");
    }   
    public void hello(String obj)
    {
        System.out.println("String in Same Class");
    }
}

class Child extends Parent
{
}

具有main()如下:

public static void main(String[] args) {
        Child c = new Child();
        c.hello(null);
    }

案例1的输出:

Child

案例2的输出

Parent

情况3的输出

String in Same Class

我观察到,在所有三种情况下,每次都调用具有String参数的方法。不在“孩子”或“父母”中。我真的很困惑,因为'null'应该造成一些歧义,或者应该从child类中选择方法作为其Child对象。为什么会这样?

1 个答案:

答案 0 :(得分:3)

根据Java语言规范§15.12.2.5选择最具体的方法

  

如果可以使用多个成员方法并且适用于   方法调用,有必要选择一种方法来提供   运行时方法分派的描述符。 Java编程   语言使用选择最具体方法的规则。

在您的情况下,有一种方法可以接受fillMatrix(double** matrix, int n),而另一种方法则可以接受Object。由于StringString的子类,因此后者更为具体,因此将被选择。有关被认为更具体的内容的更多详细信息,请参见语言规范。