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


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

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

    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”,所以它们就是同一个对象。

    推荐阅读

    干货:免费领取2TB架构师四阶段视频教程

    面经:史上最全Java多线程面试题及答案

    工具:推荐一款在线创作流程图、思维导图软件

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

  • 相关阅读:
    linux初学者-普通磁盘分区篇
    linux初学者-延迟及定时任务篇
    linux初学者-网络管理篇
    linux初学者-虚拟机联网篇
    贪吃蛇Ground Java实现(二)
    贪吃蛇 Java实现(一)
    创建异常
    IO流
    实训第一天
    Array 遍历数组
  • 原文地址:https://www.cnblogs.com/java-stack/p/11952592.html
Copyright © 2020-2023  润新知