java 编译期常量

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了java 编译期常量相关的知识,希望对你有一定的参考价值。

  今天在看书的时候遇到了一个不是很懂的名词,是在think in java 这本书的第七章讲final关键字时讲到的。然后自己在网上查了一下知道了一些。

  编译器常量就是:它的值在编译期就可以确定的常量。也就是说在编译的时候就已经为用到这些常量的地方赋好值了。下边这段程序可以很好地帮助我们找出哪些是编译期常量哪些不是。

package com.wenge.compileTest;

public class CompileTest{
    public static void main(String args[]){
//        System.out.println(Data.i1);
//        System.out.println(Data.i2);//initialization!
//        System.out.println(Data.b1);//initialization!
//        System.out.println(Data.b2);
//        System.out.println(Data.s1);
//        System.out.println(Data.s2);//initialization!
//        System.out.println(Data.a); //initialization! 
//        System.out.println(Data.e); //initialization!
        
    }
}
class Data{
  static{
      System.out.println("initialization!");
  }
  public static final int i1 = 0;
  public static final Integer i2 = 0;
  public static final Boolean b1 = true;
  public static final boolean b2 = true;
  public static final String s1 = "0";
  public static final String s2 = new String("0");
  public static final A a = new A();
  public static final Enum e = E.A;
}
class A{
 
}
enum E {
    A,B,C,D,E,F,G;
}

  我们在main方法中一次只输出一个数据,其余的注释掉,然后我们可以通过看控制台有没有输出"initialization!"而判断输出的常量的类型是不是编译期常量。因为"initialization!"是写在静态代码块里的,所以如果只要CompileTest类的main方法用到Data类里的属性Data类里的静态代码块就会被执行从而输出"initialization!"。
然后单独运行时是否输出"initialization!"已经在后边注释了。(有注释的就说明输出了)所以很容易可以从输出结果中得到结论:java中的编译期常量包括java八大基本类型和直接声明的string类型。什么是直接声明的string类型呢?就是没有通过new关键字声明的字符串(String str = "abc";)。

  当然了常量的前提是有final关键字修饰。

 


以上是关于java 编译期常量的主要内容,如果未能解决你的问题,请参考以下文章

JavaSe: String的编译期优化

Kotlin - 常量与变量

并不是static final 修饰的变量都是编译期常量

深度解析Java内存原型

Java面试17|Java基础

Java技术专题「编译器专题」重塑认识Java编译器的执行过程(常量优化机制)