前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >Java中的宏变量,宏替换详解。

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

作者头像
Java技术栈
发布2018-03-30 16:15:58
3.6K0
发布2018-03-30 16:15:58
举报
文章被收录于专栏:Java技术栈Java技术栈

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

输出true false

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

代码语言:javascript
复制
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);
}

程序输出:

代码语言:javascript
复制
false
true
false
true

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

首先来理解下宏变量:

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

如:

代码语言:javascript
复制
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",所以它们就是同一个对象。

本文参与 腾讯云自媒体分享计划,分享自微信公众号。
原始发表:2017-11-25,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 Java技术栈 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档