final修饰的变量引用不能变还是对象不可变
两种情况:如果是基本数据类型,被final修饰的变量一旦初始化就不能改变;如果是引用数据类型的变量,初始化之后不能指向另外一个对象。
基本数据类型:
package cn.yqg.day2;
public class StringTest {
public static void main(String[] args) {
final int a;
int b=;
a=b;
System.out.println(a);
}
}
我们看到上面的代码a是final类型的,但是没有被初始化,所以可以给a赋值。如果a被初始化,a存储的值就不能改变了,示例如下。
package cn.yqg.day2;
public class StringTest {
public static void main(String[] args) {
final int a=;
int b=;
a=b;//编译通不过,会报错建议去掉fianl
System.out.println(a);
}
}
如果是引用数据类型
-----------------------------------------------------------------------------------------------------------------------------------------------------------------
package cn.yqg.day2;
public class StringTest {
public static void main(String[] args) {
final StringBuffer a=new StringBuffer("ppp");
System.out.println(a);
System.out.println(a.hashCode());
a.append("kkk");
System.out.println(a);
System.out.println(a.hashCode());
}
}
运行结果:
ppp pppkkk
我们发现变量内容变了,引用没变。
我们把String定义为final类型,那么String类不能被继承,开始创建对象ppp,并用指向ppp的存储地址,后来a=a+“kkk”会新创建一个内存来存储该对象,并把新的地址赋值给a,那么老的存储ppp对象的地址就没有变量赋值了,就会成为垃圾。
String a="ppp";
a=a+"kkk";
我们看到a的对象内容改变了
不允许String类的引用地址被改变是为了安全性着想,我们看这个例子。
package cn.yqg.day3;
public class Test2 {
public static void main(String[] args) {
String a=new String("fds");
String b=new String("ddd");
String c=b;//c和b都指向ddd对象
c=c+"ds";//c会创建新的内存,内存中存储新的对象,这是ddd只有b指着,c指向新对象。
System.out.println(b);
System.out.println(c);
}
}
运行内存图:

运行结果:
ddd
dddds
我们从此可以知道,c新开辟一个地址并进行存贮,这就保证了String类的安全性,相反StringBuilder就存在安全隐患
package cn.yqg.day3;
public class Test2 {
public static void main(String[] args) {
StringBuilder s=new StringBuilder("ppp");
StringBuilder r=s;
r.append("kkk");
System.out.println(r);
System.out.println(s);
}
}
运行结果:
pppkkk
pppkkk
r改变会导致s也改变,因为他们指向得内存地址一样。
------------------------------------------------------------------------------------------------------------------------------------------------------
final修饰的变量引用不能变还是对象不可变的更多相关文章
- final修饰的变量是引用不能变还是对象的内容不能变?
int a=1;此时a是变量: StringBuffer a=new StringBuffer();此时a就是引用变量,可以说是a引用String对象,通过a来操作String 对象 final St ...
- Java中Final修饰一个变量时,是引用不能变还是引用的对象不能变
Java中,使用Final修饰一个变量,是引用不能变,还是引用对象不能变? 是引用对象的地址不能变,引用变量所指的对象的内容可以改变. final变量永远指向这个对象,是一个常量指针,而不是指向常量的 ...
- final修饰的变量是引用不能改变还是引用的对象不能改变
我们都知道final修饰变量时 会变为常量,但是使 用final关键字修饰一个变量时,是引用不能变,还是引用的对象不能变? 下面让我们来看这段代码: /** * 验证final修饰的变量是引用不能变, ...
- 浅谈final修饰的变量
一直大概的知道final关键字的作用,但是自己实际工作中却很少用,除非在声明一些常量值的时候,今天忽然自己在项目中用一个map进行存储一些值.一开始我只是用private修饰的,心里想的是如果fina ...
- 并不是static final 修饰的变量都是编译期常量
见代码 public class Test { public static void main(String[] args){ // 情况一 基本数据类型 //System.out.println(O ...
- (转)final修饰基本类型和引用类型变量的区别
原文:http://blog.csdn.net/linhao19891124/article/details/52971045 当使用final修饰基本类型变量时,不能对基本类型变量重新赋值,因此基本 ...
- final修饰的变量是引用不能改变,还是引用的对象不能改变???
对于这个问题,我们不能只记结论,要拿实例说话,参看以下代码: public class Demo { public static void main(String[] args) { final St ...
- java基础 final 修饰成员变量 只能赋值一次问题
final int a; public Fu(){ a=1; }
- static、final修饰的变量和方法能否被继承的问题
首先定义父类和子类 public class Parent { protected static String a = "static"; final String b = &qu ...
随机推荐
- 使用TCP的协议有哪些?使用UDP的协议有哪些?
运行于TCP协议之上的协议: HTTP协议:超文本传输协议,用于普通浏览 HTTPS协议:安全超文本传输协议,身披SSL外衣的HTTP协议 FTP协议:文件传输协议,用于文件传输 POP3协议:邮局协 ...
- Worker Thread模式
工人线程Worker thread会逐个取回工作并进行处理,当所有工作全部完成后,工人线程会等待新的工作到来 5个工人线程从传送带取数据,3个传送工人线程将数据放入传送带 public class C ...
- 图片url地址的生成获取方法
在写博客插入图片时,许多时候需要提供图片的url地址.作为菜鸡的我,自然是一脸懵逼.那么什么是所谓的url地址呢?又该如何获取图片的url地址呢? 首先来看一下度娘对url地址的解释:url是统一资源 ...
- Spring MVC异常处理代码完整实例
Spring MVC异常处理流程: 提供构造方法传值: 配置异常处理器的bean
- 方法2:使用Jenkins构建Docker镜像 --SpringCloud
前提意义: SpringCloud微服务里包含多个文件夹,拉取仓库的所有代码,然后过根据选项参数使用maven编译打包指定目录的jar,然后再根据这个目录的Dockerfile文件制作Docker镜像 ...
- JavaJDK多任务执行框架(六)
class Temp extends Thread { public void run() { System.out.println("run"); } } public clas ...
- 【转载】Sqlserver在创建表的时候如何定义自增量Id
在Sqlserver创建表的过程中,有时候需要为表指定一个自增量Id,其实Sqlserver和Mysql等数据库都支持设置自增量Id字段,允许设置自增量Id的标识种子和标识自增量,标识种子代表初始自增 ...
- jmeter中assertion的使用
用于检查测试中得到的响应数据等是否符合预期,用以保证性能测试过程中的数据交互与预期一致. 最新版本的3.0jmeter中有13种不同的断言: 1)BeanShell断言:针对sampler中的Bean ...
- Math对象的一些方法
ceil(n) 返回n向上取整的最近的整数floor(n) 返回n向下取整到最近的整数max(a,b,c...) 返回最大值min(a,b,c...) 返回最小值round(n) 返回n四舍五入的最近 ...
- web前端布局HTML+CSS
1.W3C标准 万维网联盟(外语缩写:W3C)标准不是某一个标准,而是一系列标准的集合.网页主要由三部分组成:结构(Structure).表现(Presentation)和行为(Behavior).万 ...