我能否在Java中覆盖使用子类对象作为参数?

3
我有以下这些课程:
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。

这种方式可以进行覆盖吗? 上述两种情况中哪一种是正确的重写?

注:重写指的是子类定义一个与父类方法名、返回值类型和参数列表都相同的方法来替换父类方法。

每当涉及到重写时,总是使用注释@Override,这样编译器本身就会告诉你是否可以这样做或者是否有错误。https://dev59.com/4HVD5IYBdhLWcg3wGHau - Bhesh Gurung
2个回答

0

不,这是不可能的,也会违反LSP

通过继承一个类,你表达了你的子类MoreUseful实际上是一个Useful,因此暴露了所有的功能Useful也同样暴露。如果你删除了使用对象调用f的能力,那么你就会破坏这个承诺。

你可以自由地重载f,这样你就有了一个f(String s)方法。


0

g()方法确实被重写了。然而,f()并没有被重写 - 它是重载的。验证这一点的简单方法是在你打算重写的每个方法上添加@Override - 如果它导致编译错误,那么你没有正确地进行重写。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接