由于(Liskov)替换原则,下列方法确实起作用,它说如果希望某个类的实例有引用,那么您可以将引用替换为该类的任何子类的实例。我的讲师对Liskov替换原则的定义不正确,还是我误解?
public static void main(String[] args) {
Cat felix = new Cat();
Object copyCat = felix;
}
现在,据我所知,在这种情况下,我创建一个Cat
对象(因此存储器空间被在堆中创建),我然后分配称为“菲利克斯”一个对象引用变量到新创建的Cat
对象。参考变量的类型为Cat
,因此只能控制Cat
和Cat
的任何子类。
我然后创建Object
类型的Object
参考变量,并且在费利克斯指向它(Cat
)对象,它具有有限功能的工作原理,但作为JVM现在看到的是Object
类型的菲利克斯对象,因此,如果用于例如Cat
类中定义的方法purr()
,felix将不再能够使用它。
因此,期望Cat
类型的参考,但是我们提供了cat类型的超类(而不是像上面定义中所述的子类)的引用,并且这是允许的,但功能有限除非你做演员)。
我是正确还是离开?
当然'felix'仍然可以发声,但'copyCat'不能。内存不变,但不同的类型告诉编译器如何看待这段内存。 – DarkDust 2011-04-19 12:18:00