查看原文
其他

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

2017-11-25 javastack Java技术栈

QQ用得起来越少了,现在就加入300+技术微信群,公众号回复"微信群"即可加入。

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

输出true false



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

  1. public static void main(String[] args) {

  2.    String hw = "hello world";

  3.    String hello = "hello";

  4.    final String finalWorld2 = "hello";

  5.    final String finalWorld3 = hello;

  6.    final String finalWorld4 = "he" + "llo";

  7.    String hw1 = hello + " world";

  8.    String hw2 = finalWorld2 + " world";

  9.    String hw3 = finalWorld3 + " world";

  10.    String hw4 = finalWorld4 + " world";

  11.    System.out.println(hw == hw1);

  12.    System.out.println(hw == hw2);

  13.    System.out.println(hw == hw3);

  14.    System.out.println(hw == hw4);

  15. }

程序输出:

  1. false

  2. true

  3. false

  4. true

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

首先来理解下宏变量:

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

如:

  1. final String a = "hello";

  2. final String b = a;

  3. final String c = getHello();

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

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

推荐阅读



Java中创建String的两道面试题及详解

类、变量、块、构造器、继承初始化顺序,终极解答。

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

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

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



  Java技术栈  
微信公众号:「Javastack

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



    您可能也对以下帖子感兴趣

    文章有问题?点此查看未经处理的缓存