java基础之——类的初始化顺序(转载)
原文地址:http://www.cnblogs.com/chrischennx/p/3612295.html
由浅入深,首先,我们来看一下,一个类初始化有关的都有些啥米:
静态成员变量、静态代码块、普通成员变量、普通代码块、构造器。(成员方法?貌似跟初始化没有啥关系)
现在我们来看看她们的初始化顺序,
从性质上来说,静态的代表的是一个类的属性,普通的是一个对象的属性,“皮之不存,毛将焉附”,没有类,就没法谈对象,所以静态的必须先初始化。
那么静态成员变量与静态代码块之间又是什么关系呢?
做了个实验,发现静态成员变量与静态代码块谁放前面谁先执行,但是!!!!注意!!!!这里说的是“执行”是指的把sx=10,这个10赋给sx,而不是sx的初始化,在实验2里在代码块中打断点,可以发现这个时候sx已经被初始化为0,这里我是这样理解的:既然在初始化这个类(或对象)的成员了,那说明已经给它分配好内存了,int分配好内存后默认值为0(基础类型的默认值有false,0,null),不知道这么理解对不对。所以最终的结论是,先初始化成员变量为默认值,然后根据成员变量与代码块的先后顺序进一步初始化。
实验代码如下:
//实验1 private static int sx = 10; static{ System.out.println("execute static block"); } 与 //实验2 static{ System.out.println("execute static block"); } private static int sx = 10;
接着说,普通成员变量与普通代码块和静态的一个道理,就不累述了。
那么构造器与普通成员变量和普通代码块的关系呢?
这个我是通过实验得了这么个结论,是成员变量的"=xxx"(和成员变量初始化为默认值区分)和代码块先执行,然后再执行构造器中的。(实验代码最后一并贴出)
ok到这里为止,一个类的我们简单的说完了,那么类还有继承呢,子类和父类结合到一起的时候又是什么一个顺序呢?
其实挺简单的,子类继承自父类,可以使用父类的非private成员,所以,在在初始化子类之前肯定是要先初始化父类。
最终的顺序是:
父类静态成员变量初始化为默认值—>
子类静态成员变量初始化为默认值—>
父类按出现的先后顺序执行静态成员变量的“=xxx”和静态代码块—>
子类的按出现的先后顺序执行静态成员变量的“=xxx”和静态代码块—>
父类普通成员变量初始化为默认值—>
子类普通成员变量初始化为默认值—>
父类按出现的先后顺序执行普通成员变量的“=xxx”和静态代码块—>
父类执行构造函数—>
子类的按出现的先后顺序执行普通成员变量的“=xxx”和静态代码块—>
子类执行构造函数—>end
实验代码:
package abstractClass;@SuppressWarnings("unused") abstract class AbstractDemo { { System.out.println("execute super block,this.x="+this.x); } static{ System.out.println("execute static super block,this.sx="+AbstractDemo.sx); } public static int SuperPS = 1; private static int sx = 1; private int x = 1; public AbstractDemo(){ super(); System.out.println("execute super constractor"); // this.print(); } public abstract void print(); } @SuppressWarnings("unused") class DemoImpl extends AbstractDemo{ public static int PS = 10; private static int sx = 10; private int x = 10; //从调试的结果来看,此处是在执行完super()之后执行,然后再接着执行构造器 { System.out.println("execute block,this.x="+this.x); } static{ System.out.println("execute static block,this.sx="+DemoImpl.sx); } public DemoImpl(int x){ super(); //断点 System.out.println("execute constractor"); System.out.println("before init in constractor this.x="+this.x); this.x = x; } @Override public void print(){ System.out.println("this.x="+x); } } public class TestAbstractDemo{ public static void main(String[] args) { new DemoImpl(100); } }
实验结果:
execute static super block,this.sx=0 execute static block,this.sx=10 execute super block,this.x=0 execute super constractor execute block,this.x=10 execute constractor before init in constractor this.x=10
转载于:https://www.cnblogs.com/limiracle/p/3998502.html
java基础之——类的初始化顺序(转载)相关推荐
- Java和Kotlin类的初始化顺序
Java Java程序初始化的顺序:父类静态变量 -> 父类静态代码块 -> 子类静态变量 -> 子类静态代码块 -> 父类非静态变量 -> 父类非静态代码块 -> ...
- Java -基础知识之类的初始化顺序
前言 在听课时遇到的一个复杂的类初始化实例问题,在这里进行总结和反思,也是为了更好的可以回看 问题-1 小试牛刀O(∩_∩)O 主方法实例化Hongtao类 答案为: getPhone 初始化块 构造 ...
- Java类的初始化顺序 (静态变量、静态初始化块、变量、初始...
很有意思的一篇文章 1.没有继承 静态变量->静态初始化块->变量->变量初始化块->构造方法 2.有继承的情况 父类静态变量->父类静态初始化块->子类静态变量- ...
- java类成员初始化_简单了解Java类成员初始化顺序
这篇文章主要介绍了简单了解Java类成员初始化顺序,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下 类中包含7中成员: 1.静态变量 static 2 ...
- java类的静态成员初始化_Java类的初始化顺序 (静态变量、静态初始化块、变量、初始......
很有意思的一篇文章 1.没有继承 静态变量->静态初始化块->变量->变量初始化块->构造方法 2.有继承的情况 父类静态变量->父类静态初始化块->子类静态变量- ...
- Java 类的初始化顺序
Java 类的初始化顺序 Java中类的初始化顺序是:父类静态代码块-->子类静态代码块-->父类非静态代码块-->父类构造器-->子类非静态代码块-->子类构造器. 测 ...
- java 初始化参数_JAVA类的初始化顺序与initialize参数
JAVA类的初始化顺序依次是:(静态变量.静态初始化块)->(变量.初始化块)->构造函数, 相同级别的以定义顺序为准, 且静态变量和静态初始化块只初始化一次.通过下面的代码来验证. p ...
- Java类的初始化顺序
对于静态变量.静态初始化块.变量.初始化块.构造器,它们的初始化顺序依次是(静态变量.静态初始化块)>(变量.初始化块)>构造器. 初始化顺序图示: 我们也可以通过下面的测试代码来验证这一 ...
- Java基础18-String类【String类的特点对象个数常用方法】【超详细讲解】
Java基础-String类[超详细讲解] String类的特点 String在java.lang.String包中 1:特点 (1)String类型不能被继承,因为由final修饰 (2)Strin ...
最新文章
- 【实战演练】两种方法让 Docker 帮您快速构建应用程序
- 【操作系统】进程间通信
- ****** 五十 ******、软设笔记【UML分析和意义】-类图、对象图、状态图、活动图、顺序图、协作图、构件图、部署图,动静态模式...
- Android中实现不同文字颜色和图文混排的Span总结
- 天池大赛通用目标检测的对抗攻击方法一览
- df的缺失值处理 df.isnull()和df.dropna()
- 计算机专业带给我们的启示,一次电脑网络调查带给我的启示
- java获取子路径_Java中路径的获取
- vector自动扩容如何实现_腾讯云ClickHouse如何实现自动化的数据均衡?
- Visual SVN的安装
- 安装nagios中php安装报错 configure error xml2-config not foud
- 稳居TIOBE前三,涨幅No.1,Python做了什么?
- c语言程序设计数字电位器,数字电位器X9C103 100级调节电路和单片机源程序
- GBaseStudio连接操作GBase数据库
- 信息学奥赛一本通-第一章答案合集
- 金融网络安全和反欺诈方法论,金融新兴技术成熟度几何?
- 由C注释向C++注释转换简单实现
- licenses.licx文件
- 实时视频直播平台的技术要点详解
- 4G模块中RSRP RSRQ RSSI SINR等信号值的含义和区别
热门文章
- MySQL中改变相邻学生座位_力扣——换座位(数据库的题
- mysql答题表设计_PHP+MYSQL问答系统中的提问和回答的表怎么设计
- 狎昵关系和依恋情结辨诠
- (C++)1046 划拳
- (C++)第一个字母变成第26个字母,第i个字母变成第(26-i+1)个字母,非字母字符不变。要求根据密码译回原文,并输出。
- 使用阿里云发布分布式网站,开发时候应该注意什么?
- C++ Primer(第4版)(评注版)
- CoAP 协议解析说明(转)
- cocostudio UI编辑器中UITextField输入框控件光标
- Python 字典(Dictionary)