java内部类及类加载顺序
Posted ZJfor
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了java内部类及类加载顺序相关的知识,希望对你有一定的参考价值。
类加载的统一的原则-----变量定义的先后顺序决定初始化顺序,而在不同变量之间,又存在着某些规则(先静态对象,再非静态对象)
静态代码块属于类,且在类加载时只执行一次,即使后面有类加载的条件也不会再次执行;
类加载条件:
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():父类普通代码块
以上是关于java内部类及类加载顺序的主要内容,如果未能解决你的问题,请参考以下文章