标签:void 创建 and static 加载顺序 决定 java内部类 xtend 子类
类加载的统一的原则-----变量定义的先后顺序决定初始化顺序,而在不同变量之间,又存在着某些规则(先静态对象,再非静态对象)
静态代码块属于类,且在类加载时只执行一次,即使后面有类加载的条件也不会再次执行;
类加载条件:
1 创建类的实例
2 访问某个类或接口的静态变量,或者对该静态变量赋值
3 调用类的静态方法
4 反射(如Class.forName(""))
5 初始化一个类的子类,它的父类也会被初始化
6 java虚拟机启动时被表明为启动类的类(java test)
7 jdk1.7开始提供的动态语言 支持 :
java.lang.invoke.MethodHandle实例的解析结果REF——getSatic, REF_putStatic,REF_invokeStatic 句柄对应的类没有初始化,则初始化
示例:
package demo; import demo.Enclosingone; import demo.Enclosingone.InsideOne; class Enclosingone { static int a=100; static { System.out.println("Enclosingone.enclosing_method():父类静态代码块"); } public Enclosingone() { { System.out.println("Enclosingone.Enclosingone():父类构造函数"); } } { System.out.println("Enclosingone.enclosing_method():父类构造代码块"); } public void name() { { System.out.println("Enclosingone.name():父类普通代码块"); } } public class InsideOne {} } class Enclosingone2 extends Enclosingone{ static { System.out.println("Enclosingone2.enclosing_method():子类静态代码块"); } public Enclosingone2() { { System.out.println("Enclosingone2.Enclosingone2():子类构造函数"); } } { System.out.println("Enclosingone2.enclosing_method():子类构造代码块"); } } public class demo { public static void main(String[] args) { new Enclosingone2().name(); } }
输出结果:
Enclosingone.enclosing_method():父类静态代码块
Enclosingone2.enclosing_method():子类静态代码块
Enclosingone.enclosing_method():父类构造代码块
Enclosingone.Enclosingone():父类构造函数
Enclosingone2.enclosing_method():子类构造代码块
Enclosingone2.Enclosingone2():子类构造函数
Enclosingone.name():父类普通代码块
标签:void 创建 and static 加载顺序 决定 java内部类 xtend 子类
原文地址:https://www.cnblogs.com/yunianzeng/p/12180278.html