接着上一章节的内容。
昨天我回去想了一下,发觉最后的那个特性还是有点问题,我就做了以下的实验。
昨天最后一点属性的简化版:
package com.ray.ch06;
public class Test {
private final String name = "abcd";
public String getName() {
return name;
}
public static void main(String[] args) {
Test test1 = new Test();
Test test2 = new Test();
System.out.println(test1.getName() == test2.getName());
}
}
输出:
true
但是,我通过另外一种形式改造一下代码:
package com.ray.ch06;
public class Test {
private final String name = new String("abcd");//改动的地方
public String getName() {
return name;
}
public static void main(String[] args) {
Test test1 = new Test();
Test test2 = new Test();
System.out.println(test1.getName() == test2.getName());
}
}
输出:
false
为什么?
我查找了一些资料,发现,上面的这种情况是编译器的优化机制,编译器对于常量字符串是优化的,但是对于new String这种字符串,没有做出优化,因此,就会出现上面的这两种情况。
参考文章:
java编译器对字符串+运算的优化导致的有趣现象
Java编译器中对String对象的优化
下面我们开始今天的章节。
(4)final的属性域必须在对象初始化前就已经初始化。
也就是,final的属性域必须在new前就已经初始化
下面是两种初始化方法:
package com.ray.ch06;
public class Test {
private final int id;
private final String name;
{
id = 0;
}
public Test() {
name = "abcd";
}
}
final属性域要么在构造器里面初始化,要么在代码块里面初始化,如果不初始化,则编译器抛异常。
因为无论是代码块,还是构造器,都在new之前执行的。
而且,上面使用了空白final属性域,使得这个属性可以在运行时赋值,增加代码的灵活性,还有,一旦初始化了final属性域,它就不能改变值或者引用(这里可以回头看上一章节)。
(5)作为参数的时候,无法改变指向的对象。
package com.ray.ch06;
public class Test {
private void say(final Value value) {
// value = new Value();//error
}
}
class Value {
}
代码里面的new是错误的。
总结:这一章节主要讲述了编译器对于string 的优化,以及final属性域的两个注意点。
这一章节就到这里,谢谢。
-----------------------------------
目录
版权声明:本文为博主原创文章,未经博主允许不得转载。
分享到:
相关推荐
LFS 6.6版本是一个稳定的版本,它提供了详细的指导和步骤来创建一个从头开始的Linux环境。该版本的中文版对中文用户来说是一个非常有价值的资源,因为其提供了中文的指导,使得阅读和理解过程更加顺畅。 LFS项目的...
LFS──LinuxfromScratch,就是一种从网上直接下载源码,从头编译LINUX的安装方式。它不是发行版,只是一个菜谱,告诉你到哪里去买菜(下载源码),怎么把这些生东西(rawcode)作成符合自己口味的菜肴──个性化的...
在Java开发中,这样的库可以极大地提高开发效率,因为它封装了常见的功能,开发者可以直接使用,而无需从头编写代码。 描述中的 "mchange-commons-java-0.2.11.jar包" 是该库的主要组成部分,是一个Java归档(JAR)...
用户可以轻松地导入现有的Java项目,或者从头开始创建新的项目,包括Maven或Gradle构建系统。 3. **构建工具**:Eclipse 集成了构建工具,如Ant和Maven,使得构建和管理项目依赖变得简单。对于现代Java开发,Maven...
标题中的“api-ntrip-java-client-master.zip”是一个包含Java实现的NTRIP客户端的源代码压缩包,专门针对Android平台。NTRIP(Networked Transport of RTCM via Internet Protocol)是一种用于实时传输GPS(全球...
2. **aip-java-sdk-4.2.0.jar**:这是核心的AIP Java SDK库文件,包含了所有用于与百度AI平台交互的类和方法。开发者需要引入这个jar文件到他们的Android项目中,才能使用SDK提供的功能。 3. **json-20160810.jar**...
标题“poi-bin-3.1-FINAL-20080629”指的是Apache POI项目的二进制发行版,版本为3.1-FINAL,发布日期为2008年6月29日。Apache POI是一个流行的开源Java库,它允许开发人员创建、修改和读取Microsoft Office格式的...
【标题】: "手把手 - 微服务 Windows 开发环境从头搭建 2022-09-05 直播录像 - 软件安装包-2.zip" 这个压缩包文件包含了搭建微服务开发环境所需的基础软件,包括JDK(Java Development Kit)和MySQL数据库。...
【标题】"Aspose.Words for Java 23.6 with JDK 17 Support" Aspose.Words 是一个强大的文档处理库,专为Java开发者设计,用于创建、操作和转换各种文档格式。版本23.6是这个库的一个重要更新,它引入了对Java ...
Java Swing是Java GUI(图形用户界面)开发的一个重要组件,它是Java Foundation Classes (JFC)的一部分,用于构建桌面应用程序。Swing提供了丰富的组件库,允许开发者创建美观且功能丰富的交互式用户界面。在这个...
2. **String类型**:String不是Java的基本数据类型,而是对象。基本数据类型包括byte、int、char等。String是final类,不能被继承。在效率和内存管理上,如果需要频繁修改字符串,应使用`StringBuilder`或`...
在Java编程中,多文件...通过这个"java-多文件上传dome"工具包,你可以快速实现上述功能,无需从头编写所有代码。不过,记得在实际项目中,除了功能实现,还要关注性能、安全性和可维护性,确保应用程序的稳定运行。
Java SDK是许多软件开发中的重要组成部分,特别是在与服务器端交互时。在这个名为"java-sdk-master.zip"的压缩包中,包含的是Leancound的Java SDK,这是一个专为集成Leancound服务而设计的开发工具包。Leancound是...
2. **示例应用**:可能包含一个简单的Java应用,演示如何使用库来创建模糊视图背景,这对于开发者理解和学习如何使用库非常有帮助。 3. **文档**:可能有README文件或其他形式的文档,解释库的用法、安装步骤、依赖...
2. **数据库操作**:JDBC(Java Database Connectivity)是Java标准的数据库连接库,允许程序与各种类型的数据库进行交互。除此之外,还有像Hibernate和MyBatis这样的对象关系映射(ORM)框架,它们简化了SQL查询,...
Java平台提供了一系列库来支持这些操作,本项目中涉及的主要有Spire.Doc、Spire.PDF以及Apache PDFBox。让我们详细探讨这些库的功能及其在Java开发中的应用。 首先,`Spire.Doc.jar`是Spire.Doc for Java的库文件,...
【标题】:“curso-java-pildorasInf:从头开始学习Java” 这门“从头开始学习Java”的课程,源自"PillsInformática"的教育资源,旨在为初学者提供全面的Java编程知识。Java是一种广泛使用的面向对象的编程语言,由...
**Free Spire.Doc for Java - 3.9 无水印** `Free Spire.Doc for Java` 是一款专为Java开发者设计的文档处理库,它允许用户在Java应用程序中创建、编辑和转换Microsoft Word文档。这个3.9版本提供的是无水印版本,...