你的理解基本上是正确的,稍微有点儿出入,但是不影响结果。
1、你不是创建了一个水果类型的苹果实例,而是创建了一个苹果类型的苹果实例;
2、赋值时,创建了一个水果类型的引用,将它指向了苹果类型的实例;
3、因为引用是水果类型,因此不可以访问苹果示例中的苹果成员;
4、当进行类型转换时,是将水果类型的引用转换为苹果类型的引用,因此可以使用苹果实例中的成员。
自始至终,苹果的实例的类型都没有变化,只是引用的类型发生了变化。
希望对你有帮助。
哈哈,你把C#和C++一起理解,强人。
我没学过C++,所以我用自己的思路来说。
用子类实例化父类,看着是父类,其实实质上还是子类,如果要使用苹果类独有的属性或方法的话必须转换类型。
Fruit f :创建一个水果类的引用,该引用存放与栈上。
new Apple();:创建一个苹果的实例,并存放于堆上。也就是说在堆上创建了一个苹果。
“ =” 将引用与实例关联起来。
堆上不会有水果实例,只有苹果的实例。因为是通过水果的引用指向苹果,所以调用的时候就以为是水果,因为实质上是苹果,所以拥有苹果的属性和方法。通过强制转换,可以将其转换为苹果。