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 为什么我在分配任务时必须投下_Java_Oop_Object_Polymorphism - Fatal编程技术网

Java 为什么我在分配任务时必须投下

Java 为什么我在分配任务时必须投下,java,oop,object,polymorphism,Java,Oop,Object,Polymorphism,EarthquakeMarker是一个扩展SimplePointMarker的抽象类。海洋地震台延伸至地震台 SimplePointMarker pm = new OceanQuakeMarker(feature); EarthquakeMarker em = pm; 我读到这段代码不会编译,因为分配了em=pm。然而,pm与em之间有一种“is-a”关系,所以我想知道为什么我必须投下它: SimplePointMarker pm = new OceanQuakeMarker(feature)

EarthquakeMarker是一个扩展SimplePointMarker的抽象类。海洋地震台延伸至地震台

SimplePointMarker pm = new OceanQuakeMarker(feature);
EarthquakeMarker em = pm;
我读到这段代码不会编译,因为分配了
em=pm
。然而,
pm
em
之间有一种“is-a”关系,所以我想知道为什么我必须投下它:

SimplePointMarker pm = new OceanQuakeMarker(feature);
EarthquakeMarker em = (EarthquakeMarker) pm;

另外,我想知道
em
的功能会发生什么变化,因为它被强制转换为抽象父类。它是否失去了OceanQuakeMarker所具有的功能?

Java在编译时不知道对象的类型,但它知道变量的类型

万一

SimplePointMarker pm = new OceanQuakeMarker(feature);
EarthquakeMarker em = pm;
Java只知道
pm
SimplePointMarker
,但实际类型(
OceanQuakeMarker
)在编译时是未知的

从理论上讲,这个物体可以随时改变,它就不再是一个地震标记了

由于实际类型在编译时是未知的,因此

SimplePointMarker pm;//=something
EarthquakeMarker em = pm;
因此,您必须强制转换它,因为
SimplePointMarker
并不总是
EarthquakeMarker

由于实际类型仅在运行时已知,因此也将在运行时测试该类型


如果将对象强制转换为该对象不是其实例的类型,则将抛出一个
ClassCastException

根据您的解释,下面给出了层次结构:

OceanQuakeMarker ▸ ⁨EarthquakeMarker ▸ ⁨SimplePointMarker
在下面给出的代码中,您试图将
SimplePointMarker
的引用分配给
EarthquakeMarker
的引用,该引用体现了OOP原则。虽然可以将子类引用指定给父类引用,但情况并非如此

SimplePointMarker pm = new OceanQuakeMarker(feature);
EarthquakeMarker em = pm;
下面给出的代码是正确的,因为您已将父类引用转换为子类引用

SimplePointMarker pm = new OceanQuakeMarker(feature);
EarthquakeMarker em = (EarthquakeMarker) pm;
出于同样的原因,以下代码也将成功编译:

OceanQuakeMarker pm = new OceanQuakeMarker(feature);
EarthquakeMarker em = pm;

阅读这篇文章,你会有一个很好的理解,我们无法解释。这都是关于向上投射和向下投射。根据您的描述,
OceanQuakeMarker
is-a
EarthquakeMarker
哪个是-a
SimplePointMarker
。但是,为了分配
em=pm
,您需要
SimplePointMarker
成为
is-a
EarthquakeMarker
。此外,我认为如果找到的对象不是
EarthquakeMarker
或其后代,这将导致Java抛出运行时错误。是的,
ClassCastException
。我将添加它。为了澄清,当铸造
EarthquakeMarker em=(EarthquakeMarker)pm时这是否意味着em现在是一个EarthQuakeMarker变量,在运行时指向实际的OceanQuakeMarker对象?或者转换是否同时改变了变量和实际对象?转换意味着将对象用作转换类型的对象。为此,它已经需要是该类型的对象。因此,我将类型为
simplePointMarker
的变量
pm
转换为
earthQuakeMarker
。这意味着我可以分配
em=pm
,因为编译器现在认为它们具有相同的类。运行时会发生什么?
em
会被视为一个海洋地震制造者吗?还是强制转换会导致变量和实际对象都发生更改?
运行时会发生什么?em会被视为一名海洋地震制造者吗?
-正确
em
将在运行时引用
OceanQuakeMarker
的实例。