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内部类及类加载顺序的主要内容,如果未能解决你的问题,请参考以下文章

java类及实例初始化顺序

java 面向对象总结

Java面向对象学习目录

14. java面向对象 - 基础

访问修饰符与可选修饰符static的使用

13.面向对象一