继承由于这个多态性的基本示例中的语法有什么不同吗?(爪哇)
假设我有一个超类BigClass
,子类LittleClass
继承自它。BigClass有一个方法DoThing(),LittleClass有一个具有不同功能的重写DoThing()方法
像这样实例化子类会有什么不同吗:
BigClass myNewClass = new LittleClass();
或者这个:
LittleClass myNewClass = new LittleClass();
我可以理解为什么第一个会更有用,因为你可以在一行ect中声明许多不同的子类,但是除此之外还有什么区别吗
# 1 楼答案
BigClass
引用只能访问BigClass
功能,而不管它在何处实现(例如BigClass
或LittleClass
)。换句话说,如果LittleClass
有一个方法没有重写来自BigClass
的内容,那么就不能使用BigClass
引用调用它# 2 楼答案
就
DoThing()
方法而言,没有区别现在,假设
LittleClass
类有DoEverything()
方法,该方法没有被继承,因为它甚至不存在于超类中在这种情况下,
myNewClass.DoEverything()
仅在第二种情况下才合法(引用变量为LittleClass()
类型)# 3 楼答案
区别仅在第一种情况下存在
你只能使用
对象访问属于超类的方法
# 4 楼答案
第一个很有用,因为可以使用基类处理程序实现多态行为。如果您知道基类处理程序将始终仅具有此派生类对象,则具有基类或派生类的处理程序并没有多大区别
另一个区别是基类处理程序不能访问在派生类中实现的非抽象方法
# 5 楼答案
在运行时没有区别(在你的意思上)。在这两种情况下,
myNewClass
变量都指向类型为LittleClass
的对象。如果派生类(LittleClass
)显式重写它们,则对其调用的任何方法都将在派生类(LittleClass
)中执行。如果没有,它们将在超类中搜索/调用,如果不是在其超类中,依此类推不同之处在于编译时。如果在下一行中尝试调用仅由
LittleClass
定义(而不是由BigClass
)的某个方法method
,则在第一个场景中不会编译,而是在第二个场景中编译# 6 楼答案
一个例子是工厂设计模式: 在工厂模式中,您将拥有一个方法,该方法根据用户的需要创建各种子类,并在本例中返回类型为BigClass
例如:
要使用此选项,请执行以下操作:
BigClass obj=工厂。getInstance(奥迪); obj。getPerformanceIndicators()