Java 为什么我在分配任务时必须投下
EarthquakeMarker是一个扩展SimplePointMarker的抽象类。海洋地震台延伸至地震台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)
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-aEarthquakeMarker
哪个是-aSimplePointMarker
。但是,为了分配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
的实例。