构造方法的调用顺序和成员变量的初始化时机以及动态绑定

     构造方法的调用顺序:子类构造器中,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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/259842.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Python interview_python

https://github.com/taizilongxu/interview_python 1 Python的函数参数传递 strings, tuples, 和numbers是不可更改的对象,而list,dict等则是可以修改的对象 2 Python中的元类(metaclass) 3 staticmethod和classmethod python 三个方法,静态方法&#xf…

突然不能 ip访问服务器文件夹,用友U8 工作站连接不到服务器,ping IP及服务器名都正常,访问服务器共享文件夹也正常...

用友U8 U8存货采购入库单存货现存量与存货核算中的明细帐数量不符用友U8 U8存货采购入库单存货现存量与存货核算中的明细帐数量不符问题原因:错误原因见下面解决方案中的分析。解决方法:在查询存货明细帐和现存量09仓库存货510241数量为123,但在添采购入库单红字时却…

rocketmq 消息 自定义_RocketMQ消息轨迹-设计篇

RocketMQ 消息轨迹主要包含两篇文章:设计篇与源码分析篇,本节将详细介绍RocketMQ消息轨迹-设计相关。RocketMQ消息轨迹,主要跟踪消息发送、消息消费的轨迹,即详细记录消息各个处理环节的日志,从设计上至少需要解决如下…

再次献给那些心软的人!!!

上次那篇日志朋友看了评论说:别太悲观……为那些坏人成为坏人才是最不值得的!而且好人说要当坏人就只是说说而已,真碰到啥事,依旧会傻傻的帮……没错,我还是傻傻的帮了,最初会表现出一点不乐意,…

手机做服务器性能咋样,服务器性能不足 怎样才能逼出最强状态

而且,服务器的节能不仅仅意味着节省了电费,其后续的散热降温等工作都可以得到更好的节约。同时,服务器的在长时间工作的情况下,保持较低温度有利于降低其承载负荷,最大限度发挥其能力,保障服务器工作运行的…

ASP.NET跨页面传值技巧总结

1. 使用QueryString变量 QueryString是一种非常简单的传值方式,他可以将传送的值显示在浏览器的地址栏中。如果是传递一个或多个安全性要求不高或是结构简单的数值时,可以使用这个方法。但是对于传递数组或对象的话,就不能用这个方法了。下面…

RTMP协议中文翻译(首发)(转)

Adobe公司的实时消息传输协议 摘要 此备忘录描述了 Adobe公司的实时消息传输协议(RTMP),此协议从属于应用层,被设计用来在适合的传输协议(如TCP)上复用和打包多媒体传输流(如音频、视频和互动内容)。 目录 …

关卡 动画 蓝图 运行_UE4入门之路(基础蓝图篇):蓝图的制作

蓝图系统简介蓝图系统是UE4中十分有代表性的一个特点,所谓蓝图就是一种可视化的脚本。该系统非常灵活且非常强大,因为它为设计人员提供了一般仅供程序员使用的所有概念及工具。 程序员能够很方便的创建一个基础系统,并交给策划进一步在蓝图中…

overfitting(过度拟合)的概念

来自:http://blog.csdn.net/fengzhe0411/article/details/7165549 最近几天在看模式识别方面的资料,多次遇到“overfitting”这个概念,最终觉得以下解释比较容易接受,就拿出来分享下。 overfittingt是这样一种现象:一个…

虚拟串口服务器zenetmanager,Avocent服务器/串口管理 KVM

MergePoint Unity交换机在单个设备中结合了 KVM over IP和串行控制台管理技术。这项独特的结合为IT管理员提供了用于访问和控制服务器、网络设备及其他数据中心和分支办公室设备的完整远程管理解决方案。MergePoint Unity交换机直接与物理KVM、USB和串行端口进行安全的远程带外…

KAFKA分布式消息系统

Kafka[1]是linkedin用于日志处理的分布式消息队列,linkedin的日志数据容量大,但对可靠性要求不高,其日志数据主要包括用户行为(登录、浏览、点击、分享、喜欢)以及系统运行日志(CPU、内存、磁盘、网络、系统…

jar打包 剔除第三方依赖以及它的依赖_面试官:为什么Spring Boot的jar可以直接运行?...

来源:Gormats Notesfangjian0423.github.io/2017/05/31/springboot-executable-jar/Spring Boot Loader抽象的一些类JarLauncher的执行过程关于自定义的类加载器LaunchedURLClassLoaderSpring Boot Loader的作用SpringBoot提供了一个插件spring-boot-maven-plugin用…

CQRS架构图

2019独角兽企业重金招聘Python工程师标准>>> 转载于:https://my.oschina.net/darkness/blog/814243

SQLite中不支持的sql语法

今天很自然的在写Sql语句的时候用了Top,一开始没发现问题,因为我从数据库读出的值正好是0,而我习惯变量定义的时候也都赋值0,可是到我不要0的时候我就发现问题了。后来才知道,可爱的小sqlite竟然有不支持的sql语法。 看…

Analyzer普通用户登录不了[从网络访问此计算机]

问题: 最近客户诺奇反映说Analyzer普通用户登录不了,但是发现管理员又可以登录,几经周折发现原来是系统的本地安全策略设置了不让远程使用本地账户密码登录系统导致。解决方案: 修改本地安全策略的“从远程访问此计算机”中的用户…

金蝶系统服务器要求,金蝶服务器安装及其相关要求.doc

K/3WISE创新管理平台 V12.2标准部署环境说明目录1. 多语言部署规则21.1 客户端多语言部署规则21.2 中间层多语言部署规则31.3 数据库多语言部署规则31.4 人力资源、管理门户、CRM多语言部署规则41.5 Citrix远程接入多语言部署规则42. 多语言部署架构图52.1 简体中间层52.2 繁体…

源码 移植_FreeModbus移植总结

modbus是一项工业上经常用到的通讯协议,而freemodbus是一款开源的从机协议栈。关于它的移植网上已经有了很多的文章,但是大多都只是针对其中部分问题的表述。本文将会把自己在移植freemodbus过程中遇到的问题以及freemodbus的源码分析尽量表述清楚。&…

expect脚本的简单应用

expect是一个用来处理交互的命令。借助于expect我们可以把交互过程写在一个脚本上,使之自动化完成。expect最核心的四个命令:send:用于向进程发送字符串 except:从进程接收字符串 spawn:打开一个新的进程 interact:保持交互的状态首先一个简单…

ajax中datatype是json,dataType:'json'vs data:$ .ajax中的JSON.stringify(obj)

我有这个数据结构:var formValues {TemporaryToken: a.userStatus.get("TemporaryToken"),MemorableWordPositionAndValues:[{Position: a.userStatus.get("MemorableWordPositions")[0],Value: this.$([name"login-memorable-character-…

sqlserver 查询中使用Union或Union All

在 程序人生网站上 看到了 这篇文章 就收藏了 哈 http://www.ourcodelife.com/article-415-1.html 首先,在程序人生网站上,需要负责任的指出的是在SQL Server查询中使用Union或Union All后Order by排序无效,我不确认是不是微软的bug&#xf…