小编给大家分享一下Java中多态成员访问的特点有哪些,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让我们一起去了解一下吧!
多态概要
多态是面向对象编程的三个特性之一,这里不展开做过多介绍,有机会专门写一个关于继承,封装,多态三大特性的文章.
我之前在力扣学习模块中整理过一部分关于这方面的内容,可以先简单了解一下.
力扣知补-面向对象-继承
Java多态使用最多的场景在于父类引用指向子类对象.
多态的前提:
存在继承关系(Son继承Father)
存在方法重写(Son重写Fahter中的Walk方法)
父类引用指向子类对象(Father father = new Son(true);
)
多态情景下主要涉及三部分的访问规则,分别是对成员变量,成员方法和静态方法的访问.
这里只拷贝多态测试类的代码,同时简单介绍一下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中多态成员访问的特点有哪些”这篇文章的所有内容,感谢各位的阅读!相信大家都有了一定的了解,希望分享的内容对大家有所帮助,如果还想学习更多知识,欢迎关注亿速云行业资讯频道!
免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。