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;
import demo.Enclosingone.InsideOne2;
class Enclosingone
{
static final 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 static class InsideOne {//静态内部类
static{
System.out.println("Enclosingone.InsideOne.enclosing_method():静态内部类");
}
}
public class InsideOne2{//内部类
//静态内部类的加载不需要依附外部类,在使用时才加载。不过在加载静态内部类的过程中也会加载外部类
//非静态内部类不能使用静态代码块(一般的非静态类可以有静态代码块)
//因为非静态内部类相当于外部的非静态成员变量,如果外部类要调用非静态成员变量,则需要创建对象,
//进行调用;而非静态内部类中有static代码块,那么在外部类加载的时候就会加载,不需要考虑外部状态
//则与外部类的创建相驳论,所以静态内部类不能创建静态代码块
static final int a=200;//就近原则匹配a的值
//static final int a=6;
public InsideOne2() {
System.out.println(a);
}
}
@Override
protected void finalize() throws Throwable {
System.out.println("最后一次a:"+a);
}
}
class Enclosingonechild extends Enclosingone{
static {
System.out.println("Enclosingonechild.enclosing_method():子类静态代码块");
}
public Enclosingonechild() {
{
System.out.println("Enclosingonechild.Enclosingonechild():子类构造函数");
}
}
{
System.out.println("Enclosingonechild.enclosing_method():子类构造代码块");
}
}
public class demo
{
public static void main(String[] args)
{
new InsideOne();//静态内部类直接声明使用//相当于外部类
System.out.println("-------------");
new Enclosingone().new InsideOne2();
System.out.println("--------------");
new Enclosingonechild().name();
System.out.println("--------------");
System.gc();//调用gc回收,触发finalize方法;
}
}
输出结果:
Enclosingone.InsideOne.enclosing_method():静态内部类
-------------
Enclosingone.enclosing_method():父类静态代码块
Enclosingone.enclosing_method():父类构造代码块
Enclosingone.Enclosingone():父类构造函数
200
--------------
Enclosingonechild.enclosing_method():子类静态代码块
Enclosingone.enclosing_method():父类构造代码块
Enclosingone.Enclosingone():父类构造函数
Enclosingonechild.enclosing_method():子类构造代码块
Enclosingonechild.Enclosingonechild():子类构造函数
Enclosingone.name():父类普通代码块
--------------
最后一次a:100
最后一次a:100