前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >专栏 >一个以前没有注意的问题:java构造函数的执行顺序

一个以前没有注意的问题:java构造函数的执行顺序

作者头像
哲洛不闹
发布于 2018-09-14 06:47:31
发布于 2018-09-14 06:47:31
9590
举报
文章被收录于专栏:java一日一条java一日一条

昨天在改一处代码时发现执行的过程和预想的不一样,仔细探究才发现是构造器执行顺序问题.(汗自己一下,基础不够扎实) 特地做了一些尝试然后把java构造器的执行顺序整理出来. 首先是我测试的代码:

执行结果如下: FatherProp is construct Father is construct SonProp is construct Son is construct 由此不难看出java类初始化时构造函数调用顺序: (1)初始化对象的存储空间为零或null值; (2)按顺序分别调用父类成员变量和实例成员变量的初始化表达式; (3)调用父类构造函数;(如果实用super()方法指定具体的某个父类构造函数则使用指定的那个父类构造函数) (4)按顺序分别调用类成员变量和实例成员变量的初始化表达式; (5)调用类本身构造函数。

评论:

1. 初始化分为为的初始化和实例的初始化 2. 每个类在 JVM 中都对应一个 Class 实例 3. 父类实例是作为子例的部分存在的 (Class 实例之间也存在父子关系) 4. 初始化实例之前要初始化类 基于以上几点就可以理解以下初始化顺序 1. 父类静态属性、静态类 (父类的初始化,对应 JVM 方法 cinit()) 2. 子类的静态属性、静态类 (子类的初始化,对应 JVM 方法 cinit()) 3. 父类的实例构造,实例变量初始化 (实例变量初始实际会放到 JVM 的 init() 中) 4. 子类的实例构造,实例变量初始化 (也是对应的 init() 方法) 关于类的 Class 实例,可以回想 Log 的声明 Log log = LogFactory.getLog(TestClass.class); 也就是无论你,new 多少个 TestClass 实例,它们对应着同一个 TestClass 的 Class 实例,也就是为什么很多地方把静态方法、静态属性说成是类的方法、类的属性,其实质就是在 JVM 中存在同一个 Class 实例的方法、属性,也就能保持一致性。 关于父类实例是作为子类的一部分存在,可借鉴 C++ 或是有面向对象特性的 C 函数库(如 gtk),来理解,父类实例会居于子类实例的首地址,所以对子类转型成父类实例时,它是安全的,因为首地址一样的,所以从首地址到 size(父类)就是父类实例地址空间,到size(子类)就是子类实例的地址空间。

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2016-12-23,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 java一日一条 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
Java 静态块、构造块、构造函数执行顺序
1.静态块:用static声明,JVM加载类时执行,仅执行一次 2.构造块:类中直接用{}定义,每次创建对象时执行 3.执行顺序优先级:静态块>main()>构造块>构造方法 4.静态块和静态属性优先执行,谁在前先执行谁。
pydata
2018/08/02
1.8K0
Java代码块执行顺序初探
Java继承中对构造函数是不继承的,只是显式或者隐式调用,并且必须是在构造函数第一行。这里是隐式调用了super()。
WindCoder
2018/09/19
2.7K0
一文理解java对象初始化顺序
​ 由类加载器负责根据一个类的全限定名来读取此类的二进制字节流到JVM内部,并存储在运行时内存区的方法区,然后将其转换为一个与目标类型对应的java.lang.Class对象实例
SecondWorld
2019/11/01
5760
静态代码块、构造代码块以及构造函数的加载顺序
首先,静态代码块,构造代码块,和构造函数都存在于一个类中,只不过,他们执行的先后顺序和执行的次数不同。
week
2018/08/24
7390
Java基础系列5:Java代码的执行顺序
该系列博文会告诉你如何从入门到进阶,一步步地学习Java基础知识,并上手进行实战,接着了解每个Java知识点背后的实现原理,更完整地了解整个Java技术体系,形成自己的知识框架。
说故事的五公子
2019/11/14
7770
[ Java学习基础 ] Java构造函数
   构造方法是类中特殊方法,用来初始化类的实例变量,它在创建对象(new运算符)之后自动调用。 Java构造方法的特点如下: 构造方法名必须与类名相同。 构造方法没有任何返回值,包括void。 构造方法只能与new运算符结合使用。 示例代码如下: 1 //Rectangle.java文件 2 package com.a51work6; 3 4 // 矩形类 5 public class Rectangle { 6 7 // 矩形宽度 8 int wi
Kevin_Zhang
2018/05/22
1.3K0
Java关键字final、static总结与对比
Java关键字final有“不可改变的”或者“终态的”含义,它可以修饰非抽象类、非抽象类成员方法和变量。你可能出于两种理解而需要阻止改变:设计或效率。
chenchenchen
2022/03/09
9100
Java关键字final、static总结与对比
c++系列之一构造函数
这里有三个类,其中A,C类是B的父类,然后在Main函数中声明一个B类型的变量,然后程序的输出是这样的:
早起的鸟儿有虫吃
2019/05/05
6900
c++系列之一构造函数
05 Java 类和对象
面向对象是 Java 最重要的特性。Java 是彻底的、纯粹的面向对象语言,在 Java 中“一切都是对象”。本章将介绍面向对象基础知识。
acc8226
2022/05/17
6440
05 Java 类和对象
Java:关于Static静态关键字的那些小事
前言 在Java中,静态 Static关键字使用十分常见 本文全面 & 详细解析静态 Static关键字,希望你们会喜欢 目录 1. 定义 一种 表示静态属性的 关键字 / 修饰符 2. 作用 共用、
Carson.Ho
2019/02/22
4490
一网打尽“类”的初始化实例化知识点
之前说了类加载的过程,但是有的读者表示还是有些面试题还是答不来,所以今天就来总结下类加载、对象实例化方面的知识点/面试题,帮助大家加深印象。
码上积木
2021/01/11
6270
一个对象的前世今生
在Java中,一个对象在可以被使用之前必须要被正确地初始化,这一点是Java规范规定的。在实例化一个对象时,JVM首先会检查相关类型是否已经加载并初始化,如果没有,则JVM立即进行加载并调用类构造器完成类的初始化。在类初始化过程中或初始化完毕后,根据具体情况才会去对类进行实例化。本文试图对JVM执行类初始化和实例化的过程做一个详细深入地介绍,以便从Java虚拟机的角度清晰解剖一个Java对象的创建过程。
Bug开发工程师
2018/07/23
4880
一个对象的前世今生
测试必备之Java知识(一)—— Java基础
开发的java源代码,通过javac编译成为平台无关的字节码文件(class),然后通过JVM的解释器将字节码解释成对应的机器码
小菠萝测试笔记
2020/06/09
6020
【Kotlin】Kotlin 构造函数 ( 主构造函数 | 主构造函数声明属性 | init 初始化代码块 | 次构造函数 | 构造函数委托 | 调用构造函数创建实例对象 )
1 . 构造函数个数 : Kotlin 类定义时需要指定主构造函数 , 还可以指定 0 ~ 多个次构造函数 ;
韩曙亮
2023/03/27
4.3K0
【小家java】类中静态代码块、构造代码块、静态变量、成员变量执行顺序和继承逻辑
诚如各位所知,java的三大特性:封装、继承、多态。其中继承,是java中最有学问的一点也是最相对来说最难理解的一些东西,本文针对于此,做一些实例分析,希望能够帮助大家理解java中的继承机制
YourBatman
2019/09/03
1.5K0
【小家java】类中静态代码块、构造代码块、静态变量、成员变量执行顺序和继承逻辑
夯实Java基础系列7:一文读懂Java 代码块和执行顺序
本系列文章将整理到我在GitHub上的《Java面试指南》仓库,更多精彩内容请到我的仓库里查看
程序员黄小斜
2019/09/27
6360
从 static 关键字深入理解 java对象初始化顺序
最近在阅读 ThreadLocal 源码的时候,发现一段很有意思的代码,代码片段如下:
猿芯
2020/12/03
4210
从 static 关键字深入理解 java对象初始化顺序
java从入门到精通四(面向对象上,类与对象的实现,代码块的执行顺序)
面向对象的方法主要是把事物对象化,包括属性和行为。而面向对象编程则比较贴近生活的实际,也就说,在程序中的编程,力图对描述的事物在现实中的形态保持一致。为了做到这一点,我们java中也就有类和对象的概念。类是对一类事物的抽象,类下就有若干对象,对象用于描述类中事物的个体。说来光看定义还是比较抽象,不容易理解。我们在下面的编程实践中可以大致理解这种思维模式。
兰舟千帆
2022/07/16
7800
java从入门到精通四(面向对象上,类与对象的实现,代码块的执行顺序)
static与final的区别
final被修饰的变量为常量一旦赋值不能修改,被修改的方法为最终方法不能被重写,被修饰的类是最终类,不能被继承 static被修饰的变量和方法,为该整个类及其类的对象所共享,一个类或对象修改了被定义的类或方法,其他的也会跟着变量。这就是说被static修饰的是大家共用的。就一块肥皂多个人用,每个人用都会少,而不是像不用static修饰的是每个人有每个人的肥皂,你用自己的和别人没有关系。。
zhangjiqun
2024/12/16
820
面试题丨Java的类/实例初始化过程
昨天看到群里面有人分享了一道题目,我答错了,于是趁机了解了下Java的类/对象初始化过程:
本人秃顶程序员
2019/05/13
9730
面试题丨Java的类/实例初始化过程
推荐阅读
相关推荐
Java 静态块、构造块、构造函数执行顺序
更多 >
领券
社区富文本编辑器全新改版!诚邀体验~
全新交互,全新视觉,新增快捷键、悬浮工具栏、高亮块等功能并同时优化现有功能,全面提升创作效率和体验
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
查看详情【社区公告】 技术创作特训营有奖征文