内部类笔记 —— 你了解内部类吗?

Posted Putarmor

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了内部类笔记 —— 你了解内部类吗?相关的知识,希望对你有一定的参考价值。

今天就讲一下内部类,内部类顾名思义,就是在类中的类,那么内部类具体有哪些呢,一起来看一下:

内部类分类:

  • 实例内部类
  • 静态内部类
  • 匿名内部类
  • 本地内部类

Ⅰ.实例内部类

1.如何实例化内部类对象呢?

  • 外部类名.内部类名 变量 = 外部类对象引用.new 内部类();
    

2.只要是内部类,那么生成的字节码文件格式:

  • 外部类名$内部类名.class
    

3.在实例内部类当中,不能定义静态的成员变量!

  • 如果一定要编译,那么一定是在编译时期确定的值 例如public static final
    

4.this实际上是一个静态的成员

  • System.out.println(OutClass.this.data1)
    

5.实例内部类实际上拥有两个this,一个是实例内部类自己的,一个是外部类的

6.面试题:实力内部类是否有额外的内存开销?

  • 有的,因为它拥有两个this
    
class OutClass{
    public int data1 = 1;
    public static int data2 = 2;

    class InClass{

        public int data1 = 11;
        //public static int data3 = 3;
        public static final int data4 = 4;

        public InClass(){

        }

        public void test(){
            System.out.println("InClass的test()方法!");
            System.out.println(data4);
            System.out.println(data1);  //访问的是内部类自己的变量data1
            System.out.println(OutClass.this.data1); //访问的是外部类变量data1
            System.out.println(data2);
        }
    }
}

public class TestDemo2 {
    public static void main(String[] args) {
        OutClass outClass = new OutClass(); //外部类对象
        OutClass.InClass inClass = outClass.new InClass(); //通过外部类对象引用访问内部类
        inClass.test();
    }
}

代码执行结果:
在这里插入图片描述
此外需要注意的是:实例内部类中不能出现静态数据成员!
在这里插入图片描述
Ⅱ.静态内部类

1.怎么拿到静态内部类的实例对象

外部类名.内部类名 变量 = new 外部类名.内部类名

2.字节码文件: 外部类$内部类.class

3.在静态内部类当中,是不可以访问外部类的非静态数据成员的!!!

因为外部类的非静态数据成员是依赖于外部类对象的, 但是非要访问怎么办?

解答:创建外部类对象引用,此时public OutClass1
outClass1,这时候并未实例化,不能通过该引用直接访问非静态数据成员;将其传入内部类构造函数中,然后通过外部类对象引用调用外部类非静态数据成员就ok!

class OutClass1{
    public int data1 = 6;
    public static int data2 = 12;

    static class InClass{
        public int data3 = 3;
        public static int data4 = 4;
        public OutClass1 outClass1;

        //将外部类对象引用当作参数传入内部类构造方法中
        public InClass(OutClass1 outClass1){
            this.outClass1 = outClass1;
        }
        public void test(){
            System.out.println("InClass的test()方法");
            System.out.println(outClass1.data1); //访问外部类非静态数据
            System.out.println(data2);
            System.out.println(data3);
            System.out.println(data4);
        }
    }
}

public class TestDemo1 {
    public static void main(String[] args) {
        OutClass1 outClass1 = new OutClass1();
        //拿到静态内部类对象
        OutClass1.InClass inClass = new OutClass1.InClass(outClass1);
        inClass.test();
    }
}

在这里插入图片描述
Ⅲ.匿名内部类

在匿名内部类当中,使用的变量是整个过程中没有发生改变过的量或者是常量!!!

匿名内部类在多线程中常用,具体来看一下他的形式:

class OutClass2{
    public void test(){
        System.out.println("啦啦啦啦啦啦啦,内部类学完咯");
    }
}

public class TestDemo3 {
    public static void main(String[] args) {
        //匿名内部类,可以看作是OutClass2的子类
        int data = 1;

        new OutClass2(){
            @Override
            public void test() {
                //data = 9;
                super.test();
                System.out.println(data);
            }
        }.test();
    }
}

在这里插入图片描述
Ⅳ.本地内部类

本地内部类几乎不用,它是定义在方法内部的类,说白了意义不大真的

public void func(){
		//本地内部类
        class A{
            
        }
    }

咱也不知道它要搞个什么名堂你说是不?

以上是关于内部类笔记 —— 你了解内部类吗?的主要内容,如果未能解决你的问题,请参考以下文章

你能帮我处理我的 const_iterator 内部类吗?

你可以在结构中有一个类吗?

你能在 Swift 中创建匿名内部类吗?

“全栈2019”Java第八十九章:接口中能定义内部类吗?

java内部类的匿名内部类

Java学习笔记之二十六深入理解Java匿名内部类