详细过程,看如下代码:
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(){}
*/