美文网首页Java高级技术
Java中的宏变量,宏替换详解。

Java中的宏变量,宏替换详解。

作者: Java技术栈 | 来源:发表于2017-11-25 10:20 被阅读32次

群友在微信群讨论的一个话题,有点意思,特拿出来分享一下。

首先来看下面这段程序,和群友分享的大致一样。

public static void main(String[] args) {
    String hw = "hello world";
    
    String hello = "hello";
    final String finalWorld2 = "hello";
    final String finalWorld3 = hello;
    final String finalWorld4 = "he" + "llo";
    
    String hw1 = hello + " world";
    String hw2 = finalWorld2 + " world";
    String hw3 = finalWorld3 + " world";
    String hw4 = finalWorld4 + " world";
    
    System.out.println(hw == hw1);
    System.out.println(hw == hw2);
    System.out.println(hw == hw3);
    System.out.println(hw == hw4);
}

程序输出:

false
true
false
true

同样是字符串"hello",为什么用final定义的,且个进行==操作却是true有一个是false,而没用final的却是false?

首先来理解下宏变量:

Java中,一个用final定义的变量,不管它是类型的变量,只要用final定义了并同时指定了初始值,并且这个初始值是在编译时就被确定下来的,那么这个final变量就是一个宏变量。编译器会把程序所有用到该变量的地方直接替换成该变量的值,也就是说编译器能对宏变量进行宏替换。

如:

final String a = "hello";
final String b = a;
final String c = getHello();

a在编译期间就能确定下来,而b、c不行,所以a是宏变量,b、c不是。

所以,再回到上面的程序,finalWorld2和finalWorld4是final定义的,也是在编译期间能确定下来的,所以它能被宏替换,编译器就会让finalWorld2和finalWorld4指向字符串池中缓存的字符串""hello world",所以它们就是同一个对象。

推荐阅读


去BAT面试完的Mysql面试题总结(55道,带完整答案)

阿里高级Java面试题(首发,70道,带详细答案)

2017派卧底去阿里、京东、美团、滴滴带回来的面试题及答案

Spring面试题(70道,史上最全)

通往大神之路,百度Java面试题前200页。

分享Java干货,高并发编程,热门技术教程,微服务及分布式技术,架构设计,区块链技术,人工智能,大数据,Java面试题,以及前沿热门资讯等。


相关文章

  • Java中的宏变量,宏替换详解。

    群友在微信群讨论的一个话题,有点意思,特拿出来分享一下。 首先来看下面这段程序,和群友分享的大致一样。 程序输出:...

  • 读《Thinking in Java》第4版笔记

    宏:编译器预处理,将变量替换为常量,提高程序运行效率。在Java中,final变量就是一个“宏变量”,编译器会把程...

  • 执行宏替换的变量

    final一个重要的用途就是定义宏变量,当定义final变量就为变量指定初始值,而这个值在编译时期就确定下来,那么...

  • 【C/C++】宏(macro)定义与使用

    文章结构如下: 宏的定义 宏的替换与代码展开 宏的替换产生的问题 获取宏参数名称 宏参数的结合 宏的取消 宏定义的...

  • const修饰全局变量取代宏定义

    const修饰全局变量取代宏定义 宏定义 C系程序中广泛使用宏定义,宏只是一种简单的字符串替换,根据是否带参数分为...

  • jni-01、宏、jni函数详解、数据获取、类型转换、签名规则

    宏语法 宏定义 解决循环拷贝的问题 T2.h 宏的取消 #undef 宏 宏变量 真实开发中:宏都是大写 宏函数...

  • 宏定义注意事项

    宏定义 为一段代码定义一个标识, 在编译之前将使用宏名的地方替换为宏值,这个替换的过程叫宏替换也叫宏代换 注意: ...

  • C语言预处理指令

    预处理指令 宏定义 宏定义会在预处理的时候, 用宏定义的值来替换宏的名称 格式: #define 宏名称 宏值 应...

  • 宏定义

    宏定义 名称:预处理拼接符,或者称其为宏拼接符作用:用于类似函数的宏的替换部分,还可以用于类似对象的宏的替换部分。...

  • C语言 预处理指令

    一 .宏定义 #define 宏定义宏定义会在预处理的时候,用宏定义的值来替换宏的名称 定义格式 "#define...

网友评论

    本文标题:Java中的宏变量,宏替换详解。

    本文链接:https://www.haomeiwen.com/subject/nanqbxtx.html