两种情况:如果是基本数据类型,被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修饰的变量引用不能变还是对象不可变的更多相关文章

  1. final修饰的变量是引用不能变还是对象的内容不能变?

    int a=1;此时a是变量: StringBuffer a=new StringBuffer();此时a就是引用变量,可以说是a引用String对象,通过a来操作String 对象 final St ...

  2. Java中Final修饰一个变量时,是引用不能变还是引用的对象不能变

    Java中,使用Final修饰一个变量,是引用不能变,还是引用对象不能变? 是引用对象的地址不能变,引用变量所指的对象的内容可以改变. final变量永远指向这个对象,是一个常量指针,而不是指向常量的 ...

  3. final修饰的变量是引用不能改变还是引用的对象不能改变

    我们都知道final修饰变量时 会变为常量,但是使 用final关键字修饰一个变量时,是引用不能变,还是引用的对象不能变? 下面让我们来看这段代码: /** * 验证final修饰的变量是引用不能变, ...

  4. 浅谈final修饰的变量

    一直大概的知道final关键字的作用,但是自己实际工作中却很少用,除非在声明一些常量值的时候,今天忽然自己在项目中用一个map进行存储一些值.一开始我只是用private修饰的,心里想的是如果fina ...

  5. 并不是static final 修饰的变量都是编译期常量

    见代码 public class Test { public static void main(String[] args){ // 情况一 基本数据类型 //System.out.println(O ...

  6. (转)final修饰基本类型和引用类型变量的区别

    原文:http://blog.csdn.net/linhao19891124/article/details/52971045 当使用final修饰基本类型变量时,不能对基本类型变量重新赋值,因此基本 ...

  7. final修饰的变量是引用不能改变,还是引用的对象不能改变???

    对于这个问题,我们不能只记结论,要拿实例说话,参看以下代码: public class Demo { public static void main(String[] args) { final St ...

  8. java基础 final 修饰成员变量 只能赋值一次问题

    final int a; public Fu(){ a=1; }

  9. static、final修饰的变量和方法能否被继承的问题

    首先定义父类和子类 public class Parent { protected static String a = "static"; final String b = &qu ...

随机推荐

  1. linux中安装python3.7

    linux中安装python3.7 1. 安装依赖包 yum -y install zlib-devel bzip2-devel openssl-devel ncurses-devel sqlite- ...

  2. 使用命令进行Apache Kafka操作

    1.目标 我们可以在Kafka集群上执行几个Apache Kafka Operations .因此,在本文中,我们将详细讨论所有Apache Kafka操作.它还包括有助于实现这些Kafka操作的命令 ...

  3. Linux删除含有特殊符号文件名的文件

    1. 文件名含有特殊字符,直接使用 rm 可能删除不了,可以使用如下方法: 1) 使用 ls -i 查处该文件的 inode 号,假设为123    2) 使用find命令删除: rm `find . ...

  4. UOJ348 WC2018 州区划分 状压DP、欧拉回路、子集卷积

    传送门 应该都会判欧拉回路吧(雾 考虑状压DP:设\(W_i\)表示集合\(i\)的点的权值和,\(route_i\)表示点集\(i\)的导出子图中是否存在欧拉回路,\(f_i\)表示前若干个城市包含 ...

  5. Oracle中的dual表简介

    dual是一个虚拟表,用来构成select的语法规则,oracle保证dual里面永远只有一条记录.我们可以用它来做很多事情,如下: 1.查看当前用户,可以在 SQL Plus中执行下面语句 sql代 ...

  6. [高清·非影印] 深度学习入门:基于Python的理论与实现 + 源代码

    ------ 郑重声明 --------- 资源来自网络,纯粹共享交流, 如果喜欢,请您务必支持正版!! --------------------------------------------- 下 ...

  7. 查看线程CPU利用率

    查看线程CPU利用率 方法1:利用ps命令查看对应的线程 1. ps -ef | grep 进程名称 2. ps -mp 进程ID -o THREAD,pid,tid,cmd,time,%cpu,%m ...

  8. Springboot 之 静态资源路径配置

    1.静态资源路径是指系统可以直接访问的路径,且路径下的所有文件均可被用户通过浏览器直接读取. 2.在Springboot中默认的静态资源路径有:classpath:/META-INF/resource ...

  9. 支付宝支付回调方法RSA2验签失败处理方法

    支付宝支付签名方式RSA2生成支付时使用的是支付宝公钥和应用私钥, 而不是应用公钥,支付宝公钥的生成是根据上传应用公钥而变动的, 所以在做回调的时候参数ALIPAY_PUBLIC_KEY也需要传支付宝 ...

  10. Window 使用Nginx 部署 Vue 并把nginx设为windows服务开机自动启动

    1.编译打包Vue项目 在终端输入 npm run build 进行打包编译.等待... 打包完成生成dist文件夹,这就是打包完成的文件. 我们先放着,进行下一步. 2下载Nginx 下载地址: h ...