美文网首页
内部类和静态内部类的加载

内部类和静态内部类的加载

作者: HWilliamgo | 来源:发表于2018-05-21 11:49 被阅读10次
public class Main {
    static {
        System.out.println("加载外部类");

    }
    public Main() {
        System.out.println("外部类构造方法");
    }

    public void newInnerClassInstance() {
        InnerClass innerClass = new InnerClass();
    }
    public void loadStaticInnerClass(){
        StaticInnerClass.i=100;
    }

    public static void main(String[] args) throws Throwable {
        Main main = new Main();
        main.newInnerClassInstance();
        main.loadStaticInnerClass();
    }
    private class InnerClass {
        {
            System.out.println("加载内部类");
        }
    }
    static class StaticInnerClass {
        static int i=0;
        static {
            System.out.println("加载静态内部类");
        }
    }
}
//print:
/**
 * 加载外部类
 * 外部类构造方法
 * 加载内部类
 * 加载静态内部类
 */

解释打印的原因:
加载外部类: 当虚拟机启动时,我们指定的main方法的main类,由虚拟机来加载,因此肯定会初始化这个类。
外部类构造方法:由语句Main main=new Main();引起
加载内部类:由语句main.newInnerClassInstance()#InnerClass innerClass = new InnerClass();引起,由于内部类没有static块和纯static变量(常量的调用无法引起类加载),所以只能通过new或者反射来引起初始化,这里用new语句创建对象来初始化内部类,并用普通实例代码块来表示初始化了类(无法使用static块)。
加载静态内部类:和普通类加载就没区别,本来静态内部类就和外部类没有太大关联,和普通的类十分接近。由于加载内部类已经用了new语句来初始化类了,这里就采用调用了静态字段的方法来使类初始化。


此外,为什么非静态内部类不能有static字段、static方法、static块?

  • 首先,内部类对象必须天然地持有唯一的对外部类对象的引用,一个外部类对象可以有许多内部类对象的引用,但是一个内部类有且必须有唯一一个对外部类对象的引用。
  • 暂时没有找到比较靠谱的解释,或许从虚拟机的角度来看会比较容易理解,待定...

相关文章

  • Java学习——内部类

    内部类 一,成员内部类(包括静态内部类和非静态内部类) 非静态内部类可以直接访问外部类的成员,反之则不行 非静态内...

  • Java 内部类

    内部类包括成员内部类、方法内部类、*静态内部类、匿名内部类*。 内部类的作用 由于内部类的实现和外部类没有关系,内...

  • 一起巩固Java基础知识(2)

    序言 本文内容包括 成员内部类、静态内部类的介绍和创建 类中成员加载顺序 成员内部类、静态内部类的介绍和创建 成员...

  • 类的编译期与运行期

    非静态内部类 非静态内部类到底可以有静态属性吗? static成员变量,或者static final常量 非静态内...

  • Java 内部类、静态内部类、方法内部类(未完待续)

    内部类 什么是内部类?内部类其实就是在一个类中创建的类。内部类有四种: 成员内部类 静态内部类 局部内部类 匿名内...

  • 单例模式

    关于内部类和静态内部类何时被加载:加载一个类时,其内部类是否同时被加载?静态内部类单例模式 结论:最好的单例模式是...

  • java 内部类

    一般有四种内部类的使用方式: 嵌套的内部类 方法内的内部类 静态内部类 匿名内部类 什么时候用内部类: 有时候明显...

  • 2019-02-01——内部类

    1.静态内部类和成员内部类的用法?2.内部类的修饰符有什么用? 一.关于内部类的分类内部类广义上可分为四种:成员内...

  • 内部类

    成员内部类 局部内部类(定义在方法内和定义在作用域内的类) 匿名内部类

  • Java 内部类

    1. 内部类 概念:在一个类的内部再定义一个完整的类内部类分为 4 类:成员内部类、静态内部类、局部内部类、匿名内...

网友评论

      本文标题:内部类和静态内部类的加载

      本文链接:https://www.haomeiwen.com/subject/zkdfjftx.html