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关键字修饰。

时间: 2024-10-23 16:30:30

java 编译期常量的相关文章

Java编译期的前端过程

Java编译期的概念 编译期即将源代码转变成本地代码的过程,对于Java来说,这个过程会更加的多样. Java编译期因为采用的编译器类型不同而导致概念也不同,Java编译器可以分为以下三种类型: 前端编译器 前端编译器将java源代码转变成字节码,常见的前端编译器包括Javac编译器.ECJ编译器(Eclipse JDT). 即时(JIT,Just In Time)编译器 即时编译器将字节码转变成本地机器码,常见的即时编译器包括HotSpot 虚拟机的C1.C2编译器. AOT(Ahead of

Java编译期和运行期

Q.下面的代码片段中,行A和行B所标识的代码有什么区别呢? ? 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 public class ConstantFolding {       static final  int number1 = 5;       static final  int number2 = 6;       static int number3 = 5;       static int number4= 6;       

Java编译期优化与运行期优化技术浅析

Java语言的“编译期”是一段不确定的过程,因为它可能指的是前端编译器把java文件转变成class字节码文件的过程,也可能指的是虚拟机后端运行期间编译器(JIT)把字节码转变成机器码的过程. 下面讨论的编译期优化指的是javac编译器将java文件转化为字节码的过程,而运行期间优化指的是JIT编译器所做的优化. 编译期优化 虚拟机设计团队把对性能的优化集中到了后端的即时编译器(JIT)中,这样可以让那些不是由javac编译器产生的class文件也同样能享受到编译器优化所带来的好处.但是java

Java编译期和运行期 & JVM

Java整个编译以及运行的过程相当繁琐,本文通过一个简单的程序来简单的说明整个流程. 首先两张图,描述编译和执行的过程: Java代码编译是由Java源码编译器来完成,流程图如下所示: Java字节码的执行是由JVM执行引擎来完成,流程图如下所示: 如下图,Java程序从源文件创建到程序运行要经过两大步骤:1.源文件由编译器编译成字节码(ByteCode)  2.字节码由java虚拟机解释运行.因为java程序既要编译同时也要经过JVM的解释运行,所以说Java被称为半解释语言( "semi-i

java编译期和运行期和string原理

 编译期:   是指把源码交给编译器编译成计算机可以执行的文件的过程.在Java中也就是把Java代码编成class文件的过程.编译期只是做了一些翻译功能,并没有把代码放在内存中运行起来,而只是把代码当成文本进行操作,比如检查错误. 运行期:  是把编译后的文件交给计算机执行.直到程序运行结束.所谓运行期就把在磁盘中的代码放到内存中执行起来.在Java中把磁盘中的代码放到内存中就是类加载过程. 通过如String str = "aaa";字面量形式创建的字符串对象 "aaa&

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

见代码 public class Test { public static void main(String[] args){ // 情况一 基本数据类型 //System.out.println(Outer.Inner.n); // 输出结果 : 10 //情况二 //Outer outer = Outer.Inner.outer; // 输出结果 : 静态内部类 //情况三 System.out.println(Outer.Inner.str); // 输出结果: 静态内部类 abc //情

深入了解JVM虚拟机8:Java的编译期优化与运行期优化

java编译期优化 微信公众号[Java技术江湖]一位阿里 Java 工程师的技术小站.作者黄小斜,专注 Java 相关技术:SSM.SpringBoot.MySQL.分布式.中间件.集群.Linux.网络.多线程,偶尔讲点Docker.ELK,同时也分享技术干货和学习经验,致力于Java全栈开发!(关注公众号后回复”Java“即可领取 Java基础.进阶.项目和架构师等免费学习资料,更有数据库.分布式.微服务等热门技术学习视频,内容丰富,兼顾原理和实践,另外也将赠送作者原创的Java学习指南.

in C#,编译型常量(const)和运行时常量(readonly)

readonly 关键字与 const 关键字不同. const 字段只能在该字段的声明中初始化. readonly 字段可以在声明或构造函数中初始化. 因此,根据所使用的构造函数, readonly 字段可能具有不同的值. 另外, const 字段是编译时常量,readonly 字段为运行时常量. 你应该尽量使用运行时常量.原因是变异性常量虽然性能稍微快一些.但是却没有 运行时常量那么灵活.就像第一段中所说,使用readonly时,根据使用的构造函数, readonly字段可能具有不同的值.

constexpr:编译期与运行期之间的神秘关键字

Scott Meyers在effective modern c++中提到"If there were an award for the most confusing new word in C++11, constexpr would probably win it." 由此可见,constexpr确实是比较难以让人理解.加之其在C++11和14中的标准略有不同,也加剧了这种难度. 参考几本经典教材(C++ primer, effective modern C++, a tour of