Java内部类使用详解

在一个类中创建另外一个类,叫做成员内部类。这个成员内部类可以静态的(利用static关键字修饰),也可以是非静态的。

静态内部类的使用目的

  1. 首先,用内部类是因为内部类与所在外部类有一定的关系,往往只有该外部类调用此内部类。所以没有必要专门用一个Java文件存放这个类
  2. 使用静态内部类实现线程安全的单例模式
//内部类实现懒汉模式
public class Singleton {

    private static class SingletonHolder{
        private static Singleton singleton = new Singleton();
    }
    //私有的构造函数,使外部类无法通过 构造器构造实例
    private Singleton() {}
    //获取单例对象
    public static Singleton getInstance() {
        return SingletonHolder.singleton;
    }
}

静态内部类的使用限制

将某个内部类定义为静态类,跟将其他类定义为静态类的方法基本相同,引用规则也基本一致。不过其细节方面仍然有很大的不同。具体来说,主要有如下几个地方要引起各位程序开发人员的注意。

  1. 静态成员(包括静态变量与静态成员)的定义

在非静态内部类中不可以声明静态成员(可以声明用final修饰的static成员)。如现在在一个student类中定义了一个内部类Age,如果没有将这个类利用static关键字修饰,即没有定义为静态类,那么在这个内部类中如果要利用static关键字来修饰某个成员方法或者成员变量是不允许的。在编译的时候就通不过。故程序开发人员需要注意,只有静态内部类才能够定义静态的成员变量与成员方法。

注意:从 Java 16 开始,允许在非静态内部类中使用静态方法。

  1. 成员的引用上的限制

一般的非静态内部类,可以随意的访问外部类中的成员变量与成员方法。即使这些成员方法被修饰为private(私有的成员变量或者方法)。但是如果一个内部类被定义为静态的,那么在引用外部类的成员方法或者成员变量的时候,就会有诸多的限制。如不能够从静态内部类的对象中访问外部类的非静态成员(包括成员变量与成员方法)。在普通的非静态内部类中是没有这个限制的。也正是这个原因,决定了静态内部类只应用在一些特定的场合。其应用范围远远没有像非静态的内部类那样广泛。

  1. 在创建静态内部类时不需要将静态内部类的实例绑定在外部类的实例上

非静态内部类的实例一定要绑定在外部类的实例中。也就是说,在创建非静态内部类之前要先在外部类中要利用new关键字来创建这个内部类的对象。通常情况下,程序员在定义静态内部类的时候,是不需要定义绑定在外部类的实例上的。也就是说,要在一个外部类中定义一个静态的内部类,不需要利用关键字new来创建内部类的实例。

参考:
java静态内部类的作用
Java静态内部类(static class)
为什么在 Java 16 中的非静态内部类中允许静态方法?
© 版权声明
THE END
喜欢就支持一下吧
点赞6赞赏 分享
评论 抢沙发

请登录后发表评论

    请登录后查看评论内容