0

这是我的示例程序。

class parent
{

    void display(int i)
    {
        System.out.println("parent");
    }

}

class child extends parent
{

    void display(byte i)  //Line 0
    {

        System.out.println("child");
        return;
    }

}

class impl
{

    public static void main(String...args)
    {

        parent p = new parent();
        p.display(5); //Line 1
        child c = new child();
        c.display(3); //Line 2

    }

}

这是我的输出。

varun@\:~/Desktop/JavaFiles$ java impl
parent
parent

我了解第 1 行从父级调用 display() 方法并输出预期的“父级”。

但是我不明白为什么第 2 行从父级而不是子级调用 display(),即使我没有使用多态初始化(我所做的只是子类的常规初始化)。

4

5 回答 5

5

in 中的display(byte)方法child不会覆盖 in 中的display(int)方法parent。由于 3 默认情况下是一个int,因此您在 中调用 display 方法parent

尝试c.display((byte)3)

于 2013-08-31T15:46:04.913 回答
4

您在子类中声明的方法不会覆盖父类中的方法;一个接受一个int参数,另一个接受一个参数byte(您可以通过添加@Override到子类方法来测试它;会发生编译错误)。在您的 main 方法中,您display()通过传递int参数进行调用,因此调用了父类的方法。

如果要display()按照子类中声明的方式调用,则需要显式传递一个byte参数:

c.display((byte)3);
于 2013-08-31T15:45:28.340 回答
0

什么传承???子显示需要一个字节,您正在传递一个 int 以便调用父显示。

于 2013-08-31T15:46:50.593 回答
0

你是overloading班上的display()Child不是Overriding

压倒一切的规则

1 参数不得更改
2 返回类型不能更改,除非协变(子类型)返回
3 异常可以减少/消除。不得抛出新的/更广泛的已检查异常
3 访问不得更具限制性。可以少一些限制。
4 调用 调用哪个方法取决于对象类型,在运行时

于 2013-08-31T15:48:40.480 回答
0

参数 3 被认为是 int 类型,而不是 byte 类型。

于 2013-08-31T15:50:23.440 回答