向下转型、子类对象实例化的理解
1、向下转型的使用:
(1)需要转型的原因:有了对象的多态性以后,内存中实际上是加载了子类特有的属性和方法的,但由于变量声明为父类类型,导致编译时,只能调用父类中声明的属性和方法,子类特有的属性和方法不能调用。如果需要调用子类特有的属性或方法,则必须向下转型。
(2)如何转型(如何才能调用子类特有的属性和方法):向下转型,使用强制类型转换符。
注意:使用强转时,可能出现ClassCastException异常。
(3)向下转型的几个常见问题:
① 编译通过,运行不通过:
Person p1 = new Woman();
Man m1 = (Man)p1;
② 编译通过,运行也通过:
Object obj = new Woman();
Person p2 = (Person)obj;
③ 编译都不通过:
Man m2 = new Woman();
2、子类对象实例化全过程:
(1)从结果来看:子类继承父类以后,就获取了父类中声明的属性或方法。创建子类的对象,在堆空间中,就会加载所有父类中声明的属性。
(2)从过程来看:当通过子类的构造器创建子类对象时,一定会直接或间接的调用其父类的构造器,进而调用父类的父类的构造器,直到调用了 java.lang.Object 类中空参的构造器为止。正因为加载过所有父类的结构,所以才可以看到内存中有父类的结构,子类对象才可以考虑进行调用。
注意:虽然创建子类对象时,调用了父类的构造器,但从始至终就创建过一个对象,即:new的子类对象。
本文来自博客园,作者:萧若風,转载请注明原文链接:https://www.cnblogs.com/XiaoRuoFeng/p/16400794.html