多态的成员访问特点和好处--java进阶day02

1.多态的成员访问特点

1.成员变量访问特点

分为两个阶段,编译阶段,系统会看父类中是否存在该成员变量,如果存在,运行阶段就会使用父类的成员变量,否则报错

当我们在父类中删去num时,编译直接报错

2.成员方法访问特点

分为两个阶段,编译阶段,如果父类中有对应调用的方法,运行就会调用子类的方法,如果编译中父类没有对应调用的方法,则会直接报错

为什么会执行子类的方法?--是因为系统怕父类的方法是抽象方法

这里用接口来进行举例,因为接口里面只有抽象方法

系统防止父类是抽象方法,导致的无逻辑无法运行

3.多态创建对象,调用静态成员

我们在子父类中都写一个静态print成员方法,然后再用多态的方式创建对象,观察此时调用的是谁的静态方法


.

给出的结果是父类的逻辑,所以就和访问成员变量一样呗,但真的是这样吗?

原因并不是这个,之前说过,静态修饰的成员推荐使用类名进行调用,也可以使用对象名进行调用,但是对象名调用的方式其实是一种假象

我们找到字节码文件并将其放入IDEA,就会发现系统已经把对象f改为父类Fu了

既然是类名进行调用,那么类名是谁,调的就是谁的逻辑,当前类名是父类,所以调用的肯定是父类的逻辑

3.问题答案

之前留过两个问题,现在来进行解答

第一个:肯定不是所有的对象都能这样创建,必须是对象多态才可这样创建,父类引用指向子类对象,或是接口引用指向实现类对象

第二个:因为用多态创建完对象调用成员方法的时候,编译会检查父类,但运行的时候一定会执行子类的代码逻辑,那给不同的子类对象,走的也就是不同的逻辑

4.多态的好处和弊端

1.好处

实参既可以传猫又可以传狗,传的子类对象是谁,就走谁的方法

2.弊端

我们知道多态访问成员方法,是编译看父类,假如子类里面有独属于自己的方法,编译发现父类没有该方法,此时就会报错,也就无法用多态进行使用子类特有的方法

那么,这种问题能解决吗?下一个知识点进行讲解

posted @ 2025-02-24 22:45  直実  阅读(48)  评论(0)    收藏  举报