目录
问题:
刷面经,写博客输出,加深印象,特此记录。
与这个内容相关的 内部静态类和非内部静态类的区别
原理:
(1) 静态内容的加载
- 静态内容(包括静态成员变量和静态代码块)是类级别的,与实例无关。
- 静态内容的加载发生在类被 JVM 加载时,且只加载一次。
- 父类的静态内容会先于子类的静态内容加载。
(2) 实例内容的加载
- 实例内容(包括实例成员变量、实例代码块和构造方法)是对象级别的,每次创建实例时都会执行。
- 父类的实例内容会先于子类的实例内容加载。
(3) 总体加载顺序
当 new
一个子类对象时,加载顺序如下:
- 父类的静态内容 :父类的静态成员变量和静态代码块按声明顺序加载。
- 子类的静态内容 :子类的静态成员变量和静态代码块按声明顺序加载。
- 父类的实例内容 :父类的实例成员变量、实例代码块和构造方法按声明顺序加载。
- 子类的实例内容 :子类的实例成员变量、实例代码块和构造方法按声明顺序加载。
实践:
public class Parents {
static {
System.out.println("static 父类");
}
{
System.out.println("父类 实例");
}
public Parents(){
System.out.println("父类 构造");
}
}
public class Child extends Parents{
static {
System.out.println("static 子类");
}
{
System.out.println("子类 实例");
}
public Child(){
System.out.println("子类 构造");
}
}
public class Test {
public static void main(String[] args) {
Child child = new Child();
}
}