`
wsy1983wsy
  • 浏览: 122391 次
  • 性别: Icon_minigender_1
  • 来自: 郑州
社区版块
存档分类
最新评论

java中构造函数的执行顺序

    博客分类:
  • java
阅读更多
首先假设有如下的一些辅助类,这些类被其他类使用作为静态变量或非静态变量:

public class C {
	public C() {
		System.out.println("C");
	}
}

public class E {
	public E() {
		System.out.println("E");
	}
}

public class F {
	public F() {
		System.out.println("F");
	}
}

public class G {
	public G() {
		System.out.println("G");
	}
}


public class H {
	public H() {
		System.out.println("H");
	}
}

1)继承自Object的类的构造函数的执行顺序:
假设有如下的一个类I,I的定义如下:
public class I {
	public G g = new G();
	public static E statice0 = new E();
	static {
		statice0 = new E();
		System.out.println("判断static执行的顺序");
	}
	public static E statice1;
	public static F f1;
	static {
		System.out.println("测试在static块中执行的顺序1");
		statice1 = new E();
		f1 = new F();
	}
	static {
		System.out.println("测试在static块中执行的顺序2");
		f1 = new F();
		statice1 = new E();
	}
	public static H h = new H();

	public E e;
	{
		System.out.println("aaa");
		e = new E();
	}

	public I(int i) {
		statice0 = new E();
		f1 = new F();
		e = new E();		
	}

	public static void main(String[] args) {
		I i = new I(1);
	}
}


执行结果:
E
E
判断static执行的顺序
测试在static块中执行的顺序1
E
F
测试在static块中执行的顺序2
F
E
H
G
aaa
E
F
H
E
从这个结果来可以知道,从Object派生的类将会按照如下的书序执行:
    1、静态变量,如果有静态块的话,则按照静态块中变量new的顺序执行静态变量构造函数。如果没有静态块的话,则按照声明的顺序执行。
    2、非静态变量,如果有非静态变量初始化块的话,则按照new的顺序执行构造函数,如果没有初始化块则按照声明的顺序执行。
    3、执行构造函数,所有的变量按照new的顺序执行构造函数。

2)如果是从非Object类结成的类
看如下的类:

public class A {
	private static E e = new E();
	private F f = new F();

	public A() {
		System.out.println("A");
	}
}

public class B extends A {
	private static D d = new D();
	private C c = new C();

	public B() {
		System.out.println("B");
	}

	public static void main(String[] args) {
		B b = new B();
	}
}


public class C {
	public static E e = new E();
	public C() {
		System.out.println("C");
	}
}



执行B中的main,则会打印出如下的结果:
E
H
G
D
F
A
E
C
B

首先分析各个类的调用情况,在父类A中有一个E的静态变量,和一个F的非静态变量,B类继承自A,B有一个D的静态变量和C的非静态变量,D中又有一个H的静态变量和g的非静态变量。
从执行得到的结果可以得到如下的结论:
    1、首先执行父类中的静态变量的构造函数,在执行构造函数之前执行静态变量的类中的静态变量的构造函数。因此在上例中首先输出:E
    2、执行本类的静态变量的构造函数,同上,需要执行静态变量的类中的静态变量的构造函数。上例中会在执行了A中的E的静态变量后执行D的静态变量的构造函数,在此之前需要执行D中的静态变量H的构造函数,然后执行D中的非静态变量G的构造函数。打印出:H G D
    3、执行父类中的非静态变量的构造函数。打印出:f
    4、执行父类的构造函数。打印出: A
    5、执行本类的非静态变量的构造函数,打印出:E C
    6、执行本类中的构造函数,按照new的顺序执行构造函数。打印出:B
分享到:
评论

相关推荐

    Java:静态代码块和构造函数执行顺序

     3 构造函数,(创建对象时执行完2后再执行构造函数,不管构造函数是public还是private) */ public class Test{ public Test(){ System.out.println("类Test构造方法被执行 6"); } { System.out.println("类...

    深入理解java构造器机理

    java构造方法是java类中最重要的一个概念,这篇文档涵盖了,java对象初始化过程中构造器调用的顺序,及作用。

    java中静态代码块与构造方法的执行顺序判断

    对静态代码块以及构造函数的执行先后顺序,一直很迷惑,直到最近看到一段代码,发现终于弄懂了,所以这篇文章主要给大家介绍了关于如何判断java中静态代码块与构造方法的执行顺序的相关资料,需要的朋友可以参考下。

    举例说明Java中代码块的执行顺序

    主要介绍了举例说明Java中代码块的执行顺序,包括静态属性和非静态属性以及构造函数等相关的执行先后,需要的朋友可以参考下

    Java中类的加载顺序

     具体的题目我肯定记不清,不过我们可以换个直接的问法,如果类A和类B中有静态变量,静态语句块,非静态变量,非静态语句块,构造函数,静态方法,非静态方法,同时类A继承类B,请问当实例化A时,类内部的加载顺序...

    在Java中自由块的执行顺序

    java中的自由块分为静态的自由块和非静态的自由块。非静态自由块的执行时间是:在执行构造函数之前。静态自由块的执行时间是:class文件加载时执行。

    java 基础 类对象创建实例化过程 实例解析

    * 继承树中的从最高层开始的实例语句块{}、然后对应的构造函数、以及构造函数中调用的方法 * (如果是重写即子类将父类的实例方法重写类,则调用子类的,如果是隐藏即方法则父类中声明为静态方法,则调用父类本身的...

    字节跳动、腾讯java面试.zip

    讲讲类的实例化顺序,比如父类静态数据,构造函数,字段,子类静态数据,构造函数,字段,当 new 的时候,他们的执行顺序。 是什么,他们内部原理分别是什么,比如存储方式,hashcode,扩容,默认容量等。 JAVA8 的 ...

    java面试800题

    (3) super.([paramlist]) //调用父类中的构造函数 在类方法中(static),不能使用this或super修饰符 " Q0045 Java中是怎样捕获异常的? "try { //statement01 } catch(Exception e) { //statement02 } finally { ...

    Java面试题总览

    JAVA面试题总览, 包含如下: 1. JAVA中的几种基本数据类型是什么,各自占用多少字节。...5. 讲讲类的实例化顺序,比如父类静态数据,构造函数,字段,子类静态数据,构造函数,字 段,当new的时候,他们的执行顺序。

    深入理解Java内存模型.程晓明(带书签文字版).pdf

    为什么 final 引用不能从构造函数内“逸出” 63 final 语义在处理器中的实现 65 JSR-133 为什么要增强 final 的语义 65 总结 66 处理器内存模型 66 JMM,处理器内存模型与顺序一致性内存模型之间的关系 68 JMM...

    Java版水果管理系统源码-c-plus-Interview:c-plus-面试

    构造函数可以使用virtual修饰吗(头条) C++ 拷贝构造函数 如何禁用 什么时候要重载拷贝构造函数?(聊了以后发现他的意思是重写overriding) 构造函数的种类 构造函数的常用场景 构造函数和=运算符的区别 拷贝构造...

    深入理解java内存模型

    为什么final引用不能从构造函数内“逸出” final语义在处理器中的实现 JSR-133为什么要增强final的语义 总结 处理器内存模型 JMM,处理器内存模型与顺序一致性内存模型之间的关系 JMM的设计 JMM的内存可见性保证 JSR...

    c++小型企业工资管理系统

    c++小型企业工资管理系统

    java 面试题 总结

    不能有抽象构造函数或抽象静态方法。Abstract 类的子类为它们父类中的所有抽象方法提供实现,否则它们也是抽象类为。取而代之,在子类中实现该方法。知道其行为的其它类可以在类中实现这些方法。 接口(interface)...

    java自学之道

    4.4 构造函数被调用后的详细执行过程 5、包 5.1 创建包 5.2 创建可复用类的步骤简要说明 5.3 包的导入 5.4 包的可见性 接口 6.1 接口的概念 6.2 接口的声明 6.3 接口的实现 四、IO流及异常处理 1、流和文件 ...

    AIC的Java课程1-6章

     弄清构造函数和终结方法在继承层次结构中的调用顺序,强调子类必须调用超类的构造函数分配空间和初始化超类数据。  掌握方法重写(override)的基本要求。  理解和使用关键字final。  理解包的...

    javacore:java核心 运算符,控制语句,函数,异常,集合,线程,数组,IO流,网路编程,设计模式,java8,面试相关

    Java基础 java控制流程语句 数据交换 左(右)移 加密 java控制流程语句 switch语句 季节判断 while循环 1+...+100 do while循环 ...jvm类加载顺序决定代码执行顺序 super关键字 方法重写 instanceof关键字 fi

    Java初始化顺序

    System.out.println(Sample默认构造函数被调用); } } class Test{ static Sample sam=new Sample(静态成员sam初始化); Sample sam1=new Sample(sam1成员初始化); static{ System.out.println(static块执行);...

    一些面试中出现率比较高的题

    2016,一些面试中出现率比较高的题,(来自蘑菇天堂) 基础: String类能被继承吗、为什么 ...类的实例化顺序、比如父类静态数据、构造函数、字段、子类静态数据、构造函数、字段、他们的执行顺序。。。。

Global site tag (gtag.js) - Google Analytics