" Bird titi = new Swan();"

时间:2017-08-11 13:12:56

标签: java oop

我目前正在阅读一本java书籍,我被困在一个例子中,包括这一行:

Bird titi = new Swan();

天鹅是伯德的子类。

我可以解释如下:

  

当java执行此行时,它存储值为titi的内存,并且存储的内存可以包含Bird类型的对象的信息。接下来,该行的第二部分调用Swan构造函数而没有任何参数,这会初始化titi值。

如果我是对的,我无法解释为什么Swan实例可以存储在Bird类型中,因为作为子类的Swan包含的信息比Bird更多。 所以我觉得我错了。在哪里?

和,额外的问题:在这种情况下这种类型的语句是否有用?

谢谢

4 个答案:

答案 0 :(得分:1)

您可能拥有仅采用Bird实例的方法。由于SwanBird,您可以使用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是家长InterafceArrayList是其子级。