public class PrintWords {
public static void main(String[] args) {
System.out.println(Words.FIRST + " " +
Words.SECOND + " " +
Words.THIRD);
}
}
public class Words {
private Words() { }; // Uninstantiable
public static final String FIRST = "the";
public static final String SECOND = null;
public static final String THIRD = "set";
}
现在假设你像下面这样改变了那个库类并且重编译了这个类,但并不重编译客户端的程序:
public class Words {
private Words() { }; // Uninstantiable
public static final String FIRST = "physics";
public static final String SECOND = "chemistry";
public static final String THIRD = "biology";
}
此时,客户端的程序会打印出什么呢?
一个常量变量的定义是:一个在编译期被常量表达式初始化的final的原始类型或String类型的变量[JLS 4.12.4]。在知道了这些知识之后,我们有理由认为客户端程序会将初始值Words.FIRST, Words.SECOND, Words.THIRD编译进class文件,然后无论Words类是否被改变,客户端都会打印the null set。
运行了程序,你会发现它打印的是the chemistry set。
关键是null不是一个编译期常量表达式
分享到:
相关推荐
源实现参考网络资源;基于源实现解决了其重入问题。 语言环境:c++14 测试环境:在VS2019、ubuntu(wsl) g++(理论上支持c++14的都可以)
* 字符串常量编译 将不同长度的字符串常量信息,按“可选字符串个数 + 索引头阵列 + 字符串数据”方式编译为一个bin文件 * 图片转换与图片数据提换功能:提取.wbm/.bmp/.gif/.png格式中的,纯图像数据,供嵌入式...
问题原因:在Java文件中,指向编译时static final的静态常量, 会被在运行时解析为一个局部的常量值(也就是说静态常量在编译后,成为了常量,而不是原先
"C8051F12X存储大量常量代码的编译技巧" 本文主要介绍了C8051F12X存储大量常量代码的编译技巧。C8051F12X具有完善的片上外设资源,8KB的片上RAM和128KB的Flash资源,不必外扩存储器即可实现带较大容量的中文液晶...
本话题聚焦于“编译原理作业”,特别关注C语言的关键字识别和常量标识符的识别,这些都是理解C语言语法的基础。 首先,C语言的关键字是预定义的、具有特殊含义的标识符,它们不能被用作变量名或函数名。这些关键字...
编译器在优化过程中可能会合并常量、内联函数、消除冗余代码等,这些改变在反编译后是无法恢复的。此外,编译器还会生成一些编译器特有的指令和结构,这些在反编译后的源代码中可能难以理解。 例如,Java的泛型在...
编译原理是计算机科学中的一个重要领域,主要研究如何将高级编程语言转换为机器可以理解的低级语言,如汇编代码或直接机器码。在编译原理的学习中,我们需要掌握以下几个核心知识点: 1. **词法分析(Lexical ...
为什么称它为静态常量呢,因为如上声明可以按照如下理解(注意:如下书写是错误的,会出编译错误,这里只是为了方便说明)。 public static const int MAX_VALUE = 10; 用const定义的常量,对于所有类对象而言
这是因为 Java 编译器在编译时已经将常量值替换为了具体的值,而不是使用对常量类的引用。 了解了这个机制后,我们可以使用以下三种方法来解决这个问题: ### 方法一:删除 CLASS 文件并重新编译 这是最简单的...
易语言程序反编译教程
描述中提到,这个反编译工具能够处理已经编译的易语言模块,并将其转换回源代码形式,但有一个重要的限制,那就是它不支持反编译已加密的模块。模块加密是为了保护代码不被轻易篡改或复制,所以如果模块制作者对其...
根据给定文件的信息,我们可以提炼出关于“常量指针和指针常量”的相关知识点。下面将对这些概念进行详细的解析。 ### 常量指针与指针常量的概念 #### 1. 常量指针(const int *) **定义**:`const int *p` 这种...
编译原理是计算机科学领域的重要学科,主要研究如何将高级编程语言转换为机器可执行的低级代码。这个学科涉及到词法分析、语法分析、语义分析、优化以及目标代码生成等多个关键步骤。本资料“编译原理习题答案”显然...
与C/C++的宏不同,C#中的常量是在编译时确定的,并且不能在运行时更改。此外,C#还提供了枚举类型(enum),这是一种更安全的常量集合,可以防止类型错误。 "API常量表大全"可能是一个数据库文件(.mdb格式,通常是...
《编译系统透视:图解编译原理》是深入理解计算机科学中不可或缺的一环,它为我们揭示了程序语言从源代码到机器可执行代码的转化过程。编译器是这个转化过程的核心,它将高级语言翻译成计算机可以直接执行的低级语言...
尝试改变指针常量指向的地址会导致编译错误。 - 例如:`int *const ptr = &var; ptr = NULL;` 这样的操作是非法的。 3. **混合使用const关键字**: - 可以同时定义一个既是指针常量又是常量指针的变量,这时...
6. **代码优化**:在生成目标代码之前,编译器会进行各种优化,如常量折叠、循环展开、死代码消除等,以提高程序的运行效率。 7. **目标代码生成**:最后,编译器将优化后的中间代码转换为特定平台的机器语言,生成...
在这个例子中,`p`可以改变其指向的地址,但`*p`不能被赋值为新的整数值,尝试这样做会导致编译错误。 **指针常量**(Pointer Constant): 指针常量是一个其自身值不能改变的指针,即指针变量一旦被初始化,就不能...
**编译原理是计算机科学中的一个核心领域,它研究如何将高级编程语言转换为机器可理解的低级语言,即机器代码。广东工业大学的编译原理课程设计旨在让学生深入理解和实践这一过程,通过实际项目来巩固理论知识。** ...