朝花夕拾——你了解构造器初始化顺序吗?

在java程序中,创建java对象,其初始化顺序总是先调用最顶层父类的初始化操作,包括初始化块和构造器,然后再向下调用其他类的初始化操作。

类和实例的初始化顺序可以参考

朝花夕拾——看清java实例变量的初始化内幕

朝花夕拾——再看java类变量的初始化内幕

先看看代码例子

package java_zhaohuaxishi;

class GrandFather{

	{
		System.out.println("GrandFather--非静态代码块");
	}

	public GrandFather(){
		System.out.println("GrandFather--无参构造器");
	}

	public GrandFather(String name){
		this();
		System.out.println("GrandFather--有参构造器"+"名字:"+name);
	}
}

class Father extends GrandFather{

	{
		System.out.println("Father--非静态代码块");
	}

	public Father(){
		System.out.println("Father--无参构造器");
	}

	public Father(String name){
		super(name);
		System.out.println("Father--有参构造器"+"名字:"+name);
	}

}

class Son extends Father{

	{
		System.out.println("Son--非静态代码块");
	}

	public Son(){
		super("向上");
		System.out.println("Son--无惨构造器");
	}

	public Son(String name) {
		this();
		System.out.println("Son--有参构造器"+"名字:"+name);
	}

}

public class ConstructorTest {

	/**
	 * @param args
	 */
	public static void main(String[] args) {
		// TODO Auto-generated method stub
		new Son("小明");

	}

}

程序运行结果如下

GrandFather--非静态代码块
GrandFather--无参构造器
GrandFather--有参构造器名字:向上
Father--非静态代码块
Father--有参构造器名字:向上
Son--非静态代码块
Son--无惨构造器
Son--有参构造器名字:小明

从上述结果看到,构造器的初始化过程实际上会根据具体调用this或者super的方法来进行,是一个递归操作。

构造器使用super显式调用的是父类的构造器,再根据具体的参数执行父类的具体构造器;而this也是显示调用本类的构造器,也会根据参数来执行。

然而,当子类构造器中没有显示使用super和this的话,则会在子类构造器执行之前隐式调用父类无参构造器。

我把上述代码中

	public Son(){
		//super("向上");
		System.out.println("Son--无惨构造器");
	}

super带参调用注释掉,则输出结果如下:

GrandFather--非静态代码块
GrandFather--无参构造器
Father--非静态代码块
Father--无参构造器
Son--非静态代码块
Son--无惨构造器
Son--有参构造器名字:小明

值得注意的是:super和this的调用必须作为构造器第一行代码,且最多只能选其中一种来进行调用。

版权声明:本文为博主原创文章,未经博主允许不得转载。

时间: 2024-08-06 13:22:36

朝花夕拾——你了解构造器初始化顺序吗?的相关文章

Java类的初始化顺序 (静态变量、静态初始化块、变量、初始化块、构造器)(转)

大家在去参加面试的时候,经常会遇到这样的考题:给你两个类的代码,它们之间是继承的关系,每个类里只有构造器方法和一些变量,构造器里可能还有一段代码对变量值进行了某种运算,另外还有一些将变量值输出到控制台的代码,然后让我们判断输出的结果.这实际上是在考查我们对于继承情况下类的初始化顺序的了解. 我们大家都知道,对于静态变量.静态初始化块.变量.初始化块.构造器,它们的初始化顺序以此是(静态变量.静态初始化块)>(变量.初始化块)>构造器.我们也可以通过下面的测试代码来验证这一点: Java代码 p

Java初始化顺序(静态变量、静态初始化块、实例变量、实例初始化块、构造方法)

1.执行顺序 1.1.一个类中的初始化顺序 (静态变量.静态初始化块)=>(变量.初始化块.构造器). 1.2.两个具有继承关系类的初始化顺序 父类的(静态变量.静态初始化块)=> 子类的(静态变量.静态初始化块)=> 父类的(变量.初始化块.构造器)=> 子类的(变量.初始化块.构造器). 示例如下:(结果见注释) 1 class A { 2 public A() { 3 System.out.println("Constructor A."); 4 } 5

java类的初始化顺序

java类的初始化顺序 (2008-10-21 13:30:15) 转载▼ 标签: java 初始化 继承初始化 it 分类: Java 对于静态变量.静态初始化块.变量.初始化块.构造器,它们的初始化顺序依次是(静态变量.静态初始化块)>(变量.初始化块)>构造器.我们也可以通过下面的测试代码来验证这一点: public class InitialOrderTest { // 静态变量 public static String staticField = "静态变量";

Java初始化顺序

1.在类的内部,变量的定义的先后顺序决定了初始化顺序,即使变量定义散布于方法定义间,他们仍旧会在任何方法(包括构造器)被调用之前得到初始化 2.静态数据的初始化 class Bowl{ Bowl(int marker){ print("Bowl("+marker+")"); } void f1(int marker){ print("f1("+marker+")"); } class Table{ static Bowl bo

Java变量方法初始化顺序

面试的时候,经常会遇到这样的考题:给你两个类的代码,它们之间是继承的关系,每个类里只有构造器方法和一些变量, 构造器里可能还有一段代码对变量值进行了某种运算,另外还有一些将变量值输出到控制台的代码,然后让我们判断输出的结果.这实际上是在考查我们对于继承情况下类的初始化顺序的了解. 我们大家都知道,对于静态变量.静态初始化块.变量.初始化块.构造器,它们的初始化顺序以此是 (静态变量.静态初始化块)>(变量.初始化块)>构造器. 我们也可以通过下面的测试代码来验证这一点: 父类--静态变量 父类

Android(java)学习笔记136:Java类初始化顺序

Java类中初试化的顺序: 由此得出Java普通类初始化顺序结论: 静态变量 静态初始化块 变量 初始化块 构造器 由此得出Java继承类初始化顺序结论: 1 .继承体系的所有静态成员初始化(先父类,后子类) 2 .父类初始化完成(普通成员的初始化-->构造函数的调用) 3 .子类初始化(普通成员-->构造函数) Java初始化顺序如图: 代码演示: class Sample { Sample(String s) { System.out.println(s); } Sample() { Sy

JAVA的初始化顺序

这里主要是介绍JAVA的类的初始化顺序,比较基础:主要是以例子演示为主: 例子一: 1 package com.cnblog.GDUTtiantian; 2 3 /** 4 * 5 * @author GDUTtiantian 6 * @date 2014-5-19 下午1:30:10 7 * JAVA类的初始化顺序 8 */ 9 public class Tiantian { 10 11 { 12 System.out.println("初始化:代码块1"); 13 } 14 15

Java中类的初始化顺序

对于静态变量.静态初始化块.变量.初始化块.构造器,它们的初始化顺序依次是(静态变量.静态初始化块)>(变量.初始化块)>构造器.我们也可以通过下面的测试代码来验证这一点: public class InitialOrderTest {// 静态变量public static String staticField = "静态变量";// 变量public String field = "变量";// 静态初始化块static {System.out.pr

转!!关于java类初始化顺序

原文地址:http://www.cnblogs.com/luckygxf/p/4796955.html 1.没有继承 静态变量->静态初始化块->变量->变量初始化块->构造方法 2.有继承的情况 父类静态变量->父类静态初始化块->子类静态变量->子类静态变量初始化块->父类变量初始化->父类变量初始化块->父类构造方法->子类变量初始化->子类变量初始化块->子类构造方法 --------------------------