java给变量赋值_Java 如何引用变量赋值?

书上描述的事情是对的,但例子举的不好。

首先你得区分jdk的版本,jdk8及以上是不对的。以下版本我也没试过,你可以自己尝试或者看看书里有没有说运行环境信息。

Java内存确实区分为堆和栈,还有一些其他的。要是对Java运行内存感兴趣,可以单独去研究这部分,这里不在展开,不然就太大了。

堆区,存一些对象,包括数组。你这里就是把string当做对象看,它应该在这里存储

栈区,存一些局部变量,比如方法里定义的int,double等基本数据类型。注意一定是局部变量,而不是说基本数据类型就存在栈里。这点要搞明白。如果实在觉得难以理解,也可以当做,在你main方法里所有的基础数据类型都在栈里,对象类型都在堆里

然后重点来了,书中所说的引用,就是对象类型,对象存在堆里。你的变量a实际就是指针,指向了堆。变量b和a一样,也指向了同一个地方。这时候,你修改a也就是修改b。

举个例子:

String []a = {"1","2"};

String []b = a;

a[1] = "5";

for (String s: a) {

System.out.print(s+" ");

}

System.out.println();

System.out.println("=========分割==========");

for (String s: b) {

System.out.print(s+" ");

}

结果:

但是string不一样。String不仅仅是对象了,他有点特殊。

String类的intern()方法:一个初始为空的字符串池,它由类String独自维护。当调用 intern方法时,如果池已经包含一个等于此String对象的字符串(用equals(oject)方法确定),则返回池中的字符串。否则,将此String对象添加到池中,并返回此String对象的引用。

什么意思呢,举个例子:

String a = "123";

采用字面值的方式创建一个字符串时,JVM首先会去字符串池中查找是否存在"123"这个对象,如果不存在,则在字符串池中创建"123"这个对象,然后将池中"123"这个对象的引用地址返回给"123"对象的引用a,这样a会指向池中"123"这个字符串对象。

然后

String b = "123";

//或者

b = a;

这里b不管是直接等于 “123”还是 b=a,实际上,b和a指向的是一个地址,都是一样的。

但这时,b = “456”,那么,又会进行上面的步骤,先查找是否存在“456”这个对象,如果不存在,则在字符串池中创建“456”这个对象,然后将引用地址返回给引用b,b就会指向池中“456”这个字符串对象。

所以,在实际中,结果会是不一样的,就像你运行的结果那样。

当然,String的内容还有,这里也不展开说了,感兴趣自己百度搜搜也一堆

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值