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

  • 相关阅读:
    129 01 Android 零基础入门 02 Java面向对象 06 Java单例模式 03 饿汉模式 VS 懒汉模式 02 懒汉式的代码实现
    128 01 Android 零基础入门 02 Java面向对象 06 Java单例模式 03 饿汉模式 VS 懒汉模式 01 饿汉式的代码实现
    127 01 Android 零基础入门 02 Java面向对象 06 Java单例模式 02 单例模式概述 01 单例模式的定义和作用
    126 01 Android 零基础入门 02 Java面向对象 06 Java单例模式 01 设计模式概述 01 设计模式简介
    125 01 Android 零基础入门 02 Java面向对象 05 Java继承(下)05 Java继承(下)总结 01 Java继承(下)知识点总结
    leetcode-----121. 买卖股票的最佳时机
    leetcode-----104. 二叉树的最大深度
    Json串的字段如果和类中字段不一致,如何映射、转换?
    Mybatis-Plus的Service方法使用 之 泛型方法default <V> List<V> listObjs(Function<? super Object, V> mapper)
    模糊查询
  • 原文地址:https://www.cnblogs.com/yunianzeng/p/12180278.html
Copyright © 2011-2022 走看看