你是否真的理解 final关键字 在堆内存中的变化

java面试题网站:www.javaoffers.com

基础知识大家都知道,final可以用在类上,则该类不能被继承,final用在成员变量上则必须给定一个终量,final在方法上不能被重写。这里我要说的事final在类上和不在类上的区别。很简单看例子

代码:

public class NUllTest {

public static void main(String[] args) {

        ElecUser user = new ElecUser(); //ElecUser 类没有final修饰
        user.setName("gg");
        
        ElecUser user2 = user;
        
        System.out.println(user.getName());//输出 gg

        System.out.println(user2.getName());//输出gg

        user.setName("jj")

        System.out.println(user.getName());//输出 jj

        System.out.println(user2.getName());//输出jj

总结:

普通类(没有被final修饰的类)对象,被n个变量(没有用final修饰)引用时,如过这个对象的属性发生改变,

        则n个变量所对应的对象属性也会发生改变,因为他们在堆内存中指向的是同一块内存对象。


        user = null;
       // System.out.println(user.getName());//这里不能输出

        System.out.println(user2.getName());//输出jj

总结:

      user = null; 在堆内存中的意思是,user变量不在指向原来的对象内存,而user2变量任然还在指向那块内存。

     所以null是让变量与堆内存中的对象断开链接地址。对原对象没有影响。并且null也不会再堆内存中重新开辟空间。

       

//-----------------------------测试String类(该类用final修饰)-------------------------------

   String str = new String("fdsa");
   String str2 = str;
   System.out.println(str.hashCode());//输出3138444
   System.out.println(str2.hashCode());//输出3138444
   
   str = "fdaa";//为str重新链接一个堆对象,而str2依然链接 原来的对象,不会受影响。
   System.out.println(str.hashCode());//输出3137886

   System.out.println(str2.hashCode());//输出313844

}

}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值