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