Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/355.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/oop/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java “的含义;鸟titi=新天鹅()&引用;_Java_Oop - Fatal编程技术网

Java “的含义;鸟titi=新天鹅()&引用;

Java “的含义;鸟titi=新天鹅()&引用;,java,oop,Java,Oop,我最近读了一本java书籍,我被一个例子困住了,包括这一行: Bird titi = new Swan(); 天鹅是鸟类的一个亚类 我可以这样解释: 当java执行这一行时,它为titi值存储内存,存储的内存可以包含Bird类型的对象的信息。接下来,行的第二部分不带任何参数调用Swan构造函数,从而初始化titi值 如果我是对的,我无法解释为什么Swan实例可以存储在Bird类型中,因为Swan作为子类包含的信息比Bird更多。 所以我觉得我有点不对劲。在哪里 另外,还有一个问题:在哪种情况下

我最近读了一本java书籍,我被一个例子困住了,包括这一行:

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可以用它来定位内存中的对象(它不需要是它的当前内存地址)。