原文地址: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基础之——类的初始化顺序(转载)相关推荐

  1. Java和Kotlin类的初始化顺序

    Java Java程序初始化的顺序:父类静态变量 -> 父类静态代码块 -> 子类静态变量 -> 子类静态代码块 -> 父类非静态变量 -> 父类非静态代码块 -> ...

  2. Java -基础知识之类的初始化顺序

    前言 在听课时遇到的一个复杂的类初始化实例问题,在这里进行总结和反思,也是为了更好的可以回看 问题-1 小试牛刀O(∩_∩)O 主方法实例化Hongtao类 答案为: getPhone 初始化块 构造 ...

  3. Java类的初始化顺序 (静态变量、静态初始化块、变量、初始...

    很有意思的一篇文章 1.没有继承 静态变量->静态初始化块->变量->变量初始化块->构造方法 2.有继承的情况 父类静态变量->父类静态初始化块->子类静态变量- ...

  4. java类成员初始化_简单了解Java类成员初始化顺序

    这篇文章主要介绍了简单了解Java类成员初始化顺序,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下 类中包含7中成员: 1.静态变量 static 2 ...

  5. java类的静态成员初始化_Java类的初始化顺序 (静态变量、静态初始化块、变量、初始......

    很有意思的一篇文章 1.没有继承 静态变量->静态初始化块->变量->变量初始化块->构造方法 2.有继承的情况 父类静态变量->父类静态初始化块->子类静态变量- ...

  6. Java 类的初始化顺序

    Java 类的初始化顺序 Java中类的初始化顺序是:父类静态代码块-->子类静态代码块-->父类非静态代码块-->父类构造器-->子类非静态代码块-->子类构造器. 测 ...

  7. java 初始化参数_JAVA类的初始化顺序与initialize参数

    JAVA类的初始化顺序依次是:(静态变量.静态初始化块)->(变量.初始化块)->构造函数, 相同级别的以定义顺序为准,  且静态变量和静态初始化块只初始化一次.通过下面的代码来验证. p ...

  8. Java类的初始化顺序

    对于静态变量.静态初始化块.变量.初始化块.构造器,它们的初始化顺序依次是(静态变量.静态初始化块)>(变量.初始化块)>构造器. 初始化顺序图示: 我们也可以通过下面的测试代码来验证这一 ...

  9. Java基础18-String类【String类的特点对象个数常用方法】【超详细讲解】

    Java基础-String类[超详细讲解] String类的特点 String在java.lang.String包中 1:特点 (1)String类型不能被继承,因为由final修饰 (2)Strin ...

最新文章

  1. 【实战演练】两种方法让 Docker 帮您快速构建应用程序
  2. 【操作系统】进程间通信
  3. ****** 五十 ******、软设笔记【UML分析和意义】-类图、对象图、状态图、活动图、顺序图、协作图、构件图、部署图,动静态模式...
  4. Android中实现不同文字颜色和图文混排的Span总结
  5. 天池大赛通用目标检测的对抗攻击方法一览
  6. df的缺失值处理 df.isnull()和df.dropna()
  7. 计算机专业带给我们的启示,一次电脑网络调查带给我的启示
  8. java获取子路径_Java中路径的获取
  9. vector自动扩容如何实现_腾讯云ClickHouse如何实现自动化的数据均衡?
  10. Visual SVN的安装
  11. 安装nagios中php安装报错 configure error xml2-config not foud
  12. 稳居TIOBE前三,涨幅No.1,Python做了什么?
  13. c语言程序设计数字电位器,数字电位器X9C103 100级调节电路和单片机源程序
  14. GBaseStudio连接操作GBase数据库
  15. 信息学奥赛一本通-第一章答案合集
  16. 金融网络安全和反欺诈方法论,金融新兴技术成熟度几何?
  17. 由C注释向C++注释转换简单实现
  18. licenses.licx文件
  19. 实时视频直播平台的技术要点详解
  20. 4G模块中RSRP RSRQ RSSI SINR等信号值的含义和区别

热门文章

  1. MySQL中改变相邻学生座位_力扣——换座位(数据库的题
  2. mysql答题表设计_PHP+MYSQL问答系统中的提问和回答的表怎么设计
  3. 狎昵关系和依恋情结辨诠
  4. (C++)1046 划拳
  5. (C++)第一个字母变成第26个字母,第i个字母变成第(26-i+1)个字母,非字母字符不变。要求根据密码译回原文,并输出。
  6. 使用阿里云发布分布式网站,开发时候应该注意什么?
  7. C++ Primer(第4版)(评注版)
  8. CoAP 协议解析说明(转)
  9. cocostudio UI编辑器中UITextField输入框控件光标
  10. Python 字典(Dictionary)