zoukankan      html  css  js  c++  java
  • 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

  • 相关阅读:
    nodejs express hi-cms
    写让别人能读懂的代码
    统计学和数据挖掘的关系
    假设检验
    相关性探索
    领域驱动设计分层类图
    未能加载文件或程序集 Ninject.Web.Common, Version=3.2.0.0
    论文阅读笔记
    《Computational Statistics with Matlab》硬译2
    C#抽象类和接口
  • 原文地址:https://www.cnblogs.com/yunianzeng/p/12180278.html
Copyright © 2011-2022 走看看