Java类初始化过程

详细过程,看如下代码:

package org.wsr.demo;

class A {
	int c = 30;
	int d = 40;
	int g;
	int h = 60;
	static int i = 10000;	//(1)
	static {		//(2)
		i = 200;
		System.out.println(i);
	}
	{
		System.out.println("A --> gou zao kuai!!");
	}
	public A(){
		this.fun();
	}
	public void fun(){}
}

class B extends A{
	int a = 10;
	int b = 20;
	int e;
	int f = 50;
	static int j = 10000;	//(3)
	static {		//(4)
		j = 100;
		System.out.println(j);
	}
	{
		System.out.println("B --> gou zao kuai!!" + "a ?-->" + a);
	}
	public B(int a){
		System.out.println("before-->" + this.a);
		this.a = a;
		System.out.println("after-->" + this.a);
	}
	
	public void fun(){
		System.out.println(a);
	}
}

public class Demo {
	public static void main(String [] args){
		//System.out.println(new A(2));
		new B(100);
	}
}

/*
运行结果:
200
100
A --> gou zao kuai!!
0	//因为此时执行的是A类,A类完成了显示初始化,但是,B类还没有开始执行,所以,所有的属性值都是默认值“0”。
B --> gou zao kuai!!a ?-->10//执行B类的构造方法,之前已经完成了显示初始化。
before-->10
after-->100
*/

/*
PS:
Java中对象的实例化过程:
总体顺序为:
【JVM加载类】-->【加载过程中通过clinit()方法完成:类(static)属性的显示初始化、静(static)态代码块】
-->【JVM完成加载工作,为实例变量(即类的属性)分配初始化空间“0”值】
-->【根据继承关系自顶向下由Object开始】
-->【显示初始化】
-->【构造块】
-->【构造方法】
至此完成对象的初始化过程!!

1)JVM通过loadClass()方法,通过【包.类名称】加载*.class到内存中
2)JVM根据继承关系(先父后子自上而下),
通过clinit()方法,【初始化类属性(用static声明的)】,执行顺序为
	a)显示初始化;例如:static int i = 10000
	b)静态代码块;例如 static{}
3)clinit()方法执行完成后,JVM完成类的加载工作,
然后,JVM分配对象所需要的所有的内存空间(属性),并初始化初值为“0”值;
4)JVM按照继承关系,从顶层父类Object开始,
自顶向下【显示初始化】 --> 【构造块】 --> 【调用构造方法】
例如:
A类:
	int c = 30; int d = 40; int h = 60; --> {} --> public A(){}
接着是B类:
	int a = 10; int b = 20; int g = 50; --> {} --> public B(){}
*/

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值