`
len-len
  • 浏览: 21935 次
  • 性别: Icon_minigender_1
  • 来自: 广州
社区版块
存档分类
最新评论

java中在创建对象时候的初始化顺序

    博客分类:
  • java
阅读更多

    最近由于工作空闲时间较多(不是酱油哦),闲暇之余,想多学习点java的基础知识。目的嘛,说的大点,就是增加自己的知识的深度。因为目前java的开发人员,很多都处于一个很低层次的水平,完全的code+copy,缺乏对基础知识的掌握,也就完全成为了“码工”,很有必要对基础知识充充电,在以后换工作,面试的时候也许让面试官刮目相看,至少让别人看到了你不只是会code,还有对java的基础理解,面向对象的理解。废话不多说了,进入正题。
    今天想说说java在创建对象的时候的初始化顺序,其实大家如果笔试,或者面试的时候,经常会遇到一些初始化的问题,反正我是遇到过。今天我们就来看看。

    先看下我写的几个示例类,一个父类,一个子类继承这个父类,最简单的模式。

/**父类*/
package test;
public class Father {
	static
	{ System.out.println("父类静态初始化块");}
	{ System.out.println("父类初始化块");      }
	private static int b = 1;
	public Father() {
		System.out.println("调用了父类无参构造器");
	}
	public Father(int b) {
		this.b = b;
		System.out.println("调用父类的有参构造器");
	}
}
/**子类*/
package test;
public class Son extends Father {
	static
	{ System.out.println("子类静态初始化块"); }
	{ System.out.println("子类初始化块");       }
	private static int a =1;
	public Son() {
		System.out.println("调用子类的构造器");
	}
	public Son(int a){
		this.a=a;
		System.out.println("调用子类的有参构造器");
	}
}

  •    单独的一个对象初始化,不含继承和其他情况

package test;
public class Test {

	public static void main(String[] args) {
		Father father = new Father();
	}
}

 

    打印的结果为:

    父类静态初始化块

    父类初始化块

    调用了父类无参构造器

 

    我们来分析下,大家都知道静态对象(包括静态块,静态方法,静态属性),都是和类相关联的。当第一次创建对象的时候,首先初始化的应该是静态对象,然后才是非静态对象,最后才是构造器去创建实例。所以大致的顺序应该是:静态对象-非静态对象-构造器。那么在静态对象或者非静态对象中是否也存在一个什么顺序呢?经过测试,我们发现其实在同等的优先级的情况下,是按照声明的顺序初始化的。

  • 包含继承的子类初始化

下面讨论另外一个问题,设计到继承的问题,我们现在创建Son对象,他会执行父类的一些初始化么,他和子类的一些初始化之间又存在什么关联呢?

 

package test;
public class Test {
	public static void main(String[] args) {
		Son son = new Son();
	}
}
 

   打印语句:

    父类静态初始化块

   子类静态初始化块

   父类初始化块

   调用了父类无参构造器

   子类初始化块

   调用子类的构造器

  打印语句告诉了我们,静态对象依然是第一个初始化的,然后呢?就是父类中的非静态对象-构造器,子类中的非静态对象-构造器。

  • 包含继承和多态的子类初始化

  再看如果是多态的情况下会有什么情况出现呢?

 

package test;

public class Test {

	public static void main(String[] args) {
		Father father = new Son();
	}
}

 打印语句:

     父类静态初始化块

     子类静态初始化块

     父类初始化块

     调用了父类无参构造器

     子类初始化块

     调用子类的构造器

和前面继承的情况完全一样,这里不再啰嗦了。

 

总的一个结论就是:静态对象总是在第一次创建对象前就已经初始化完毕,初始化的顺序从最顶端的父类到子类,只会初始化一次。然后就是从父类到子类中,依次初始化非静态对象和构造器。

 

 

30
6
分享到:
评论
13 楼 netwelfare 2015-06-07  
分析的不错,关于对象初始化的过程有很多,从网上看到一篇文章,推荐看看:Java对象的初始化过程研究与探索
12 楼 当时年轻 2012-10-28  
   
11 楼 xueji5368 2012-05-28  
原来如此,难怪每次都不知道是怎么运行的。看来得好好补补基础了。
10 楼 jazzmozart 2012-04-07  
学习下楼主的分享
9 楼 huqiji 2012-04-07  
不错,谢谢
8 楼 蚂蚁路过 2012-04-06  
学习了··
7 楼 乱_战 2012-04-06  
不错,学习了
6 楼 fackyou200 2012-04-06  
留个脚印...
5 楼 chenyunhong 2012-04-06  
不错,学习了!
4 楼 hgj0521 2012-02-24  
路过,留下个脚印,。
3 楼 zhumeilian 2012-02-21  
2 楼 taoge2121 2012-02-20  
挺不错的……
1 楼 yangnanenana 2012-02-20  
学习了!关注~

相关推荐

    Java开发者文档,分享日常学习的一些小知识点 .rar

     在创建对象时,对象所在类的所有数据成员会首先进行初始化。  基本类型:int型,初始化为0。  如果为对象:这些对象会按顺序初始化。  ※在所有类成员初始化完成之后,才调用本类的构造方法创建对象。  ...

    JAVA基础知识精华总结 收藏

    在创建对象时,对象所在类的所有数据成员会首先进行初始化。 基本类型:int型,初始化为0。 如果为对象:这些对象会按顺序初始化。 ※在所有类成员初始化完成之后,才调用本类的构造方法创建对象。 构造方法的...

    Thinking in java4(中文高清版)-java的'圣经'

    5.6.1 指定初始化 5.7 构造器初始化 5.7.1 初始化顺序 5.7.2. 静态数据的初始化 5.7.3. 显式的静态初始化 5.7.4. 非静态实例初始化 5.8 数组初始化 5.8.1 可变参数列表 5.9 枚举类型 5.10 总结 第6章 访问权限控制 ...

    Java 基础核心总结 +经典算法大全.rar

    类的初始化 成员初始化 构造器初始化初始化顺序 数组初始化 对象的销毁 对象作用域 this 和 super 访问控制权限继承 多态组合代理 向上转型static final 接口和抽象类接口 抽象类异常 认 识 Exception 什么是 ...

    Java开发技术大全(500个源代码).

    errorInit.java 演示变量初始化错误的程序 integerExample.java 演示各种整型变量的使用 isPrime.java 判断素数 leapYearByIf.java 用if语句判断闰年 leapYearByLogical.java 用逻辑表达式判断闰年 lowToUpper...

    Thinking in Java简体中文(全)

    7.5.4 初始化接口中的字段 7.6 内部类 7.6.1 内部类和上溯造型 7.6.2 方法和作用域中的内部类 7.6.3 链接到外部类 7.6.4 static内部类 7.6.5 引用外部类对象 7.6.6 从内部类继承 7.6.7 内部类可以覆盖吗? 7.6.8 ...

    java联想(中文)

    7.5.4 初始化接口中的字段 7.6 内部类 7.6.1 内部类和上溯造型 7.6.2 方法和作用域中的内部类 7.6.3 链接到外部类 7.6.4 static内部类 7.6.5 引用外部类对象 7.6.6 从内部类继承 7.6.7 内部类可以覆盖吗? 7.6.8 ...

    疯狂JAVA讲义

    5.3.2 成员变量的初始化和内存中的运行机制 128 5.3.3 局部变量的初始化和内存中的运行机制 130 5.3.4 变量的使用规则 130 5.4 隐藏和封装 132 5.4.1 理解封装 132 5.4.2 使用访问控制符 132 5.4.3 package和...

    java基础核心总结归纳---参考手册--心得手册-学习资料-总结经验

    初始化顺序 16 this 和 super 16 访问控制权限 16 继承 17 多态 17 代理 17 Static 17 Final 17 接⼝和抽象类 18 接⼝ 18 抽象类 18 异常 18 认识 Exception 18 什么是 Throwable 18 常⻅的 Exception 19 与 ...

    Thinking in Java 中文第四版+习题答案

    7.5.4 初始化接口中的字段 7.6 内部类 7.6.1 内部类和上溯造型 7.6.2 方法和作用域中的内部类 7.6.3 链接到外部类 7.6.4 static内部类 7.6.5 引用外部类对象 7.6.6 从内部类继承 7.6.7 内部类可以覆盖吗? 7.6.8 ...

    Java 语言基础 —— 非常符合中国人习惯的Java基础教程手册

    创建对象包括声明、实例化和初始化三方面的内容。通常的格式为 : 1. 声明对象 对象声明实际上是给对象命名,也称定义一个实例变量。对象声明的一般格式为: type name 其中,type 是一个类的类名,用它声明的对象将...

    java 面试题 总结

    对于客户机,EntityBean是一种持久性对象,它代表一个存储在持久性存储器中的实体的对象视图,或是一个由现有企业应用程序实现的实体。 Session Bean 还可以再细分为 Stateful Session Bean 与 Stateless Session ...

    Thinking in java(中文)

    <br>第2章 一切都是对象 2.1 用句柄操纵对象 2.2 必须创建所有对象 2.2.1 保存在什么地方 2.2.2 特殊情况:主类型 2.2.3 Java中的数组 2.3 绝对不要清除对象 2.3.1 作用域 2.3.2 对象的...

    JAVA面试题解惑系列合集

    1.1 JAVA面试题解惑系列(一)——类的初始化顺序 1.2 JAVA面试题解惑系列(二)——到底创建了几个String对象? 1.3 JAVA面试题解惑系列(三)——变量(属性)的覆盖 1.4 JAVA面试题解惑系列(四)——final、...

    java 编程入门思考

    7.5.4 初始化接口中的字段 7.6 内部类 7.6.1 内部类和上溯造型 7.6.2 方法和作用域中的内部类 7.6.3 链接到外部类 7.6.4 static内部类 7.6.5 引用外部类对象 7.6.6 从内部类继承 7.6.7 内部类可以覆盖吗? 7.6.8 ...

    Java初学者入门教学

    7.5.4 初始化接口中的字段 7.6 内部类 7.6.1 内部类和上溯造型 7.6.2 方法和作用域中的内部类 7.6.3 链接到外部类 7.6.4 static内部类 7.6.5 引用外部类对象 7.6.6 从内部类继承 7.6.7 内部类可以覆盖吗? 7.6.8 ...

    JAVA_Thinking in Java

    7.5.4 初始化接口中的字段 7.6 内部类 7.6.1 内部类和上溯造型 7.6.2 方法和作用域中的内部类 7.6.3 链接到外部类 7.6.4 static内部类 7.6.5 引用外部类对象 7.6.6 从内部类继承 7.6.7 内部类可以覆盖吗? 7.6.8 ...

    超爽的自学课件(java)

    在这一章的最后,我们将更贴近地观察初始化过程:自动成员初始化、指定成员初始化、初始化的顺序、static(静态)初始化以及数组初始化等等。 <br>(5) 第5章:隐藏实现过程 本章要探讨将代码封装到一起的方式...

    JAVA入门1.2.3:一个老鸟的JAVA学习心得 PART1(共3个)

    2.3.1 在Eclipse中创建自己的第一个项目 28 2.3.2 在Eclipse中编写HelloWorld程序 29 2.3.3 通过Eclipse运行Hello World 31 2.4 小结:Eclipse——功能很强大 32 2.5 习题 32 第3章 Java中的基本数据类型和...

    Java面试题解惑系列

    来自网络,主要包括以下内容:1、类初始化的顺序;2、到底创建了几个String对象;3、变量(属性)的覆盖;4、final,finally,finalize;5.传了值还是传了引用;6.String杂谈;7.日期与时间的处理;8.基本类型总结;9....

Global site tag (gtag.js) - Google Analytics