有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

虚拟函数Liskov的替换原理与JAVA中的重写有什么关系?完全后置和覆盖之间有什么不同?

在编程语言中,如果希望子对象充当父对象的替代对象;但它不应该失去自己的身份(作为孩子),你必须得到父母的许可。这就是为什么我们在C或C++中实现这种方法的原因。这就变成了一个完全的隐藏。在java中,完全隐藏是否被视为覆盖?99%的时候我在这里有错误的概念,因为我认为我只是在考虑隐藏。被重写的函数是否可以像JAVA一样完全隐藏


共 (1) 个答案

  1. # 1 楼答案

    Liskkiov的替换原理与返回抽象父实现而不是具体子实现的函数相关联。比如说

    ArrayList getList vs List getList
    

    在上面的示例中,在第一种情况下,getList方法返回一个具体的列表实现,在第二种情况下,getList方法返回List接口的实例。现在,根据Liskov替换原理,应该使用第二种方法,因为第二种方法可以被子类重写,以返回列表的不同具体实现,而在第一种情况下,只能返回ArrayList子类的ArrayList。因此,第一种情况没有第二种情况那么抽象,并且根据Liskov的替换原则,父实现应该尽可能抽象,以允许子实现尽可能自由

    关于方法隐藏,因此只能使用静态方法。java中的重写不会隐藏该方法,因为它位于实例级别。但是,对于静态方法,由于该方法处于类级别,因此多态性是不可能的,因此,如果子类创建具有相同名称的静态方法,则当它们被继承时,参数和返回类型,并尝试静态访问该方法。将调用子类版本而不是超级类版本,因为子类现在已有效地将该方法隐藏在超级类之外