面向对象之封装、继承与多态 (2)

实例化子类对象的过程中,间接或者直接的调用父类的构造器,或者父类的父类的构造器,... 直到调用了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

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:https://www.heiqu.com/wpzzfp.html