package com.heima.test;
public class Demo7 {
/*
*
*/
public static void main(String[] args) {
new HelloB();
}
}
class HelloA {
public HelloA() {
System.out.println("HelloA");//构造方法 最后才会执行构造方法
}
{
System.out.println("I'm A class");//构造代码块 PS:创建对象,需要初始化类,会先执行类中的构造代码块
}
static {
System.out.println("static A");//静态代码块 PS不管他在哪个位置,都是一加载字节码文件,进栈内存中,就会执行静态代码块
}
}
class HelloB extends HelloA {
public HelloB() {
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
HelloA
I'm B class
HelloB
以上就是运行结果,运行的时候是先走主方法,主方法里有创建B对象,而此时B继承了A,所以在加载B的字节码文件之前,要去加载他的父类,也就是A的字节码文件
A里有静态代码块,所以先输出 1.static A
然后加载字节码文件B,看到B也有字节码文件,那么就输出 2.static B
A和B的字节码文件都加载完了,那么需要初始化了,要给B初始化,就要先给他的父类,也就是A进行初始化,就输出A里面的构造代码块 3.I'm A class
然后运行4.构造方法 里的 HelloA
接下来才是给子类B进行初始化,依次就是:5.I'm B class 6.HelloB
PS:你记住,静态很早就执行,是加载字节码文件进栈,就执行了的.而且先后顺序必须是先父类,再子类
构造方法创建对象的顺序也是一样,必须是父类初始化完成,才会对子类进行初始化
因为,如果父类都没有加载,继承他的子类,怎么只能能不能使用父类的属性和方法呢
放在Eclipse里面手麻的,希望你能够理解
*/ |