下面代码运行结果为——
点击查看代码
package com.itcq.d5;
public class App {
public static void main(String[] args) {
new B();
}
}
class A {
static{
System.out.println("Static-A执行了~~~");
}
{
System.out.println("代码块-A执行了~~~");
}
public A(){
System.out.println("构造方法-A执行了~~~");
}
}
class B extends A {
static C c=new C();
static{
System.out.println("Static-B执行了~~~");
}
{
System.out.println("代码块-B执行了~~~");
}
public B(){
System.out.println("构造方法-B执行了~~~");
}
}
class C {
public C(){
System.out.println("构造方法-C执行了~~~");
}
}
运行结果:
Static-A执行了~~~
构造方法-C执行了~~~
Static-B执行了~~~
代码块-A执行了~~~
构造方法-A执行了~~~
代码块-B执行了~~~
构造方法-B执行了~~~
考察的知识点:
- 类的初始化顺序:
- 静态成员变量:首先初始化
- 静态代码块:其次初始化
- 实例成员变量:在构造器中初始化
- 实例代码块:在构造器中,实例成员变量初始化之后执行
- 构造器:最后执行
- 继承:
- 子类会继承父类的静态成员和实例成员
- 子类在初始化时,会先初始化父类的静态成员和实例成员,然后再初始化自己的成员
首先,JVM会加载App类,并初始化其静态成员变量。由于App类没有静态成员变量,所以这一步没有任何输出。
接着,JVM会加载B类,并初始化其静态成员变量。B类有一个静态成员变量c,它是一个C类的实例。因此,JVM会先初始化C类,然后初始化c。C类的初始化过程如下:
执行C类的静态代码块,输出Static-C执行了~。~。
由于C类没有非静态成员变量和代码块,所以这一步没有任何输出。
执行C类的构造方法,输出构造方法-C执行了
然后,JVM会初始化B类的其他成员变量。由于B类没有非静态成员变量,所以这一步没有任何输出。
接着,JVM会执行B类的构造方法。B类的构造方法会执行以下操作:
调用父类的构造方法,即A类的构造方法。
执行B类自己的代码块。
执行B类自己的构造函数体。
由于A类是B类的父类,所以JVM会先初始化A类。A类的初始化过程如下:
执行A类的静态代码块,输出Static-A执行了~。~。
由于A类没有非静态成员变量,所以这一步没有任何输出。
执行A类的构造方法,输出构造方法-A执行了
最后,JVM会执行B类的代码块,输出代码块-B执行了~~~。
总结:
Java类的初始化顺序如下:
静态成员变量
非静态成员变量
代码块
构造方法
对于继承关系,子类的初始化会在父类的初始化之后进行
标签:初始化,顺序,Java,构造方法,静态,成员,执行,代码,加载 From: https://www.cnblogs.com/itcq1024/p/18023238