实例化子类对象的过程中,间接或者直接的调用父类的构造器,或者父类的父类的构造器,... 直到调用了java.lang.Object类中空参的构造器为止。正因为加载过所有的父类的结构,所以才可以看到内存中有父类中的结构,子类对象才可以考虑进行调用
注:虽然创建子类对象时,调用了父类的构造器,但是自始至终就创建过一个对象,即为new的子类对象
三、多态性 1、多态的定义
可以理解为一个事物的多种形态
2、多态的体现
广义上多态体现
① 方法的重载和方法的重写
对于重载而言,在方法调用之前,编译器就已经确定了所要调用的方法,这称为“早绑定”或“静态绑定”
对于多态,只有等到方法调用的那一刻,解释运行器才会确定所要调用的具体方法,这称为“晚绑定”或“动态绑定”;方法的重写可以理解为多态性
② 子类对象的多态性
狭义上多态体现
子类对象的多态性:父类的引用指向子类的对象(或子类的对象赋给父类的引用),可以直接应用在抽象类和接口上
3、多态的使用
虚拟方法调用
在编译期,只能调用父类中声明的方法,但在运行期,实际执行的是子类重写父类的方法
子类中定义了与父类同名同参数的方法,在多态情况下,将此时父类的方法称为虚拟方法,父类根据赋给它的不同子类对象,动态调用属于子类的该方法。这样的方法调用在编译期是无法确定的。多态属于运行时行为
总结:编译,看左边;运行,看右边。“看左边”:看的是父类的引用(父类中不具备子类特有的方法);“看右边”:看的是子类的对象(实际运行的是子类重写父类的方法)
不能调用子类特有的方法,编译看左边
省去重载方法的使用:此处可以放入任何对象
举例:
4、多态性的使用前提
① 类的继承关系
② 方法的重写
注:对象的多态性,只适用于方法,不适用于属性(编译和运行都看左边)。对象.属性=父类中的属性值,不能调用子类特有的属性,编译看左边
四、向上/向下转型 1、向上转型:向上转型实际就是多态 2、向下转型
向下转型原因
① 由于子类的对象赋给了父类的引用,所以在编译时,只能调用父类声明的结构:属性和方法
② 内存中实际上是加载了子类特有的属性和方法,只有考虑向下转型才能调用子类特有的属性和方法
向下转型要求
① 向下转型使用强制转化符:()
② 为了避免强转出现 Class Cast Exception 的异常,在强转前,建议使用instance of判断
instanceof关键字
作用:
判断关键字左边对象是否是关键字右边类/接口的对象/实现类的对象,如果是返回true,如果不是返回false
在向下转型时,为了避免ClassCastException,利用instanceof关键字进行判断
使用:
a instanceof A:判断对象a是否是类A的实例。如果是,返回true;如果不是,返回false