我目前正在阅读一本java书籍,我被困在一个例子中,包括这一行:
Bird titi = new Swan();
天鹅是伯德的子类。
我可以解释如下:
当java执行此行时,它存储值为titi的内存,并且存储的内存可以包含Bird类型的对象的信息。接下来,该行的第二部分调用Swan构造函数而没有任何参数,这会初始化titi值。
如果我是对的,我无法解释为什么Swan实例可以存储在Bird类型中,因为作为子类的Swan包含的信息比Bird更多。 所以我觉得我错了。在哪里?
和,额外的问题:在这种情况下这种类型的语句是否有用?
谢谢
答案 0 :(得分:1)
您可能拥有仅采用Bird
实例的方法。由于Swan
是Bird
,您可以使用Swan
的实例并将其视为Bird
。
这就是多态的美。它允许您在不破坏代码的其余部分的情况下更改类内部的实现。
答案 1 :(得分:1)
在调用new Swan()的地方,它正在内存中创建一个新的Swan对象。
当Swan对象被分配给Bird变量时(可能因为Swan是Bird的子类型),Bird变量只是在内存中有一个指向Swan的指针。因为titi是动词,现在可以像鸟一样访问/处理这个对象以进行静态时间类型检查和功能......虽然它总是一只天鹅,但可以投射到天鹅以扩展Swan功能。
答案 2 :(得分:1)
Bird titi = new Swan();
实际上称为: 编程到超类 但有时 编程到接口
表示:
titi
一个Bird
,指向天鹅参考...请注意,这仅仅因为继承而有效...这意味着在这种情况下Swan
是一个扩展Bird
类
为什么:它允许修改代码......你可以后来决定不使用天鹅而是猫头鹰这样
Bird titi = new Swan();
将替换为Bird titi = new Owl();
,一切正常
接口编程 更优雅,因为您可以这样做:
IFly titi = new Swan();
如果Swan实现了接口IFly
,那么是有效的,所以它是:
titi
可以飞行 ,指向Swan
参考。
答案 3 :(得分:0)
Bird titi = new Swan();
所有关于多态性。
Parent
类/接口类型可以保存Child
类的对象。
这里Bird是Parent class / Interface,Swan是Child。
同样的例子如下:
List list = new ArrayList();
此处List
是家长Interafce
,ArrayList
是其子级。