解答两个基础问题:
- LOGGER为什么要用private static final 去修饰?
- 常量定义为什么也要用 static final 修饰?
首先我来说明这两个修饰词的作用。
final:用来修饰类,变量,方法:
final修饰的类不能有子类,也不能被继承。
final修饰的变量是一个常量,不能重新赋值。
final修饰的方法不能重写
static修饰:
在创建对象之前就会为这个变量在内存中创建一个存储空间,以后创建对象如果需要用到这个静态变量,那么就会共享这一个变量的存储空间。
不使用static修饰:
如果建立常量时直接赋一个固定值,那么这个常量的值是固定不变的,即多个对象中的值也是相同的。如果建立常量时是采用函数或对象,那么每次建立对象时给其常量的初始化值就有可能不同。所以,只使用final的Java常量定义并不是恒定的。
我简单手机了一下简单的答案:
第一个问题:
- 定义成static final,logger变量不可变,读取速度快
- static 修饰的变量是不管创建了new了多少个实例,也只创建一次,节省空间,如果每次都创建Logger的话比较浪费内存;
- final修饰表示不可更改,常量
将域定义为static,每个类中只有一个这样的域.而每一个对象对于所有的实例域却都有自己的一份拷贝.,用static修饰既节约空间,效率也好。final 是本 logger 不能再指向其他 Logger 对象
private static final Logger logger= LoggerFactory.getLogger(Test.class);
第二个问题:
import java.util.Random;
//这个例子想说明一下static final 与 final的区别
public class StaticAndFinalTest {
private static Random rand = new Random(47); //47作为随机种子,为的就是产生随机数。
private final int a = rand.nextInt(20);
private static final int B = rand.nextInt(20);
public static void main(String[] args) {
StaticAndFinalTest sf = new StaticAndFinalTest();
System.out.println("sf : " + "a=" + sf.a);
System.out.println("sf : " + "B=" + sf.B);
System.out.println("------------------------------");
StaticAndFinalTest sf1 = new StaticAndFinalTest();
System.out.println("sf1 : " + "a=" + sf1.a);
System.out.println("sf1 : " + "B=" + sf1.B);
}
}
下面是代码结果:
sf : a=15
sf : B=18
--------
sf1 : a=13
sf1 : B=18
可以看到,在sf和sf1对象中,a的值不是唯一的,但B的值是不会通过创建sf1对象而改变。