我可以覆盖使用子类对象作为Java中的参数吗?

时间:2014-04-11 14:45:31

标签: java inheritance override

我的课程如下

public class Useful 
{
    public void f(Object a)
    {
        System.out.println("In base f");
    }

    public void g(String a)
    {
        System.out.println("In base g");
    }
}

public class MoreUseful extends Useful 
{
    public void f(String a)
    {
        System.out.println("In derived f");
    }

    public void g(Object a)
    {
        System.out.println("In derived g");
    }
}

我试图覆盖基类方法,但我正在更改派生类中的参数。 在方法MoreUseful.f()中我使用子类参数(String)作为基类中的Object。 在方法MoreUseful.g()中我使用超类参数(Object)作为基类中的String。

是否可以覆盖这些方式? 以上两种情况中的哪一种是正确的覆盖?

2 个答案:

答案 0 :(得分:0)

不,这是不可能的,并且会违反LSP

通过继承自类,您表示您的子类MoreUseful实际上是Useful,因此公开了 Useful公开的所有功能。如果您删除了使用对象调用f的功能,那么您就可以打破这一承诺。

您可以重载 f,因此您可以使用f(String s)方法。

答案 1 :(得分:0)

确实覆盖了g()方法。但是,f()未被覆盖 - 它重载。验证这一点的一种简单方法是在要覆盖的每个方法上添加@Override - 如果它导致编译错误,则表示您没有正确覆盖。