`
hongwei3344661
  • 浏览: 31338 次
  • 性别: Icon_minigender_1
文章分类
社区版块
存档分类
最新评论

java编译期常量

 
阅读更多

编译期常量的特点就是:它的值在编译期就可以确定。比如:

  final int i = 5;

  再傻的编译器也能在编译时看出它的值是5,不需要到运行时。对于运行时常量,它的值虽然在运行时初始化后不再发生变化,但问题就在于它的初始值要到运行时才能确定。 

  比如:

  Random rand = new Random(47);

  final int i4 = rand.nextInt(20);

  虽然i4的值在定义并初始化后不会再发生变化(除非你使用一些不符合标准的小技巧),但再聪明的编译器也无法在编译时确定它的值呀。

   为了更清楚的理解编译期常量的概念,我们引入【常量折叠】的概念:在编译器里进行语法分析的时候,将常量表达式计算求值,并用求得的值来替换表达式,放入常量表,可以算作一种编译优化。

  对于编译期常量,编译器常常在编译时就可以折叠开。而对于运行期常量,编译期无法折叠,编译器能做的,只是对所有可能修改它的动作报错。

案例1:

复制代码
package testPage;

class InitalizedClass {
    static {
        System.out.println("You have initalized InitalizedClass!");
    }
    public static int inititalize_varible = 1;

}

public class TestInitializeClass {
    
    public static void main(String[] args) {
        System.out.println(InitalizedClass.inititalize_varible);
    }
    /**
     * 输出结果为:
     * You have initalized InitalizedClass!
     * 1
     */

}
复制代码

案例2:

复制代码
package testPage;

class InitalizedClass {
    static {
        System.out.println("You have initalized InitalizedClass!");
    }
       //和上面的例子唯一的差异就是此处的变量INITIALIZED_VARIBLE被声明为final
    public final static int INITIALIZED_VARIBLE = 1;

}

public class TestInitializeClass {
    public static void main(String[] args) {
        System.out.println(InitalizedClass.INITIALIZED_VARIBLE);
    }
    /**
     * 输出结果为:
     * 1
     */
}
复制代码

  为什么两个例子执行结果不一样,原因是第二个例子中的INITIALIZED_VARIBLE为编译期常量,它不会导致类的初始化。

分享到:
评论

相关推荐

    java学习教程之常量折叠详解

    在Java语言中,常量折叠是一种编译器优化技术,它指的是编译期常量加减乘除的运算过程会被折叠。常量折叠的概念是指在编译期间,编译器会将一些表达式计算好,不需要在运行时进行计算。 常量折叠的发生条件是编译期...

    探究Java常量本质及三种常量池(小结)

    Java中的常量池是Java虚拟机(JVM)中的一种机制,用于存储编译期常量和运行期常量。常量池是JVM中的一种重要机制,它可以将常量存储在内存中,并提供快速的访问和共享机制。 Java中的常量池有三种形态:静态常量池...

    Java堆、栈和常量池——内存剖析

    - 编译期已知的字符串常量会被存储在常量池中,例如直接用双引号定义的字符串。 - 运行期间通过`new String()`方式创建的字符串会被存储在堆中。 - 相同内容的字符串常量在常量池中只会有一份拷贝,而堆中的相同...

    Java堆,栈和常量池详解

    常量池是一块用于存放编译期生成的各种字面量和符号引用的内存区域,它存在于方法区中。Java语言规范规定,常量池是一个表结构,包含一系列的常量定义。每一个类或者接口都会在其方法区有一个常量池。 - **特点**:...

    Java最新2023年面试题附答案解析,大汇总.md

    讲讲什么情况下会出现内存溢出,内存泄漏 乐观锁和悲观锁的理解及如何实现,有哪些实现方式 线程与进程的区别? Session的save()、update()... Java 中的编译期常量是什么?使用它又什么风险 Java死锁以及如何避免

    java堆、栈和常量池

    常量池是一个非常重要的概念,它在编译期就被确定,并保存在已编译的`.class`文件中。 - **存储内容**:常量池包含代码中定义的各种基本类型和对象型的常量值,还包括以文本形式出现的符号引用,例如类和接口的全...

    深入Java核心 Java内存分配原理精讲

    常量池在编译期就已经确定,包含了类和接口的全限定名、字段和方法的名称和描述符,以及各种基本类型的常量值。常量池中的数据在程序运行时存储在方法区(Method Area),而不是堆中。对于字符串常量,其值存储在常量...

    Java中的堆、栈和常量池_.docx

    字符串对象的引用存储在栈中,而实际的字符串内容可能存储在常量池(编译期已知的字符串)或堆中(运行期创建的字符串)。例如: ```java String s1 = "china"; // 字符串常量,存储在常量池 String s2 = "china"; ...

    class常量池类型分类.pdf

    在Java中,每个`.class`文件都包含一个常量池(Constant Pool),它是一个特殊的数据结构,用于存储类或接口的编译期常量,包括直接引用到其他类、字段和方法的信息。常量池在类加载时被创建,并且在整个程序运行...

    常量池详解归类.pdf

    此外,Java的字符串连接操作(如`s1 + "world"`)也可能利用常量池进行优化,如果字符串是在编译期确定的,那么连接操作可以在常量池中直接完成,而无需在运行时创建新的字符串对象。 总的来说,理解Java中的常量池...

    Java字符池.pdf

    Java字符池,也被称为常量池,是Java内存管理中一个关键的概念,主要用来存储编译期就已经确定的各种常量,包括字符串常量、类、方法、接口等信息。理解字符池对于优化Java程序性能至关重要。 1. **String对象与...

    JAVA水平测试考试题目

    * JAVA中的函数可以重载和重写,函数的重载是编译期多态,函数的重写是运行期多态。 5. JAVA集合框架知识点: * JAVA中的Collection接口、List接口、Set接口、Map接口等集合框架接口。 * JAVA中的ArrayList、...

    解析Java中的String对象的数据类型 字符串

    常量池(constant pool)是Java中的一个概念,它指的是在编译期被确定,并被保存在已编译的.class文件中的一些数据。常量池包括了关于类、方法、接口等中的常量,也包括字符串常量。例如String s0="kvill";,String ...

    Java高级面试题及答案汇总(2021年Java面试题答案大全)

    "Java高级面试题及答案汇总(2021年Java面试题答案大全)" 以下是从给定文件中生成的相关知识点: ...14. Java 中的编译期常量是使用 final 关键字声明的常量,使用它可能会导致代码不可维护和难以扩展。

    Java中finalize()详解及用法

    编译期常量是在类加载的过程中已经完成了初始化的,因此它不可被修改。编译期常量只能使用基本类型,并且必须在定义时进行初始化。运行期常量则可以使用基本数据类型和引用数据类型,它们的值可以根据对象的不同而...

    Java虚拟机规范(Java SE 7)

    - **运行时常量池**:每个类或接口的Class文件中都包含一个常量池表,用于存放编译期生成的各种字面量和符号引用。 - **本地方法栈**:与虚拟机栈所发挥的作用非常相似,区别在于虚拟机栈为虚拟机执行Java方法服务...

    Java 虚拟机.pdf

    6. 运行时常量池:是方法区的一部分,包含编译期生成的常量和符号引用,也支持运行时动态生成常量(如String的intern()方法)。 二、垃圾收集 垃圾收集主要关注堆和方法区。程序计数器、虚拟机栈和本地方法栈由于...

    深入Java核心 Java内存分配原理精讲(对于没有接触过java内存的程序员很有用)

    常量池存储在方法区中,包含编译期确定的常量和符号引用,如字符串字面量、类和接口的完全限定名、字段和方法的名称及其描述符等。 #### 非RAM存储 这通常指的是硬盘等永久存储空间,用于存储持久化的数据,例如类...

    java内存分配机制详解

    - **功能与特点**:常量池是一个用于存储编译期被确定并保存在已编译的`.class`文件中的数据集合。它包括但不限于字符串常量、数字常量以及类名等符号引用。 - **示例**:考虑下面的代码: ```java String str1 = ...

Global site tag (gtag.js) - Google Analytics