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

news/2025/1/12 1:02:07/

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

小编认为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关键字修饰的变量,且设置了初始值,那么这个值在编译阶段就已经确定了值,编译器会把用到该变量的地方全部都替换成设置好的那个值,提高运行效率。(详:见前文关于“字符串常量池”的介绍)

分析:

简单看一个案例:
在这里插入图片描述
在上面的代码中,第一次会输出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云笔记
随时随地,让你拥有最新,最便捷的掌上云服务


http://www.ppmy.cn/news/632151.html

相关文章

恶魔果实

组合题(牛客): 恶魔果实. 题目描述 牛牛得到了一堆神奇的恶魔果实,每个恶魔果实都给了牛牛一个改变数字的能力,可以把数字a变成数字b,现在牛牛有一个数字x,他想知道吃完这n个恶魔果实后,他可以…

gcc宏展开

要把源代码中的宏展开,其实只要使用gcc进行预处理即可。 gcc -E source.c >out.txt -E表示只进行预处理,不进行编译。 预处理时会把注释当成空格处理掉,如果想保留其中的注释,可以加上-C选项,即: gc…

将一个宏被另一个宏使用

带参数的宏定义的一般形式如下&#xff1a; #define <宏名>&#xff08;<参数表>&#xff09; <宏体> 一.如下图 我想要计算一个三角形的面积 我要定义两个宏&#xff1a;一个用来表示&#xff1a;s1/2*(abc) 一个用来表示&#xff1a; (s-a)(s-b)*(s-c) …

NLP创业破局,如何摘取更高处的果实

点击蓝字 关注我们 AI TIME欢迎每一位AI爱好者的加入&#xff01; 2022年&#xff0c;云从科技、商汤科技先后登陆资本市场&#xff0c;计算机视觉四小龙中的旷视科技、依图科技也在摩拳擦掌。反观NLP领域&#xff0c;相关企业的发展速度、融资规模、上市进程仿佛都要略逊一筹&…

windows下cmake找不到glew、glfw等包的解决方法

错误的类型 这里就放一个glfw的错误图吧&#xff0c;glew报错的话和这个是一样的 找不到glew的解决方案 首先去官网下载glew编译好的文件&#xff0c;链接glew 之后解压如图&#xff0c;我们需要做的是复制bin的路径&#xff0c;我的路径为D:\code_study\glew-2.2.0-win32\gl…

cmake 一些有用的宏

一个开源项目&#xff0c;如果想依赖cmake的find_package规则来实现编译的自动查找&#xff0c;主要是<1>头文件路径<2>库名字<3>库路径这三个方面&#xff0c; 有2个办法&#xff1a; &#xff08;1&#xff09; cmake 有个 系统变量 CMAKE_ROOT 通常比如…

收获属于自己的果实

收获属于自己的果实 一个冬日的夕阳下&#xff0c;银杏树飘落的树叶像倦了的蝴蝶。在这棵银杏的对面有一个IT培训的基地。这里的老师“关爱”学生&#xff0c;学生刻苦努力的学习着&#xff0c;每一个来这里的人都是想着去往人生理想的方向前进&#xff01;他们不懈怠、不抱怨…

编译工具链的预定义编译宏选择(__CC_ARM、__ICCARM__、__GNUC__、_MSC_VER、__SUNPRO_C等)

一、正文 我们在看代码时&#xff0c;经常会看到形如__CC_ARM、__ICCARM__、__GNUC__、_MSC_VER等宏定义用来指示编译平台&#xff0c;含义如下&#xff1a; A __CC_ARM对应的平台是&#xff1a;ARM RealView&#xff1a;   RealView&#xff0c;是一套包含编译、调试和模拟…