static与final之间的爱情故事

580 阅读2分钟

一、问题导入

我们平时写代码开发功能时,或者看别人的代码时,是不是见到过下面这种写法:

private static final Logger logger= LoggerFactory.getLogger(Test.class);
private final static Singleton instance = new Singleton();

没错,最近我就很好奇,这样写的目的是什么,可能大家马上联想到了“静态常量”这一说法

public static final String PROJECT_CREATE = "PROJECTCREATE";

这也是在定义常量时习惯的写法,可是,自己真的没有这么按照开头所展示的代码使用过,下面跟着我一探究竟吧!

二、问题分析

首先,我们先要知道,static与final的基本用法。

1、下面是static常见应用场景,其代表意思就是静态,是类相关的概念,独立于对象,具有“共享”的意思。

1、修饰成员变量
2、修饰成员方法
3、静态代码块
4、修饰类【只能修饰内部类也就是静态内部类】
5、静态导包

2、下面是final常见应用场景,其代表意思就是常量,不可改变的,尤其是在用final修饰之前一定要赋初始值。

1、修饰类

2、修饰变量

3、修饰方法

对于以上两点不做过多讨论,详细参见下面两篇文章

3、知道了static与final的用法,我们就来说说,他们两个在一起的使用吧。

private final static Singleton instance = new Singleton();

就上面的例子来说,首先定义为static修饰instance变量,说明这个是类里面需要共享的,经常被使用到的,不管创建了new了多少个实例,也只创建一次,节省空间,所以一个类里面只要一个;其次final修饰说明该变量的引用不可改变,instance 不能再指向其他 Singleton 对象,表示是常量;最后联系在一起便是:定义成static final,instance变量不可变,读取速度快,这也就可以解释了,单例模式中的饿汉式(静态常量),每次只能创建一个对象,而且每次创建的对象变量的地址还都是一样的。

三、总结

  • static final 多用于本类中经常被用到的静态常量,不需要每次都要创建一个,这样节省了内存空间,读取速度变快
  • 碰到疑惑,要多加思考,找到原因,这样才能进步,学到更多知识