构造方法的调用顺序和成员变量的初始化时机以及动态绑定
构造方法的调用顺序:子类构造器中,JVM会自动的先调用父类的构造方法,然后再执行子类构造方法。在JVM自动调用父类构造方法的时候,会完成父类中拥有的成员变量的值的初始化操作,此时子类的成员变量并未初始化,java中基本类型都会使用JVM给定的默认值(如int为0),只有当父类构造方法调用结束,并到执行子类构造器时才会进行子类成员变量的初始化过程。
动态绑定:对于非private、static、final修饰的方法,JVM是在运行期间,用函数指针指向实习对象类型的方法。比如,子类重写了父类的A方法,使用父类Upper的引用upper指向了子类Sub对象,然后upper.A(),实际调用的类Sub中A方法。我是这样理解的,子类和父类中都有方法A,并且子类是通过重写的方式实现了A,所以子类对象原本Upper中指向方法A的指针和Sub类中指向A的指针是通过同一个函数指针,两次赋值。就是指针point值被替换了,不是把父类的函数指针隐藏了,而是相当于两次给指针赋值,第一次使用父类A方法的指针赋给point,第二次使用子类A方法的指针赋给point(以上纯属自己的理解,如果不真确欢迎给位老师指点,因为自己还是刚入行)。所以每一父类的方法的地址被子类方法的地址替换了。
demo:
Upper Code:
1 package com.hq.dynamicBind; 2 3 public class Upper { 4 5 private int i = 1; 6 7 public void print(){ 8 System.out.println("i="+i); 9 } 10 11 public Upper(){ 12 System.out.println("父类构造函数开始"); 13 System.out.println("i="+i); 14 print(); 15 System.out.println("父类构造函数嗲用print()结束"); 16 i = 30; 17 } 18 }
Sub Code:
1 package com.hq.dynamicBind; 2 3 public class Sub extends Upper { 4 5 private int j = 20; 6 7 public void print() { 8 System.out.println("j="+j); 9 } 10 11 public Sub(){ 12 System.out.println("成员变量j="+j); 13 print(); 14 j = 40; 15 } 16 17 }
Client Code:
1 package com.hq.dynamicBind; 2 3 public class Client { 4 5 public static void main(String[] args ){ 6 new Sub().print(); 7 } 8 }
执行结果:
父类构造函数开始
i=1
父类构造函数嗲用print()结束
成员变量j=20
j=20
j=40
转载于:https://www.cnblogs.com/lingxiasandu/archive/2013/04/19/3029892.html
构造方法的调用顺序和成员变量的初始化时机以及动态绑定相关推荐
- C++成员变量的初始化顺序问题
C++成员变量的初始化顺序问题 由于面试题中,考官出了一道简单的程序输出结果值的题:如下, [cpp] view plain copy print? class A { private: int n ...
- C++中类成员变量在初始化列表中的初始化顺序
引子:我们知道,C++中类成员变量的初始化顺序与其在类中的声明顺序是有关的. 先看代码: 1 class TestClass1 2 { 3 public: 4 TestClass1() { 5 cou ...
- Java 类加载顺序与成员变量初始化
类加载顺序 父类静态代码块(包括静态初始化块,静态属性,但不包括静态方法) 子类静态代码块(包括静态初始化块,静态属性,但不包括静态方法 ) 父类非静态代码块( 包括非静态初始化块,非静态属性 ) 父 ...
- 1.c++中初始化列表和构造函数初始化的区别是什么?2.类的成员变量的初始化顺序是按照声明顺序吗?
初始化列表和构造函数初始化的区别是什么? 初始化和赋值对内置类型的成员没有太大的区别,在成员初始化列表和构造函数体内进行,在性能和结果上都是一样的.只有一些需要注意的事项 初始化列表一般情况如下: D ...
- C++静态类型成员变量的初始化顺序(单例模式)
对编译器来说,静态成员变量的初始化顺序和析构顺序是一个未定义的行为 #include <string> #include <iostream> using namespace ...
- 【C/C++】成员变量的初始化顺序
变量的初始化顺序: ① 基类的静态变量或全局变量 ②派生类的静态变量或全局变量 ③基类的成员变量 ④派生类的成员变量 注意: ①成员变量在使用初始化列表初始化时,与构造函数中初始化成员列表的顺序无关, ...
- C++类中成员变量的初始化有两种方式
C++类中成员变量的初始化有两种方式: 构造函数初始化列表和构造函数体内赋值.下面看看两种方式有何不同. 成员变量初始化的顺序是按照在那种定义的顺序. 1.内部数据类型(char,int--指针等) ...
- java 成员变量的初始化_Java类变量和成员变量初始化过程
一.类的初始化 对于类的初始化:类的初始化一般只初始化一次,类的初始化主要是初始化静态成员变量. 类的编译决定了类的初始化过程. 编译器生成的class文件主要对定义在源文件中的类进行了如下的更改: ...
- C++类中成员变量的初始化总结
C++类中成员变量的初始化总结 1. 普通的变量: 一般不考虑啥效率的情况下 可以在构造函数中进行赋值.考虑一下效率的可以再构造函数的初始化列表中进行. 1 class CA 2 { 3 p ...
最新文章
- ASP.NET 2.0数据处理之高级分页/排序
- Azure PowerShell (6) 设置单个Virtual Machine Endpoint
- SVM_GUI_3.1[mcode]{by faruto}的安装及使用
- package.json和package-lock.json
- PowerDesigner数据库设计PDM基于Excel的导入导出总结
- Scala简介、安装、函数、面向对象
- 面向生态合作伙伴的实践分享回顾
- 机器人路径规划之RRT算法
- 猿辅导(实习800/天)面试算法题详解
- 大学计算机应用基础教学设计,大学计算机应用基础电子教案设计.doc
- 双链路是什么意思_双链路DVI是什么意思 工作原理是什么
- Babylongjs-动画
- 单片微机原理与接口技术——8051汇编指令系统与编程基础(2)数据传送指令
- MODULE_DEVICE_TABLE宏的作用
- linux 搜索FC存储设备,Linux FC-SAN存储搭建
- 后端——》Java程序推送微信订阅消息
- Cesium空间分析-填挖方计算(地形、模型通用)
- Android Handler讲述很详细的一篇文章
- 微信朋友圈视频动态怎么发?这么酷炫的功能,现在才知道
- envato elements国外设计网站素材代服务包月包年VIP高速下载