一、 代码块的概念

在探究对象初始化顺序之前,我们先通过代码来了解一下代码块的概念。

class Test{

public static String str1; //静态字段

public String str2; //普通字段

static{

//静态代码块

}

{

//构造代码块

}

public Test() {

//构造函数

}

}

二、 创建子类对象时,对象的初始化顺序

1. 字段初始化、代码块和构造函数的执行顺序

我们先看代码和结果

public class CodeBlockTest {

public static void main(String[] args) {

Child child = new Child();

}

}

class Father {

public static String fatherStr1 = "fatherStr1(静态字段初始化值)";

public String fatherStr2 = "fatherStr2(字段初始化值)";

static {

System.out.println("父类静态代码块:" + fatherStr1);

fatherStr1 = "fatherStr1(静态代码块赋值)";

}

{

System.out.println("父类构造代码块:" + fatherStr2);

fatherStr2 = "fatherStr2(构造代码块赋值)";

}

public Father() {

System.out.println("父类构造函数块:" + fatherStr2);

fatherStr2 = "fatherStr2(构造函数赋值)";

}

}

class Child extends Father {

public static String childStr1 = "childStr1(静态字段初始化值)";

public String childStr2 = "childStr2(字段初始化值)";

static {

System.out.println("子类静态代码块:" + childStr1);

childStr1 = "childStr1(静态代码块赋值)";

}

{

System.out.println("子类构造代码块:" + childStr2);

childStr2 = "childStr2(构造代码块赋值)";

}

public Child() {

System.out.println("子类构造函数:" + childStr2);

childStr2 = "childStr2(构造函数赋值)";

}

}

// 输出结果:

// 父类静态代码块:fatherStr1(静态字段初始化值)

// 子类静态代码块:childStr1(静态字段初始化值)

// 父类构造代码块:fatherStr2(字段初始化值)

// 父类构造函数块:fatherStr2(构造代码块赋值)

// 子类构造代码块:childStr2(字段初始化值)

// 子类构造函数:childStr2(构造代码块赋值)

通过每执行一个代码块或构造函数,输出字段在上一代码块执行后的值,以此来探究对象的初始化顺序。

由目前的输出结果可知,对于对象的初始化顺序,我们可以得出以下结论:

1. 父类静态字段初始化

2. 父类静态代码块、子类静态字段初始化 (接下来探究两者的顺序)

3. 子类静态代码块

4. 父类普通字段初始化

5. 父类构造代码块

6. 父类构造函数

7. 子类普通字段初始化

8. 子类构造代码块

9. 子类构造函数

2. 父类静态代码块和子类静态字段初始化的执行顺序

还是一样,我们通过代码的执行结果来探究两者间的执行顺序。

public class CodeBloacTest2 {

public static void main(String[] args) {

Child child = new Child();

}

}

class Father {

public static String fatherStr = "(静态字段初始化值)";

static {

System.out.println("父类静态代码块:fatherStr" + fatherStr);

fatherStr = "(静态代码块赋值)";

}

}

class Child extends Father {

public static String childStr = fatherStr;

static {

System.out.println("子类静态代码块:childStr = fatherStr" + childStr);

childStr = "(静态代码块赋值)";

}

}

// 输出结果:

// 父类静态代码块:fatherStr(静态字段初始化值)

// 子类静态代码块:childStr = fatherStr(静态代码块赋值)

我们在子类静态字段childStr初始化的时候,赋的是父类静态字段fatherStr的值。由输出结果可知,childStr初始化后的值是父类静态代码块执行后赋予fatherStr的值。由此可知两者的执行顺序为:父类静态代码块==>子类静态字段初始化

三、 结论

父类静态字段初始化

父类静态代码块

子类静态字段初始化

子类静态代码块

父类普通字段初始化

父类构造代码块

父类构造函数

子类普通字段初始化

子类构造代码块

子类构造函数

通过结论我们可以很明显的看出:static字段、代码块的执行顺序优先于非static字段、代码块。这是因为在静态域是属于类的,在类加载后就一直存在;而普通域需要创建对象才能访问。而在创建对象时,需要先加载父类,然后再加载子类,因此父类的静态字段初始化和静态代码块执行先于子类。

以上内容希望对各位朋友有所帮助

java 对象初始化过程_Java——对象初始化顺序使用详解相关推荐

  1. java object 源码_java中Object类 源代码详解

    packagejava.lang;public classObject {/*一个本地方法,具体是用C(C++)在DLL中实现的,然后通过JNI调用.*/ private static native ...

  2. java类多例_Java多例设计模式实例详解

    本文实例讲述了Java多例设计模式.分享给大家供大家参考,具体如下: 一.多例设计模式定义 多例设计模式就是存在多个对象实例,供外部应用裯用,比喻数据库连接池. 二.多例模式静态类图 三.多例模式代码 ...

  3. java读取本地文件_java 读取本地文件实例详解

    java 读取本地文件实例详解 用javax.xml.w3c解析 实例代码: package cn.com.xinli.monitor.utils; import org.w3c.dom.Docume ...

  4. java 读取本地文件_java 读取本地文件实例详解

    java 读取本地文件实例详解 用javax.xml.w3c解析 实例代码: package cn.com.xinli.monitor.utils; import org.w3c.dom.Docume ...

  5. java 超时重试机制_Java之Retry重试机制详解

    应用中需要实现一个功能: 需要将 常规解决方案 try- 在包装正常上传逻辑基础上,通过判断返回结果或监听异常决定是否重试,同时为了解决立即重试的无效执行(假设异常是有外部执行不稳定导致的:网络抖动) ...

  6. java使用变量输出_JAVA定义变量与输出详解

    一些重要知识 一个源文件里只能有一个public类,其它类数量不限.文件名与public类名相同 java程序严格区分大小写 JAVA应用程序的执行入口是main方法固定写法:public stati ...

  7. java闰年判断原理_java 面试题闰年判断详解及实例

    java 面试题闰年判断详解及实例 java 闰年判断 前言: 给定一个年份,判断这一年是不是闰年. 当以下情况之一满足时,这一年是闰年: 1. 年份是4的倍数而不是100的倍数: 2. 年份是400 ...

  8. java编程50实例_java编程实例大全及详解谜底(50例).doc

    java编程实例大全及详解谜底(50例).doc 还剩 33页未读, 继续阅读 下载文档到电脑,马上远离加班熬夜! 亲,很抱歉,此页已超出免费预览范围啦! 如果喜欢就下载吧,价低环保! 内容要点: 谓 ...

  9. java list 移除_java 中List删除实例详解

    java 中List删除实例详解 1.循环删除List中的元素 public static void main(String[] args) { List t=new ArrayList(); for ...

  10. java中throws用法_java中throws实例用法详解

    在程序出现异常时,会有一个抛出异常的throw出现,这里我们要跟今天所讲的throws区分开.throws的作用是声明抛出,在名称上也跟throw有所不同.下面我们就throws对策概念.语法.实例带 ...

最新文章

  1. 解决在onCreate()过程中获取View的width和Height为0的4种方法
  2. 创业公司自曝「被谷歌封杀」,阻断一切访问,上诉只得到机器人回复
  3. java父类转换成子类_【转】java 父类与子类的转换
  4. 论文笔记:Forecasting at Scale(Prophet)
  5. 2013年的财务预算
  6. 递归算法(一)递归概念与思路
  7. java ppt转html_word,ppt,excel转pdf,pdf转html工具类搭建
  8. Java-虚拟机-常量池的表现方式
  9. 兄弟9055cdn硒鼓清零_dcp—9020cdn硒鼓怎么清零
  10. Vijos P1335 数独验证【谜题】
  11. 2015.11-12 maxon电机接线——调试——控制
  12. “出色”IT项目经理的5大关键能力
  13. 24点递归实现(c语言)
  14. 高压油管matlab,高压油管的压力及流量控制
  15. mysql导入数据库报错:ERROR 1840 (HY000) at line 24: @@GLOBAL.GTID_PURGED can only be set when @@GLOBAL.GTID_
  16. 机器学习二(python sklearn逻辑回归)
  17. 计算机性能指标的类型,电脑显示器的分类, 性能指标介绍
  18. 计算机软硬件基本知识总结,计算机软硬件基础知识.doc
  19. linux pptpd 不能上网,CentOS7.7使用pptpd搭建服务器(配置好了,但是不能使用)
  20. win7 linux ssh key,Windows下创建SSH Key并登录Linux服务器

热门文章

  1. 【静态站点(一)】之 静态网站生成器
  2. C语言实例——判断是否为闰年
  3. C#LeetCode刷题之#345-反转字符串中的元音字母​​​​​​​(Reverse Vowels of a String)
  4. 计算机支持的游戏化教学,初中信息技术教学中游戏化教学的应用探究
  5. brew报错:in `initialize‘: Version value must be a string; got a NilClass () (TypeError)
  6. 用 Python 写出这样的进度条,刷新了我对进度条的认知
  7. Linux centos 使用yum安装MySQL
  8. Keras入门之搭建回归神经网络
  9. 如何快速查找下载java项目所需jar包
  10. 目录服务软件 AD和LDAP 的理解