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

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

输出true false


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

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

Java中的宏变量,宏替换详解。相关推荐

  1. java中switchcase用法,java中的switch case语句使用详解

    java中的switch case语句 switch-case语句格式如下: ? swtich()变量类型只能是int.short.char.byte和enum类型(JDK 1.7 之后,类型也可以是 ...

  2. java throw与throws_基于Java中throw和throws的区别(详解)

    系统自动抛出的异常 所有系统定义的编译和运行异常都可以由系统自动抛出,称为标准异常,并且 Java 强烈地要求应用程序进行完整的异常处理,给用户友好的提示,或者修正后使程序继续执行. 语句抛出的异常 ...

  3. java里的进制转换函数_基于Java中进制的转换函数详解

    十进制转成十六进制: Integer.toHexString(int i) 十进制转成八进制 Integer.toOctalString(int i) 十进制转成二进制 Integer.toBinar ...

  4. throws java_基于Java中throw和throws的区别(详解)

    系统自动抛出的异常 所有系统定义的编译和运行异常都可以由系统自动抛出,称为标准异常,并且 Java 强烈地要求应用程序进行完整的异常处理,给用户友好的提示,或者修正后使程序继续执行. 语句抛出的异常 ...

  5. java线程和内核线程的,Java中内核线程理论及实例详解

    1.概念 内核线程是直接由操作系统内核控制的,内核通过调度器来完成内核线程的调度并负责将其映射到处理器上执行.内核态下的线程执行速度理论上是最高的,但是用户不会直接操作内核线程,而是通过内核线程的接口 ...

  6. java中List的用法和实例详解

    Java中List的用法和实例详解 List的用法 List包括List接口以及List接口的所有实现类.因为List接口实现了Collection接口,所以List接口拥有Collection接口提 ...

  7. java中带符号十六进制转换成十进制详解

    java中带符号十六进制转换成十进制详解 代码如下 代码如下 必须拿ffff进行测试,否则测不出异同 public void test1(){String strHex="ffff" ...

  8. java里throws详细讲解,基于Java中throw和throws的区别(详解)

    系统自动抛出的异常 所有系统定义的编译和运行异常都可以由系统自动抛出,称为标准异常,并且 Java 强烈地要求应用程序进行完整的异常处理,给用户友好的提示,或者修正后使程序继续执行. 语句抛出的异常 ...

  9. Java中的Timer和Timer Task详解

    Java Timer&TimerTask原理分析 如果你使用Java语言进行开发,对于定时执行任务这样的需求,自然而然会想到使用Timer和TimerTask完成任务,我最近就使用 Timer ...

  10. java中synchronized的三种写法详解

    预备知识 首先,我们得知道在java中存在三种变量: 实例变量 ==> 存在于堆中 静态变量 ==> 存在于方法区中 局部变量 ==> 存在于栈中 然后,我们得明白,合适会发生高并发 ...

最新文章

  1. apache 编译php mysql_记一次痛苦的过程-------源码编译安装apache+php5+mysql
  2. 遇到问题为何该自己动手
  3. 【技术综述】深度学习在自然语言处理中的应用发展史
  4. 北京航空航天大学计算机专业培养方案,北京航空航天大学计算机科学与技术专业...
  5. 如何在VSTFS中设置email notification
  6. JQuery 中选择多选择框,和单选框,实现获取相应选择的值
  7. Git(11)-cherry-pick、reset、rebase
  8. python输出程序运行时间_叨叨 Python 性能优化工具
  9. Java 反射机制详解:私有方法调用头大?如何通过反射调用类中的私有方法?
  10. 渗透测试入门14之渗透测试工具1
  11. python string.format(),Python string.format()百分比,不取整
  12. 关于JVM默认内存的增加
  13. PHP、Python 上榜最慢的现代编程语言
  14. Python基础教程和入门教程
  15. 做图软件matlab,Matlab 生物节律作图软件
  16. mysql隔离级别与锁,接口并发响应速度的关系(2)
  17. JavaScript浏览器对象Window对象常用方法(3)
  18. Codeforces 719B Anatoly and Cockroaches(元素的交叉排列问题)
  19. 带SN切换流程_一文详解贴片电阻生产工艺流程(15个步骤)
  20. 【八股文】4 Spring

热门文章

  1. [mybatis]动态sql_内置参数_parameter_databaseid
  2. [PAT乙级]1038 统计同成绩学生
  3. 算法---宝藏最优选择问题
  4. XGBClassifier()特征选择
  5. 牛客题霸 [寻找第K大] C++题解/答案
  6. 【每日一题】8月28日题目精讲 编号
  7. CF573D-Bear and Cavalry【动态dp】
  8. P4777-[模板]扩展中国剩余定理(EXCRT)
  9. 欢乐纪中某A组赛【2019.7.5】
  10. Korney Korneevich and XOR(CF750F1/F2)