请稍等 ...
×

采纳答案成功!

向帮助你的同学说点啥吧!感谢那些助人为乐的人

重载时里氏替换原则

父类:

public class Base {
    public void method(Map map) {
        System.out.println("父类入参方法");
    }
}

子类:

public class Child extends Base {
    public void method(HashMap map) {
        System.out.println("子类HashMap入参方法被执行");
    }
}

测试类:

public class Test {
    public static void main(String[] args) {
        Child child = new Child();
        Map map = new HashMap();
        child.method(map);
    }
}

执行结果:父类入参方法
这样看,子类比父类输入参数更窄,并没有比父类宽松,也不违反里氏替换原则啊

正在回答

2回答

geelylucky 2018-12-23 16:46:56

同学,你好,我是geely老师的助教。

关于你这个问题,其实Base类中的method和Child里面的method是两个没有任何关联的方法哦,只是因为它们名字相同而已,method(HashMap map)是你在子类中增加的特有方法,并不是重载类Base类的method方法,请同学详细了解一下java的重载机制哦。

如果还有其他疑问,请留言告知。

希望能帮助到你。

2 回复 有任何疑惑可以回复我~
  • Geely #1
    lucky同学回答的很赞
    回复 有任何疑惑可以回复我~ 2018-12-23 23:32:45
  • kiglig #2
    请问重载是不是指只能在同一个类中对方法进行重载,而在子类中如果存在与父类方法名相同但参数列表不同的方法不能定义为对父类的同名方法进行重载,而是子类特有的方法,只是恰好名字与父类方法相同而已呢?
    回复 有任何疑惑可以回复我~ 2019-01-06 11:19:05
  • geelylucky 回复 kiglig #3
    亲爱的同学,你理解的很对。棒棒哒!!!
    回复 有任何疑惑可以回复我~ 2019-01-14 21:38:34
new_chapter 2019-03-15 17:19:58

我觉得这个问题很好,回答并没有让我完全理解这个问题。

Child类里的method其实是重载了继承自Base的method方法。说是两个不同的方法也对。

既然按照两个不同的方法去理解,那么就取决于应用是怎么去调用的。如果Test类中传入参数是Map,则调用更宽松参数的那个方法;如果Test类中传入HashMap,则调用更严格参数的方法。

既然取决于调用的方式,如果调用的参数和父类保持一致,那么就符合里氏替换原则吧?

那么为什么在子类中实现更宽松参数的方法 要比 在父类实现更宽松参数的方法高明呢?

0 回复 有任何疑惑可以回复我~
  • 说2个不同方法没啥毛病,根据传参的不同调用不同的方法,但是他们是继承关系,子类应该在父类的基础上进行扩展,如果子类的传参比父类更加严格,那么父类就失去了类似作为基类的作用吧。应该是因为规范的问题吧?
    回复 有任何疑惑可以回复我~ 2022-02-28 00:45:42
问题已解决,确定采纳
还有疑问,暂不采纳
意见反馈 帮助中心 APP下载
官方微信