• 一文带你快速了解【内部类】


    1. 什么是内部类?

    在一个类 A 中,又定义了一个类 B ,此时这个类 B 就是内部类,而类 A 则是外部类!内部类也是一种封装得表现

    public class A{
    	class B{
    	
    	}
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5

    我们看上面代码,此时 A 就是外部类,B 就是内部类

    • 内部类和外部类共用同一个java源文件,但是经过编译之后,内部类会形成单独的字节码文件
    • 定义在class 类名{}花括号外部的,即使是在一个文件里,都不能称为内部类

    2. 内部类的分类

    内部类又分为成员内部类局部内部类 下面我们来一一介绍下

    2.1 成员内部类

    2.1.1 静态内部类

    我们先来看是如何定义的

    class OuterClass{
    
    	static class InnerClass{
    
    	}
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6

    此时的 InnerClass 就是静态内部类,因为被 static 修饰


    既然是一个类,那么应该如何 来实例化一个静态内部类呢?

    public class Test{
    	public static void main(String[] args){
    		OuterClass.InnerClass innerClass = new OuterClass.InnerClass();
    	}
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5

    那么在静态内部类种,如何访问自己的成员变量和外部类的成员变量呢?
    在这里插入图片描述
    从图种,我们可以直接看出,当访问外部类 data1 和 data2 的时候,编译报错了,这是为什么呢? 因为 data1 和 data2 是属于外部类的,不是静态的,而所有静态的都不依赖于对象,如果要访问,必须得用对象得引用才能够访问到。


    我们再来想下,如何在外部类中访问内部类的成员变量和自己的成员变量?
    在这里插入图片描述
    从上图种可以看出,要想访问 data4 和 data5 ,就必须创建对象,用对象的引用才能访问,data5 是静态的,可以直接通过类名访问!


    总结:

    • 在静态内部类当中,不能直接访问外部类当中的非静态成员,如果想访问,必须实例外部类,然后通过对象的引用来访问
    • 创建静态内部类对象时,不需要先创建外部类对象

    2.1.2 非静态内部类

    所谓非静态内部类,就是未被static修饰的成员内部类。

    class OuterClass{
    
    	 class InnerClass{
    
    	}
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6

    那么我们如何来实例非静态内部类呢?

    public class Test {
        OuterClass outerClass = new OuterClass();
        OuterClass.InnerClass innerClass = outerClass.new InnerClass();
    }
    
    • 1
    • 2
    • 3
    • 4

    可以看出我们实例内部类之前,需要得到外部类的对象,才能够创建实例内部类


    那么在非静态内部类中,如何访问自己的成员变量和外部类的成员变量呢?
    在这里插入图片描述
    可以看出外部类中的任何成员都可以在实例内部类方法中直接访问


    在外部类中,又如何访问外部类成员变量和内部类成员变量呢?
    在这里插入图片描述
    可以看出来,需要先创建 内部类对象,通过引用才能访问 data4 和 data5. 而通过类名就可以访问 data6.


    我们再来思考一个问题,当 外部类和内部类 出现同名变量时,应该是访问哪个,答案肯定是就近原则!
    在这里插入图片描述
    在非静态内部类中,包含了两个this,一个是外部类的 this,一个是非静态内部类的 this
    在实例内部类方法中访问同名的成员时,优先访问自己的,如果要访问外部类同名的成员,必须:外部类名称.this.同名成员 来访问


    2.1.3 局部内部类

    定义在外部类的方法中!

    在这里插入图片描述

    • 局部内部类只能在所定义的方法体内部使用
    • 不能被public、static等修饰符修饰
    • 编译器也有自己独立的字节码文件,命名格式:外部类名字$数字内部类名字.class
    • 几乎不会使用

    2.1.4 匿名内部类

    在这里插入图片描述
    那么上面就定义了一个匿名的内部类,那么如何调用呢?

    在这里插入图片描述
    通过直接 .fuc() 就能够调用

    3. 结尾

    以上就是介绍了! 如果有不了解,或者错误的地方,请批评指正!!

  • 相关阅读:
    KNN-KG论文学习笔记
    python:bisect查找和排序
    Vue实现模糊查询:filter()
    ref的使用
    leecode #加一#二进制求和
    Unity UGUI的Slider(滑动条)件组的介绍及使用
    ant框架下 a-input-number组件的宽度问题
    图解LeetCode——640. 求解方程(难度:中等)
    第12章 企业应用部署
    便捷解压Keka for Mac(压缩解压工具) v1.3.3中文版
  • 原文地址:https://blog.csdn.net/hero_jy/article/details/127915386