zl程序教程

您现在的位置是:首页 >  后端

当前栏目

Java内部类

JAVA 内部
2023-09-11 14:22:56 时间

内部类

1.什么是内部类

如果一个类定义在另外一个类的内部,那么这个类就会被称为内部类。一个内部类和普通类一样,可以有自己的实例变量,构造方法,实例方法等等,只是被嵌套在了其他类里面而已。举个栗子,我们设计了一个A类只想让B类使用,如果设计成外部类,其他类就可以随意使用了,这个时候就可以把A类设计成B类的内部类。如下:
在这里插入图片描述

2.内部类分类

内部类有实例内部类 静态内部类 两类。内部类有static关键字修饰就称为静态内部类。
在这里插入图片描述

3.实例内部类

设计一个实例内部类如下:

public class OutClass {
    private int a;
    class InnerClass {
        private int b;
        void fun() {
            a = 10;
            b = 20;
        }
    }
}

在实例内部类中定义一个函数fun,毫无疑问,函数中可以访问变量b,因为b是自己的实例变量,有当前类隐含的this,当然可以随便访问。同时也观察到,在该函数中也可以访问外部类的变量a,那么也是因为有当前类隐含的this吗?我们先把this关键字加上试试。
在这里插入图片描述
发现出现无法解析符号“a”的错误。这是因为当实例内部类访问外部类成员时提供的是外部类对象的this。
在这里插入图片描述

4.静态内部类

设计一个静态内部类如下:

public class OutClass {
    private int a;

    static class InnerClass {
        private int b;

        void fun() {
            this.b = 20;
        }
    }
}

InnerClass被设计成了OutClass的一个静态内部类,在fun函数中可以访问自己的成员变量b,因为会提供默认的this。那么还可以像实例内部类一样可以访问外部类的成员吗?显然是不可以的,因为静态内部类只可以提供当前类的this,不可以提供外部类的this了。
在这里插入图片描述
因此,当我们设计内部类的时候,如果想内部类可以随意访问外部类成员的时候,就把内部类定义为实例内部类;如果不想内部类可以随意访问外部类成员的时候,就把内部类定义为静态内部类。

5.生成内部类对象

5.1生成实例内部类对象

OutClass类:

public class OutClass {
    private int a;
    class InnerClass {
        private int b;
        void fun() {
            OutClass.this.a = 10;
            this.b = 20;
        }
    }
}

TestDemo类:

public class TestDemo {
    public static void main(String[] args) {
        OutClass outClass = new OutClass();//生成外部类对象
        OutClass.InnerClass innerClass = outClass.new InnerClass();
    }
}

实例内部类对象的生成,需要先生成外部类对象,然后借助外部类对象再去new对象。还需要指定生成哪一个内部类的引用变量去接受它,为什么需要指定是哪一个内部类的呢?因为它有可能是张三家的,也有可能是李四家的,在这里是OutClass类家的。
在这里插入图片描述

5.2生成静态内部类对象

OutClass类:

public class OutClass {
    private int a;

    static class InnerClass {
        private int b;

        void fun() {
            this.b = 20;
        }
    }
}

TestDemo类:

public class TestDemo {
    public static void main(String[] args) {
        OutClass.InnerClass innerClass = new OutClass.InnerClass();
    }
}

静态内部类对象的生成,不需要借助外部类的对象,但需要指明是哪一个外部类的,用外部类.调用静态内部类的构造方法,同时也需要指定生成哪一个内部类的引用变量去接受它。
在这里插入图片描述