修饰词static final以及日志中为什么需要用这两个词修饰

解答两个基础问题:

  1.  LOGGER为什么要用private static final 去修饰?
  2. 常量定义为什么也要用 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对象而改变。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

QC·Rex

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值