关于Java中的成员初始化顺序--静态代码、实例变量、构造函数(转)_JAVA_编程开发_程序员俱乐部

中国优秀的程序员网站程序员频道CXYCLUB技术地图
热搜:
更多>>
 
您所在的位置: 程序员俱乐部 > 编程开发 > JAVA > 关于Java中的成员初始化顺序--静态代码、实例变量、构造函数(转)

关于Java中的成员初始化顺序--静态代码、实例变量、构造函数(转)

 2015/3/2 22:11:22  JokerLinisty  程序员俱乐部  我要评论(0)
  • 摘要:通过new新建一个对象时,涉及到类的装载及对象的实例化两方面。1、类的装载1)类装载时,先装载父类,然后到子类。2)装载父类后,执行静态动作(初始化静态变量或执行静态代码程序(两者根据代码顺序执行))。3)装载子类后,执行静态动作(初始化静态变量或执行静态代码程序(两者根据代码顺序执行))。2、对象的实例化1)实例化子类时,会(需要)先实例化父类。2)实例化父类时,先完成实例变量的初始化,然后调用构造函数完成实例化工作,子类同理。3、概括来说,初始化顺序如下:父类的静态代码-->
  • 标签:构造函数 函数 构造 Java 代码 初始化顺序 实例 实例变量

通过new新建一个对象时,涉及到类的装载及对象的实例化两方面。

1、类的装载

??? 1)类装载时,先装载父类,然后到子类。

??? 2)装载父类后,执行静态动作(初始化静态变量或执行静态代码程序(两者根据代码顺序执行))。

??? 3)装载子类后,执行静态动作(初始化静态变量或执行静态代码程序(两者根据代码顺序执行))。

?

2、对象的实例化

??? 1)实例化子类时,会(需要)先实例化父类。

??? 2)实例化父类时,先完成实例变量的初始化,然后调用构造函数完成实例化工作,子类同理。

?

3、概括来说,初始化顺序如下:

??? 父类的静态代码?-->子类的静态代码-->父类的非静态实例变量(或代码块)-->父类的构造方法-->子类的非静态实例变量(或代码块)-->子类的构造方法。

?

4、测试实例

class="java">abstract class base {
	public int age = getNumber(100);
	static {
		System.out.println("base static block");
	}

	{
		System.out.println("base nonstatic block");
	}
	
	static int sage = getNumber(50);

	base() {
		System.out.println(age);
		System.out.println("base start");
		draw();// 会调用子类覆盖后的方法,这儿是0!????		
		System.out.println("base end");
	}

	static int getNumber(int base) {
		System.out.println("base.getNumber int" + base);
		return base;
	}

	public void draw() {
		System.out.println("base.draw");
	}
}

public class initializeOrder extends base {
	public int age = getNumber(1001);
	private int _radius = getNumber(10);
	static int sage = getNumber(250);
	static {
		System.out.println("subclass static block");
	}
	{
		System.out.println("subclass nonstatic block");
	}

	initializeOrder(int radius) {
		_radius = radius;
		System.out.println(age);
		draw();// 这儿是1000
		System.out.println("initializeOrder initialized");
	}

	public void draw() {
		System.out.println("initializeOrder.draw " + _radius);
	}

	public static void main(String[] args) { 
		new initializeOrder(1000);
	}
}

??? 执行输出如下:

??? base static block
??? base.getNumber int50
??? base.getNumber int250
??? subclass static block
??? base.getNumber int100
??? base nonstatic block
??? 100
??? base start
??? initializeOrder.draw 0
??? base end
??? base.getNumber int1001
??? base.getNumber int10
??? subclass nonstatic block
??? 1001
??? initializeOrder.draw 1000
??? initializeOrder initialized

发表评论
用户名: 匿名