关键字:多态、动态链接和向上转型

方法的重写、重载与动态链接构成多态性。

什么是动态链接?当父类中的一个方法只有在父类中定义而在子类中没有重写的情况下,才可以被父类类型的引用调用;对于父类中定义的方法,如果子类中重写了该方法,那么父类类型的引用将会调用子类的这个方法,这就是动态链接。对应的字节码指令就是invokedynamic。

定义一个子类Cat,它继承了Animal类,后者是前者的父类。

可以通过 Animal a = new Cat();

定义一个Animal类型的引用,指向新建的Cat类型的对象。由于Cat是继承自它的父类Animal,所以Animal类型的引用是可以指向Cat类型的对象的。这就是“向上转型”。

多态的总结:

一、使用父类类型的引用指向子类的对象;
二、该引用只能调用父类中定义的方法和变量;
三、如果子类中重写了父类中的一个方法,那么在调用这个方法的时候,将会调用子类中的这个方法;(动态连接、动态调用)
四、变量不能被重写(覆盖),”重写“的概念只针对方法,如果在子类中”重写“了父类中的变量,那么在编译时会报错。

Another question: 当子类重写父类方法时,使用父类引用调用该方法,该方法里的字段使用父类的还是子类的?

public class Father {public int money = 1;public Father(){money = 2;showMeTheMoney();}public void showMeTheMoney(){System.out.println("I am Father, i have $" + money);}
}
public class Son extends Father{public int money = 3;public Son(){money = 4;showMeTheMoney();}@Overridepublic void showMeTheMoney() {System.out.println("I am Son, i have $" + money);}
}
public static void main(String[] args) {//子类在创建时,先隐式调用父类的构造函数,字段没有多态,因此这里调用的是Son::showMeTheMoney的字段//但是对于变量money而言,执行父类的init方法时,只给子类的money赋予了默认值,因此第一个money是0,//第二个money是执行完init方法后的money,因此是4//对于sout内的guy.money,这里指明了静态类型是Father,因此调用父类的money//区分 静态类型和实例类型Father guy = new Son();System.out.println("This guy has $" + guy.money);}
Output:
I am Son, i have $0
I am Son, i have $4
This guy has $2

答:当出现这种情况时,首先能确定的是,子类重写了父类的方法,那么在调用这个方法的时候,肯定会调用子类中的这个方法。但是,我们知道,在调用子类的方法之前,肯定会先实例化父类对象(优先调用父类的<init>方法),虽然这时候父类的money已经被实例化为2了,但是这时候调用的是子类的方法和子类的money属性,而在实例化父类的方法时子类还没有被实例化,因此子类的money还是保持初始化时的值0,这就是为什么第一个money是0。关键点在于<clinit>和<init>的顺序,<clinit>一定早于<init>。

<clinit>和<init>的讲解:
https://blog.csdn.net/xiaoyami/article/details/109992002

从JVM理解父类引用指向子类对象相关推荐

  1. Java多态-如何理解父类引用指向子类对象

    java多态,如何理解父类引用指向子类对象 要理解多态性,首先要知道什么是"向上转型". 我定义了一个子类Cat,它继承了Animal类,那么后者就是前者是父类.我可以通过   C ...

  2. java 父类引用子类对象_java多态,如何理解父类引用指向子类对象

    java多态,如何理解父类引用指向子类对象 要理解多态性,首先要知道什么是"向上转型". 我定义了一个子类Cat,它继承了Animal类,那么后者就是前者是父类.我可以通过   C ...

  3. 如何理解父类引用指向子类对象

    java多态,如何理解父类引用指向子类对象 要理解多态性,首先要知道什么是"向上转型". 我定义了一个子类Cat,它继承了Animal类,那么后者就是前者是父类.我可以通过 Cat ...

  4. java父类引用子类_java多态,如何理解父类引用指向子类对象

    要理解多态性,首先要知道什么是"向上转型". 转型是在继承的基础上而言的,继承是面向对象语言中,代码复用的一种机制,通过继承,子类可以复用父类的功能,如果父类不能满足当前子类的需求 ...

  5. 多态的理解(父类引用指向子类对象)

    多态: 要有继承,方法的重写,父类引用指向子类对象           ?疑问:Animal cat = new Cat(); //向上转型.        父类引用指向子类对象,该引用不能再访问子类 ...

  6. Java 理解点整理:父类引用指向子类对象(多态)

    前言 本章主要对"Java的多态"做一个简单的说明. 1.父类引用指向子类对象代码演示 1. 代码:父类Animal,子类Dog,子类Cat//父类:动物 public class ...

  7. 父类引用指向子类对象详解

    父类引用指向子类对象 父类引用指向子类对象指的是: 例如父类Animal,子类Cat,Dog.其中Animal可以是类也可以是接口,Cat和Dog是继承或实现Animal的子类. Animal ani ...

  8. 多态之父类引用指向子类对象

    首先,这是多态的知识,多态有三要素: 继承 , 重写父类的方法 , 父类引用指向子类对象 以下是我对于多态的一些理解,如有不当,还请指正! 一,多态的概念与特征: 1.什么多态 多态是同一个行为具有多 ...

  9. 关于java多态性之父类引用指向子类对象

    在使用多态前,要确保两个类之间是继承关系 public class Animal{}public class Dog extends Animal{} 之后创建对象: Animal animal1 = ...

最新文章

  1. 加密日记 android,深挖Android加密到崩溃
  2. 《构建可扩展的Web站点》书评
  3. python计算向量夹角代码
  4. rgb颜色判断语句_首款RGB智能指纹挂锁,既能报警还能减压,简直无锁不能
  5. DHCP详细工作过程
  6. a++浏览器_走进浏览器内部—剖析浏览器是如何工作的(上)
  7. Vue项目实战07:引入Normalize.css样式初始化
  8. android studio多屏幕,为多个屏幕实现多个布局但在android studio 2.1中无法工作
  9. Android下拉刷新效果实现
  10. XCODE---个人常用快捷键整理
  11. php 串行化数据,PHP中的串行化变量和序列化对象
  12. [Usaco2009 Feb]Bullcow 牡牛和牝牛
  13. Bret Victor(苹果 UI 设计师):互动的未来不应只在手指上
  14. 190119每日一句
  15. 多张图片合成一张jpg工具_比较好的拼图软件,多张图片合并工具
  16. MATLAB struct函数(结构体数组)
  17. 餐厅座位表 canvas实现
  18. 广义线性模型(GLM)初级教程
  19. 任务栏WPS出现多窗口预览?下载这个注册表就对了
  20. 1.13 新概念 否定疑问句 半否定 全否定

热门文章

  1. 一些网站 http://ychun.w.googlepages.com/pages
  2. python类函数的有效调用
  3. 中央层面首次!数据可作为生产要素按贡献参与分配,专家解析
  4. 当 AI 踢进世界杯......
  5. 字节流和字符流的区别?
  6. CAD控件:在安卓,苹果手机当中浏览和编辑DWG
  7. 清华大学html理论考试题,1+X Web前端开发(初级)理论考试样题(附答案)
  8. php扫码获取财付通cookie,基于OpenCart 开发支付宝,财付通,微信支付参数错误问题...
  9. resultType 使用方法 笔记
  10. Linux中文件、文件夹的创建、移动、删除、压缩及解压