Java多态成员访问 Java多态成员访问的特点是什么?
Lf_MrF 人气:0Java多态成员访问的特点
多态概要
多态是面向对象编程的三个特性之一,这里不展开做过多介绍,有机会专门写一个关于继承,封装,多态三大特性的文章.
我之前在力扣学习模块中整理过一部分关于这方面的内容,可以先简单了解一下.
力扣知补-面向对象-继承
Java多态使用最多的场景在于父类引用指向子类对象.
多态的前提:
- 存在继承关系(Son继承Father)
- 存在方法重写(Son重写Fahter中的Walk方法)
- 父类引用指向子类对象(
Father father = new Son(true);
)
Java多态情景下成员访问特点
多态情景下主要涉及三部分的访问规则,分别是对成员变量,成员方法和静态方法的访问.
这里只拷贝多态测试类的代码,同时简单介绍一下Father类和Son类的情况.
Father类中有一个boolean canRun
变量固定为False
,子类中的canRun
成员变量由构造方法传入.
walk(boolean canRun):如果canRun是True则输出Father/Son可以跑,否则输出Father/Son只能走.
public class Test { public static void main(String[] args) { Father father = new Son(true); System.out.println(father.isCanRun()); father.walk(father.isCanRun()); father.run(); } }
成员变量访问规则
Father father = new Son(true);
成员变量访问口诀是编父运父或者编左运左,进一步简化成为看父类.
解释:就是在编译阶段只要父类能够通过编译,无论右侧的类怎么定义都不会报错,在执行过程中的执行结果也是按照父类中变量来决定运行的结果.
虽然我们给Son
中传入的参数是true
,但是对于成员father
中的变量的访问还是由父类决定.
所以当我们使用father.isCanRun()
访问canRun
变量的时候返回的结果是false
成员方法访问规则
成员方法访问口诀是编父运子或着编左运右.
展开解释就是在编译阶段只要父类能够通过编译,无论右侧的类怎么定义都不会报错,在执行过程中的执行结果需要按照子类中重写的方法(儿子中重写方法返回的是儿子是否能跑)来决定运行的结果.
所以当我们调用father.walk()
方法的时候返回的结果是儿子只能跑!
.
静态方法访问规则
静态方法访问的口诀是编父运父或编左运左和成员变量一样都是看父类.
/* 在父类和子类中都添加上静态方法 */ // 父类 public static void run(){ System.out.println("父亲遇到抢劫犯了!不得不跑!"); } // 子类 public static void run(){ System.out.println("儿子遇到抢劫犯了!不得不跑!"); }
调用father.run()
返回的结果是父亲遇到抢劫犯了!不得不跑!
证明了在多态情况下调用静态方法时还是调用的左侧-父类中定义的静态方法.
这部分我的理解也不是特别深刻,以后有时间还想补充集中情况
子类中是否能够在静态代码块中调用父类的静态方法等等场景
先继续向后学习,后面会整理Java虚拟机相关知识,结合类的加载等内容可能回头会对这部分理解更深刻.
参考/扩展阅读
Java基础系列第三弹之操作字符串的类都有哪些?区别是什么?
加载全部内容