Java多态 父类引用指向子类对象

Java多态 父类引用指向子类对象原文地址 http www cnblogs com 111testing p 6880831 htmlJava 多态的三个必要条件 1 继承 2 子类重写父类方法 3 父类引用指向子类对象然后看一个例子输出结果为 给出结论 Father nbsp c nbsp nbsp new nbsp Child nbsp nbsp 在 c 的眼里只能看到 child

原文地址http://www.cnblogs.com/111testing/p/6880831.html

Java多态的三个必要条件:

1、 继承

2、 子类重写父类方法

3、 父类引用指向子类对象

然后看一个例子

从JVM角度看Java多态

从JVM角度看Java多态

输出结果为:

从JVM角度看Java多态

给出结论:Father  c  =  new  Child()    在c的眼里只能看到 child 里面的 father 属性!

                   当满Java多态的三个条件时,可以发现c.eat()调用的实际上是子类的eat(是因为子类重写覆盖了父类方法),

                   但c.age调用的还是父类的age(属性/变量不存在重写和覆盖),而c.play()则不会通过编译。

 Java多态 父类引用指向子类对象

 

 

Java多态 父类引用指向子类对象

但是在java的引用中Father不但指定了c以何种方式访问内存,也规定了能够访问内存空间的大小。

我们看Father实例对象的大小是占两行,但Child实例对象占三行(这里就是简单量化一下)。

所以虽然c指向的是Child实例对象,但是前面有Father修饰它,它也只能访问两行的数据,也就是说c根本访问不到Child类中的age!!!只能访问到Father类的age,所以输出40

 

从JVM角度看Java多态

我们看到Parent的方法表占三行,Child的方法表占4行,c虽然指向了Child类的实例对象,

而对象中也有指针指向Child类的方法表,但是由于c受到了Father的修饰,通过c也只能访问到Child方法表中前3行的内容!!!!

然而前面说过,在方法表的形成过程中,子类重写的方法会覆盖掉表中原来的数据,也就是Child类的方法表的第三行是指向Child.eat的引用,

而不是指向Parent.eat(因为方法表产生了覆盖),所以c访问到的是Child.eat。也就是子类的方法!!!这种情况下,c是没有办法直接访问到父类的eat方法的。

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/206972.html原文链接:https://javaforall.net

(0)
上一篇 2026年3月19日 下午3:04
下一篇 2026年3月19日 下午3:04


相关推荐

  • Q学习(Q-learning)入门小例子及python实现

    Q学习(Q-learning)入门小例子及python实现一、从马尔科夫过程到Q学习#有一定基础的读者可以直接看第二部分Q学习(Q-learning)算法是一种与模型无关的强化学习算法,以马尔科夫决策过程(MarkovDecisionProcesses,MDPs)为理论基础。标准的马尔科夫决策过程可以用一个五元组<S,A,P,R,γ>表示,其中:S是一个离散有界的状态空间; A是一个离散的动作空间; P为状态转…

    2022年10月4日
    4
  • shell字段拼接日期_shell 脚本字符串拼接

    shell字段拼接日期_shell 脚本字符串拼接在编写 shell 脚本的时候 难免会使用 shell 脚本的字符串拼接 不经常使用的话真的会忘记 本人写着一篇的目的也就是记录以下 到时候回过头来不用找的太麻烦 首先变量与变量拼接 str1 123 str2 456 echo str1 str2 结果输出其次字符串与变量拼接 str3 789 echo str3 000 输出结果另外一种变量与字符串拼接方式 echo s

    2026年3月17日
    1
  • JMeter BeanShell Sampler与JMeter BeanShell断言

    JMeter BeanShell Sampler与JMeter BeanShell断言BeanShell 是一种完全符合 Java 语法规范的脚本语言 当然 也有一些不一样的地方 比如 BeanShell 就不支持 Java 中的泛型 但又拥有一些独有的语法和方法 BeanShell 应用在 JMeter 的三个元件中 BeanShellSam 位于 Sampler 中 BeanShellPre 位于前置处理器 和 BeanShellPos 位于后置

    2026年3月20日
    1
  • 键盘记录器,可截获到 QQ 的密码「建议收藏」

    键盘记录器,可截获到 QQ 的密码「建议收藏」虽然QQ 的密码框经过了特殊的处理,但是通过一些特殊手段仍然可以得到输入过程中键盘输入的内容。代码仅供娱乐使用!

    2022年7月20日
    20
  • Pytest(17)运行未提交的git(pytest-picked)

    Pytest(17)运行未提交的git(pytest-picked)前言我们每天写完自动化用例后都会提交到git仓库,随着用例的增多,为了保证仓库代码的干净,当有用例新增的时候,我们希望只运行新增的未提交git仓库的用例。pytest-picked插件可以

    2022年7月31日
    7
  • pandas用法-全网最详细教程

    pandas用法-全网最详细教程一、生成数据表1、首先导入pandas库,一般都会用到numpy库,所以我们先导入备用:importnumpyasnpimportpandasaspd2、导入CSV或者xlsx文件:df=pd.DataFrame(pd.read_csv(‘name.csv’,header=1))df=pd.DataFrame(pd.read_excel(‘nam…

    2022年6月12日
    31

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号