以前总是遇到一些不可思议的事,但是那是没有时间和精力去解决,只是先记着,唉,记着记着,就有去解释一下的冲动了。
引例:
public class FinalKeyWordTest {
public static void main(String[] args) {
final String str1 = "我是"+ 123;
final String str2 = "我是" +String.valueOf(123);
System.out.println(str1 == "我是123");
System.out.println(str2 == "我是123");
}
}
//运行结果:
//true
//false
//乍一看,为何第一句输出真,而后一句输出假呢?刚开始我也极端纳闷,想不通(不过还没到要跳楼的程度),
//资料查啊查才有“一点”眉目
//总结:首先,我们要清楚“.equals()”方法和“==”的区别,第一句说明了str1和后面的字符串是同一个东西。str1和
//str2没有太大的区别,只是定义str2时显式将数值123转换成字符串,但由于该变量的值需要调用String类方法,因
//此编译器无法编译时确定str2的值,str2不会被当成“宏变量”处理。(但str1会被当成宏变量处理,在编译时就会确
//定值。
很多人遇到过这种情况,在匿名内部类中使用一个内部类外的局部变量时,如果该局部变量不加final关键字修饰,会编译不通过,这是为什么呢?如果你知道答案,以下内容请勿看,免得浪费你宝贵的时间。
public class InlineClassTest {
public static void main(String[] args) {
final String str = "Java";
new Thread(new Runnable() {
public void run() {
for (int i = 0; i < 100; i++) {
System.out.println(str + i);
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
}).start();
// 执行到这里,main方法结束,但启动的线程还在运行
}
}
小释:如果str变量没有加final,那么当main方法执行结束后,str变量会被回收或被销毁,那么子线程用的str就不存在了,所以Java是不允许这些矛盾出现的,所以此时final关键字就起作用了,该关键字允许内部类产生隐式的“闭包”,闭包将使得局部变量脱离它所在的方法继续存在。
附:java缓存小实例:
public class BufferMemory {
public static void main(String[] args) {
String str1= "改变世界,下一个就是U";
String str2 = "改变世界,下一个就是U";
System.out.println(str1 == str2);
}
}
运行结果:
true
小释:Java会缓存曾经用过的字符串直接量(本人估计这样的机制是想提高运行速度和节省空间吧)。
总结:以上都是一些很小的细节,但是,见叶知秋,我们可以从一些小小的细节去窥探java运行机制,其实还是蛮有意思的。
计划:研究java集合的实现细节。
分享到:
相关推荐
浅析Java中的final关键字Java开发Java经验技巧共6页.pdf.zip
22.final关键字.zip22.final关键字.zip22.final关键字.zip22.final关键字.zip22.final关键字.zip22.final关键字.zip22.final关键字.zip22.final关键字.zip22.final关键字.zip22.final关键字.zip22.final关键字.zip22...
Java final关键字的学习demo
内容概要: 本文介绍了Java中final关键字的概念和用法。读者将学习什么是final关键字,为什么需要使用final,以及在不同场景下如何使用final关键字。此外,还会讨论final关键字的一些注意事项和规则。 能学到什么:...
带你深入理解Java中的final关键字_动力节点Java学院整理.
final关键字的使用f
Java中的final关键字
java final关键字 java final关键字
java程序设计中,final 关键字用法,通过代码演示java程序设计中,final 关键字用法,
另外,Java中的String类就是一个final类,那么今天我们就来了解final这个关键字的用法。 主要介绍:一.final关键字的基本用法。二.深入理解final关键字 一.final关键字的基本用法 在Java中,final关键字可以用来...
【Java语言基础】final关键字 修饰词:final 最终的最后的 final关键字可用于修饰符,变量和方法,用于表示它修饰的类,方法和方法不可改变。 final 最终的最后的 final修饰变量时,表示该变量一旦获得了初始值之后...
Java中的final关键字 1、修饰类的成员变量 这是final的主要用途之一,和C/C++的const,即该成员被修饰为常量,意味着不可修改。 上面的代码对age进行初始化后就不可再次赋值,否则编译时会报类似上图的错误。 ...
java中的final关键字是用来限制用户的。java final 关键字可以在许多上下文中使用
day11_05_final关键字用于修饰成员变量
在Java中, 可以使用final关键字修饰类、方法以及成员变量。 (1).final标记的类不能被继承; (2).final标记的方法不能被子类复写; (3).final标记的变量即成为常量,只能被赋值一次. 注意: 如果使用final来...
主要给大家介绍了关于Java基础教程之final关键字的相关资料,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面来一起学习学习吧
Java中的final关键字可以被用来修饰变量、方法和类等,意味着终结、不可改变,下面我们就来举例讲解Java中final关键字的用法:
final关键字正如其字面意思一样,意味着最后,比如被final修饰后类不能集成、变量不能被再赋值等,以下我们就来深入解析Java编程中final关键字的作用:
在Java中,final关键字可以用来修饰类、方法和变量(包括成员变量和局部变量),下面通过本篇文章给大家介绍java中的final关键字,对java fina关键字相关知识感兴趣的朋友一起看看吧