Java “的含义;鸟titi=新天鹅()&引用;
我最近读了一本java书籍,我被一个例子困住了,包括这一行:Java “的含义;鸟titi=新天鹅()&引用;,java,oop,Java,Oop,我最近读了一本java书籍,我被一个例子困住了,包括这一行: Bird titi = new Swan(); 天鹅是鸟类的一个亚类 我可以这样解释: 当java执行这一行时,它为titi值存储内存,存储的内存可以包含Bird类型的对象的信息。接下来,行的第二部分不带任何参数调用Swan构造函数,从而初始化titi值 如果我是对的,我无法解释为什么Swan实例可以存储在Bird类型中,因为Swan作为子类包含的信息比Bird更多。 所以我觉得我有点不对劲。在哪里 另外,还有一个问题:在哪种情况下
Bird titi = new Swan();
天鹅是鸟类的一个亚类
我可以这样解释:
当java执行这一行时,它为titi值存储内存,存储的内存可以包含Bird类型的对象的信息。接下来,行的第二部分不带任何参数调用Swan构造函数,从而初始化titi值
如果我是对的,我无法解释为什么Swan实例可以存储在Bird类型中,因为Swan作为子类包含的信息比Bird更多。
所以我觉得我有点不对劲。在哪里
另外,还有一个问题:在哪种情况下,这种类型的语句是有用的
谢谢你你可能有一种方法,它只取
Bird
的一个实例。由于Swan
是一只Bird
,因此可以使用Swan
的实例并将其视为Bird
这就是多态性的美妙之处。它允许您在不中断其余代码的情况下更改类内部的实现。在调用new Swan()的地方,它在内存中创建一个新的Swan对象 当Swan对象被指定给Bird变量时(可能是因为Swan是Bird的子类型),Bird变量在内存中只有一个指向Swan的指针。由于titi是一个动词,现在可以像鸟一样访问/处理该对象,以进行静态时间类型检查和功能。。。虽然它始终是一个天鹅,并且可以将其转换为天鹅以扩展天鹅功能
Bird titi = new Swan();
实际上被称为:编程到超类,但有时编程到接口
指:
titi
是一只Bird
,指向一只天鹅。。。请注意,这仅因继承而有效。。。这意味着在本例中,Swan
是扩展Bird
类的类
原因:它允许修改代码。。。你可以决定不使用天鹅,而是使用猫头鹰
Bird titi=新天鹅()代码>将替换为Bird titi=new Owl()代码>一切正常
接口编程更加优雅,因为您可以:
IFly titi = new Swan();
如果Swan实现接口IFly
,则该选项有效,因此:
titi
是一种可以飞的东西,指向一只天鹅
Bird titi = new Swan();
这都是关于多态性的。
父类
类/接口类型可以容纳它的子类
类的对象
这里Bird是父类/接口,Swan是子类/接口
同样的例子如下:
List list = new ArrayList();
这里的List
是父Interafce
和ArrayList
它是子类。请记住,Java中的“变量”实际上只是一个引用-因此您没有分配一块内存来容纳Bird
然后必须压缩所有Swan
的数据,您正在对其他地方进行新的固定大小引用。然后在调用对象构造时定义“其他地方”的数据,因此在这里它被设置为Swan
。吹毛求疵:“Bird变量只是有一个指向内存中Swan的指针”不是指针,而是引用,JVM可以用它来定位内存中的对象(它不需要是它的当前内存地址)。