Java多态成员访问的特点是什么?

 更新时间:2021年06月13日 09:10:18   作者:Lf_MrF  
在上一篇文章中介绍了方法重载和方法重写的区别,但是在多态情况下发现程序的执行结果和我们预期的不太一样,这篇将继续介绍多态场景下,Java成员访问的特点,需要的朋友可以参考下

Java多态成员访问的特点

多态概要

多态是面向对象编程的三个特性之一,这里不展开做过多介绍,有机会专门写一个关于继承,封装,多态三大特性的文章.
我之前在力扣学习模块中整理过一部分关于这方面的内容,可以先简单了解一下.
力扣知补-面向对象-继承

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基础系列第一弹之方法重载和方法重写的区别

Java基础系列第三弹之操作字符串的类都有哪些?区别是什么?

到此这篇关于Java多态成员访问的特点是什么?的文章就介绍到这了,更多相关Java多态成员访问内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • Java序列化中子类、父类构造函数问题实例分析

    Java序列化中子类、父类构造函数问题实例分析

    这篇文章主要介绍了Java序列化中子类、父类构造函数问题,结合实例形式分析了java父类与子类构造函数中序列化接口调用相关操作技巧与使用注意事项,需要的朋友可以参考下
    2019-09-09
  • MyBatis 参数映射机制实践记录

    MyBatis 参数映射机制实践记录

    这篇文章主要介绍了MyBatis 参数映射机制实践记录,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友参考下吧
    2024-12-12
  • Java以编程方式实现JAR文件的创建

    Java以编程方式实现JAR文件的创建

    在这篇文章中,我们将为大家详细介绍一下利用Java语言以编程方式创建jar文件的过程。文中的示例代码讲解详细,感兴趣的可以了解一下
    2022-07-07
  • java两种单例模式用法分析

    java两种单例模式用法分析

    这篇文章主要介绍了java两种单例模式用法,结合实例形式对比分析了java实现单例模式的两种常见技巧,需要的朋友可以参考下
    2016-08-08
  • SpringMVC框架搭建idea2021.3.2操作数据库的示例详解

    SpringMVC框架搭建idea2021.3.2操作数据库的示例详解

    这篇文章主要介绍了SpringMVC框架搭建idea2021.3.2操作数据库,本文通过示例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2022-04-04
  • 浅谈Spring Boot Web 应用性能优化

    浅谈Spring Boot Web 应用性能优化

    这篇文章主要介绍了浅谈Spring Boot Web 应用性能优化,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2018-07-07
  • Spring配置文件中parent与abstract的使用

    Spring配置文件中parent与abstract的使用

    这篇文章主要介绍了Spring配置文件中parent与abstract的使用方式,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2021-07-07
  • Java日常练习题,每天进步一点点(5)

    Java日常练习题,每天进步一点点(5)

    下面小编就为大家带来一篇Java基础的几道练习题(分享)。小编觉得挺不错的,现在就分享给大家,也给大家做个参考。一起跟随小编过来看看吧,希望可以帮到你
    2021-07-07
  • Spring中的ApplicationRunner接口的使用详解

    Spring中的ApplicationRunner接口的使用详解

    这篇文章主要介绍了Spring中的ApplicationRunner接口的使用详解,ApplicationRunner使用起来很简单,只需要实现CommandLineRunner或者ApplicationRunner接口,重写run方法就行,需要的朋友可以参考下
    2023-11-11
  • java单向链表的实现实例

    java单向链表的实现实例

    java单向链表的实现实例。需要的朋友可以过来参考下,希望对大家有所帮助
    2013-10-10

最新评论