Java 将子类对象指定给超类实例类型只是为了覆盖概念?或者我们这样做也是为了别的什么?

Java 将子类对象指定给超类实例类型只是为了覆盖概念?或者我们这样做也是为了别的什么?,java,oop,Java,Oop,是否将子类对象指定给超类实例类型仅用于重写?或者我们这样做也是为了别的什么 例如: Sub是Super和 Super s=new Sub() 请解释。当有人编写这样的代码时,他/她试图遵循一个基本的OO设计原则,即- 程序是一个接口,而不是一个具体的实现 我已详细解释了这项原则。查看类继承与接口继承部分 总结一下这篇文章,当您使用父类型的引用来引用子类型的实例时,您获得了很大的灵活性。例如,如果您将来需要更改子类型实现,那么您将能够轻松地做到这一点,而无需更改大部分代码 考虑以下方法- publ

是否将子类对象指定给超类实例类型仅用于重写?或者我们这样做也是为了别的什么

例如: Sub是Super和
Super s=new Sub()


请解释。

当有人编写这样的代码时,他/她试图遵循一个基本的OO设计原则,即-

程序是一个接口,而不是一个具体的实现

我已详细解释了这项原则。查看
类继承与接口继承
部分

总结一下这篇文章,当您使用父类型的引用来引用子类型的实例时,您获得了很大的灵活性。例如,如果您将来需要更改子类型实现,那么您将能够轻松地做到这一点,而无需更改大部分代码

考虑以下方法-

public void DoSomeStuff(Super s) {
    s.someMethod();
}
DoSomeStuff(new Sub());
以及对该方法的调用-

public void DoSomeStuff(Super s) {
    s.someMethod();
}
DoSomeStuff(new Sub());
现在,如果您需要更改
someMethod
中的逻辑,您可以通过声明
Super
的新子类型(例如
NewSubType
)并更改该实现中的逻辑来轻松地完成。这样,您将永远不必接触使用该方法的其他现有代码。您仍然可以按以下方式使用
DoSomeStuff
方法-

DoSomeStuff(new NewSubType());
如果您将
DoSomeStuff
的参数声明为
Sub
,那么您也必须更改其实现-

DoSomeStuff(NewSubType s) {
    s.someMethod();
}
它也可能会连锁/冒泡到其他几个地方。

是的,但我不会用“覆盖”这个词。通常,拥有类层次结构的原因不是改变超类的行为,而是实现它。通常情况下,超类要么是接口,而不是类,要么是遵循模板方法模式的抽象类,其中一些方法保持抽象,多个子类实现这些方法,但一般行为已经固定


更具体地说,如果我们像您的示例中那样将子类分配给超类实例变量,我们希望在交换子类的情况下限制对代码的影响(我们只需要编辑一行!)

OO设计的特性允许这样做(将对象作为公共超类型的实例处理)

可以将的子类型实例指定给超类型变量,以统一方式处理所有可能的子类型类,例如使用超类型类声明(但可能重写)的方法

您可能会感兴趣阅读的相关OO主题: