Java中类的加载过程
JAVA中静态代码块、构造方法、Super()父类与子类之间执行顺序
属性、方法、构造方法和自由块都是类中的成员,在创建对象时,各成员的执行顺序如下。
(1)父类静态成员和静态初始化块,按在代码中出现的顺序依次执行。
(2)子类静态成员和静态初始化块,按在代码中出现的顺序依次执行。
(3)父类实例成员和实例初始化块,按在代码中出现的顺序依次执行。
(4)执行父类构造方法。
(5)子类实例成员和实例初始化块,按在代码中出现的顺序依次执行。
(6)执行子类构造方法。
1.父类、子类之间代码块与构造方法
public class HelloA {
static {
System.out.println("static A");
}
{System.out.println("I'm A class");}
public HelloA() {
System.out.println("HelloA");
}
public HelloA(String s) {
System.out.println(s + "HelloA");
}
public static void main(String[] args) {
new HelloB();
}
}
class HelloB extends HelloA {
public HelloB () {
//只能调用一个父类的构造方法
//super();
super("parent");
System.out.println("HelloB");
}
{System.out.println("I'm B class");}
static {
System.out.println("static B");
}
}
执行结果:
static A
static B
I’m A class
parentHelloA
I’m B class
HelloB
总结如下:
1、代码块于构造方法之前执行,静态于非静态之前;
2、在类第一次被调用时,加载该类,静态代码块只执行一次;
3、项目启动时,只加载需要加载的类(比如xml中显示配置的bean,或者web.xml中的listener等),并不会将所有的类都加载(这是很可怕的事情);
4、静态代码块只能调用静态变量;静态方法只能调用静态变量;
5、非静态代码块或非静态方法可以调用任何(静态+非静态)变量。
6、非静态代码块在实例化对象时,于构造方法之前执行。
2.父类、子类与super()
public class People {
String name;
public People() {
System.out.println(1);
}
public People(String name) {
System.out.println(2);
this.name = name;
}
}
class Child extends People {
People father;
public Child () {
//super()系统会默认添加的
System.out.println(4);
}
public Child (String name) {
//super()系统会默认添加的
System.out.println(3);
this.name = name;
father = new People(name + ":F");
}
public static void main(String[] args) {
new Child("mike");
}
}
故执行结果:132
另外一个难缠的实例
public class ExA {
private static ExA a = new ExA();
static {
System.out.println("父类--静态代码块");
}
public ExA() {
System.out.println("父类--构造函数");
}
{
System.out.println("父类--非静态代码块");
}
public static void main(String[] args) {
new ExB();
}
}
class ExB extends ExA {
private static ExB b = new ExB();
static {
System.out.println("子类--静态代码块");
}
{
System.out.println("子类--非静态代码块");
}
public ExB() {
System.out.println("子类--构造函数");
}
}
result as follows:
- 父类--非静态代码块
- 父类--构造函数
- 父类--静态代码块
- 父类--非静态代码块
- 父类--构造函数
- 子类--非静态代码块
- 子类--构造函数
- 子类--静态代码块
- 父类--非静态代码块
- 父类--构造函数
- 子类--非静态代码块
- 子类--构造函数
参考:互联网