java类中代码的执行顺序
先看一下代码
package test;
public class test1 {
static class A{
C c = new C();
public A(){
System.out.println("A类的构造方法");
}
static void eat(){
System.out.println("A类的静态方法");
}
static{
System.out.println("A类的静态代码块");
}
void see(){
System.out.println("A类的普通方法");
}
}
static class B extends A{
public B(){
System.out.println("B类的构造方法");
}
static void eat(){
System.out.println("B类的静态方法");
}
static{
System.out.println("B类的静态代码块");
}
void see(){
System.out.println("B类的普通方法");
}
}
static class C{
public C(){
System.out.println("C类的构造方法");
}
static void eat(){
System.out.println("C类的静态方法");
}
void see(){
System.out.println("C类的普通方法");
}
static{
System.out.println("C类的静态代码块");
}
}
public static void main(String srgs[]){
B b = new B();
System.out.println("----------------------------------------------");
System.out.println("静态类不一定有静态方法,有静态方法的一定是静态类");
System.out.println("----------------------------------------------");
C.eat();
System.out.println("----------------------------------------------");
System.out.println("静态方法可以通过 “类名.方法名”的方式调用");
System.out.println("----------------------------------------------");
C c = new C();
c.see();
}
}
执行结果如下
执行流程
我们来对执行结果分析一下
我们来看main函数中的语句
B b = new B();
首先,初始化B类,初始化B类前,会先初始化A类,之后再初始化B类,而静态代码块是在类初始化时加载的。
所以初始化B类的时候:也就是执行B b完成后,程序打印出:
A类的静态代码块
B类的静态代码块
接下来执行new B();
因为B继承了A类,所以要先初始化A类的属性类,即:
C c = new C();
就会对C类进行初始化、实例化的过程,执行结果如下:
C类的静态代码块
C类的构造方法
如果只是类的属性类的声明,如:
C c;
则不对C类进行初始化,更不会实例化
接着就开始执行A类的构造方法,程序输出结果:
A类的构造方法
父类完成后,开始对子类的属性初始化,以及属性结构方法的调用,最后完成子类的实例化。