告诉你什么是 Java 宏变量,别再疑惑不解了

小编第一次被问到这个概念时,确实是有点懵。入行没多久,莫怪莫怪!后来翻阅一些资料和博客,才豁然开朗。

小编认为Java中其实没有关于宏的定义,《Thinking in Java》中我也没有找到相关的介绍。这个概念应该是从C语言中带过来的,毕竟C语言中define宏定义和const常量定义之间的区别很大。而在Java中宏与final定义类似,可以理解为“常量”。

概念:
	Public final Double PI= 3.14

简单点说,像上面这种被“final关键字修饰且给了初始值的变量就是宏变量”。
一般在项目中,用于定义一些不会改变的量,比如:true、false、0、1、3.14或流程控制里的任务节点名称等。这样做,既方便代码的维护(也就是只修改一个地方就可以了),还可以增强代码的可读性,利于查找,不至于混淆。
在java中,被final关键字修饰的变量,且设置了初始值,那么这个值在编译阶段就已经确定了值,编译器会把用到该变量的地方全部都替换成设置好的那个值,提高运行效率。(详:见前文关于“字符串常量池”的介绍)

分析:

简单看一个案例:
告诉你什么是 Java 宏变量,别再疑惑不解了_第1张图片
在上面的代码中,第一次会输出true,第二次会输出false,因为在第一次比较中,str2是直接将两个字符串连接。在java中,字符串本身就可以理解为宏常量,这里要注意,是本身而不是字符串变量,也就是“Hello”和“ Java”已经是定死的了,不会再改变。在程序编译时,java直接将两个字符串连接成“Hello Java”,然后在常量池中寻找值为“Hello Java”的地址,并将寻找到的地址赋值给str2,所以,第一次的输出结果为true。

在第二次比较中,str5是将str3和str4两个字符串变量的内容相连接,这里的str3和str4是变量。通俗来讲:当程序每次执行到“str3 + str4”时,机器并不确定str3和str4到底是什么内容,所以在编译时,会内存中为str5开辟了一块新的存储空间,然后将str3和str4计算的和赋值给str5所指向的对象。虽然str5和str1所指向的内容相同,但是存储的地址却不同,所以,第二次的输出结果为false。

如上文所说,如果可以让编译器在编译时明确str3和str4的值,那str5和str1是不是就相等了呢?确实如你所想。

我们将str3和str4分别加上final来修饰,这时str3和str4就变成了可执行“宏替换”的final常量。由于final修饰的变量是不可以再修改的,所以在程序编译期间,就会直接将str3和str4的内容连接,相当于“Hello” + “ Java”,输出结果自然是true。

代码如下:
告诉你什么是 Java 宏变量,别再疑惑不解了_第2张图片

小结

小编觉得,宏的概念知道就好,毕竟我还是习惯用常量来称呼它。

更多精彩,请关注我的"今日头条号":Java云笔记
随时随地,让你拥有最新,最便捷的掌上云服务

你可能感兴趣的:(告诉你什么是 Java 宏变量,别再疑惑不解了)