一文然你对实例部类与静态内部类有更深的了解

Posted minghaij

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了一文然你对实例部类与静态内部类有更深的了解相关的知识,希望对你有一定的参考价值。

Java中一直对实例内部类和静态内部类特别混淆,对它能的实例化总是容易忘记,随着对java的不断学习,终于有了自己的理解,因此分享自己的心得:

对实例内部类与静态内部类的创建

先看代码

public class OuterClass 
    class Inner 
    

    static class Inner2 
    

    public static void main(String[] args) 
        OuterClass outerClass = new OuterClass();
        // 创建实例内部类
        Inner inner1 = outerClass.new Inner();
        // 创建静态内部类
        Inner2 inner2 = new OuterClass.Inner2();
    

分析:我们创建实例内部类时,必须要用到外部类具体的实例对象,就好像实例内部类依附在外部类的实例上。

在创建静态内部类时,可以直接使用外部类来创建静态内部类的对象,就好像是静态内部类依附在外部类上。

把上面代码编译后后生成三个字节码文件,分别为外部类,实例内部类,和静态内部类的字节码文件,如下:

技术图片

javap反编译后可可知,在实例内部类中有外部类实例的引用,而在静态内部类没有外部类实例的引用。

技术图片

因此可以证明实例内部类内有外部类对象的引用。

内部类调用外部类的属性

再来看看静态内部类与实例内部类访问外部类的的属性,

public class OuterClass 
    static int a = 0;
    int b = 0;
    class Inner 
        int a1 = a;
        int b1 = b;
    

    static class Inner2 
        int a2 = a;
        int b2 = b;//Non-static field 'b' cannot be referenced from a static context
    

在静态实例内部类中可以访问外部类的实例变量和静态变量,而在静态内部类中可以访问外部类的静态变量,但不能访问实例变量。

PS:通过不断的学习,感觉内部类与外部类的方法有种若隐若现的联系,如果把上面代码中的,如果建立这样一种对应关系,实例内部类——>>>实例方法,静态内部类——>>>静态方法(仅仅为了理解),是不是很容易就能理解内部类调用外部类实例变量与静态变量的过程。

以上是关于一文然你对实例部类与静态内部类有更深的了解的主要内容,如果未能解决你的问题,请参考以下文章

内部类

内部类和静态内部类有什么区别?

静态非静态内部类匿名内部类局部内部类

java 中静态内部类字段啥时候初始化?是在外部类加载的时候就初始化吗?

四种内部类

Java面试题|静态内部类和非静态内部类有什么区别?