static关键字提升配置类的优先级,带你领略为何Spring Boot搞出那么多静态内部类

生命太短暂,不要去做一些根本没有人想要的东西。本文已被 https://www.yourbatman.cn 收录,里面一并有Spring技术栈、MyBatis、JVM、中间件等小而美的专栏供以免费学习。关注公众号【BAT的乌托邦】逐个击破,深入掌握,拒绝浅尝辄止。

前言

各位小伙伴大家好,我是A哥。上篇文章了解了static关键字 + @Bean方法的使用,知晓了它能够提升Bean的优先级,在@Bean方法前标注static关键字,特定情况下可以避免一些烦人的“警告”日志的输出,排除隐患让工程变得更加安全。我们知道static关键字它不仅可使用在方法上,那么本文将继续挖掘static在Spring环境下的用处。

根据所学的JavaSE基础,static关键字除了能够修饰方法外,还能使用在这两个地方:

  1. 修饰类。确切的说,应该叫修饰内部类,所以它叫静态内部类
  2. 修饰成员变量

其实static还可以修饰代码块、static静态导包等,但很明显,这些与本文无关

接下来就以这为两条主线,分别研究static在对应场景下的作用,本文将聚焦在静态内部类上。


版本约定

本文内容若没做特殊说明,均基于以下版本:

  • JDK:1.8
  • Spring Framework:5.2.2.RELEASE

正文

说到Java里的static关键字,这当属最基础的入门知识,是Java中常用的关键字之一。你平时用它来修饰变量和方法了,但是对它的了解,即使放在JavaSE情景下知道这些还是不够的,问题虽小但这往往反映了你对Java基础的了解程度。

当然喽,本文并不讨论它在JavaSE下使用,毕竟咱们还是有一定逼格的专栏,需要进阶一把,玩玩它在Spring环境下到底能够迸出怎么样的火花呢?比如静态内部类~


Spring下的静态内部类

static修饰类只有一种情况:那就是这个类属于内部类,这就是我们津津乐道的静态内部类,形如这样:

public class Outer {

    private String name;
    private static Integer age;

    // 静态内部类
    private static class Inner {

        private String innerName;
        private static Integer innerAge;

        public void fun1() {
            // 无法访问外部类的成员变量
            //System.out.println(name);
            System.out.println(age);

            System.out.println(innerName);
            System.out.println(innerAge);
        }

    }

    public static void main(String[] args) {
        // 静态内部类的实例化并不需要依赖于外部类的实例
        Inner inner = new Inner();
    }
}

在实际开发中,静态内部类的使用场景是非常之多的。


认识静态/普通内部类

由于一些小伙伴对普通内部类 vs 静态内部类傻傻分不清,为了方便后续讲解,本处把关键要素做简要对比说明:

  1. 静态内部类可以声明静态or实例成员(属性和方法);而普通内部类则不可以声明静态成员(属性和方法)
  2. 静态内部类实例的创建不依赖于外部类;而普通外部类实例创建必须先有外部类实例才行(绑定关系拿捏得死死的,不信你问郑凯)
  3. 静态内部类不能访问外部类的实例成员;而普通内部类可以随意访问(不管静态or非静态) –> 我理解这是普通内部类能 “存活” 下来的最大理由了吧
版权声明:本文为yourbatman原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://www.cnblogs.com/yourbatman/p/13321589.html