Java中String类型是引用数据类型么?

Java中String类型是引用数据类型么?

String s="123"; 这个变量s是个引用变量么?如果是那是不是里面存了个地址?

请看下面这段代码:

package temptest;
public class Test5 {
     public void exchange(String a) {
         a="112233";
    }
     public static void main(String[] args) {
        String s="123";
        Test5 t=new Test5();
        t.exchange(s);
        System.out.println(s);
        }
}

为什么s还是"123"啊?

正在回答

登陆购买课程后可参与讨论,去登陆

2回答
public class Main {
    public static void main(String[] args) {
        int n = 100; // 定义变量n,同时赋值为100
        System.out.println("n = " + n); // 打印n的值

        n = 200; // 变量n赋值为200
        System.out.println("n = " + n); // 打印n的值

        int x = n; // 变量x赋值为n(n的值为200,因此赋值后x的值也是200)
        System.out.println("x = " + x); // 打印x的值

        x = x + 100; // 变量x赋值为x+100(x的值为200,因此赋值后x的值是200+100=300)
        System.out.println("x = " + x); // 打印x的值
        System.out.println("n = " + n); // 再次打印n的值,n应该是200还是300?
   }
}

我们一行一行地分析代码执行流程:

执行int n = 100;,该语句定义了变量n,同时赋值为100,因此,JVM在内存中为变量n分配一个“存储单元”,填入值100:

http://img1.sycdn.imooc.com//climg/5e86e2ca096e515102220081.jpg

执行n = 200;时,JVM把200写入变量n的存储单元,因此,原有的值被覆盖,现在n的值为200:

http://img1.sycdn.imooc.com//climg/5e86e2da0981392102210079.jpg

执行int x = n;时,定义了一个新的变量x,同时对x赋值,因此,JVM需要新分配一个存储单元给变量x,并写入和变量n一样的值,结果是变量x的值也变为200:

http://img1.sycdn.imooc.com//climg/5e86e2ec096687ce02150093.jpg

执行x = x + 100;时,JVM首先计算等式右边的值x + 100,结果为300(因为此刻x的值为200),然后,将结果300写入x的存储单元,因此,变量x最终的值变为300:

http://img1.sycdn.imooc.com//climg/5e86e30b0924dc2202190094.jpg

可见,变量可以反复赋值。注意,等号=是赋值语句,不是数学意义上的相等,否则无法解释x = x + 100。


  • 慕容2892559 提问者 #1
    ???没有回答我在问什么啊
    2020-04-03 15:21:56
  • 苍星乱舞 回复 提问者 慕容2892559 #2
    给你捋一下,针对你的问题就是,引用类型相当于指向一个容器(对象),现在有两个东西一个引用,一个容器(对象)对吧。那要修改就有两种情况,一种是对这个引用进行修改,这个引用指向别的容器了。另一个是容器里的东西被修改了。 你的代码里,刚开始s指向“123”,接着在传参时a也指向了"123",后来a指向了"112233"。那和s有什么关系呢?s还是指向"123"啊,所以输出还是123.
    2020-04-03 15:29:27
  • 慕容2892559 提问者 回复 苍星乱舞 #3
    是这样的,其实我的疑问是关于引用类型的传值问题。观看了课程之后,数组传值传了第一个元素的地址,所以在方法里可以修改数组,然后主方法里的数组也变了。那String不也是引用数据类型么?String s="123"; 在栈中分配空间(命名为引用变量s),堆中创建对象存"123",把这个对象的地址存储在s中。那t.exchange(s); 这句到底传了什么过去啊?
    2020-04-03 16:38:04
苍星乱舞 2020-04-03 15:20:14
public class Main {
    public static void main(String[] args) {
        String s = "hello";
        System.out.println(s); // 显示 hello
        s = "world";
        System.out.println(s); // 显示 world
    }
}

观察执行结果,难道字符串s变了吗?其实变的不是字符串,而是变量s的“指向”。

执行String s = "hello";时,JVM虚拟机先创建字符串"hello",然后,把字符串变量s指向它:

http://img1.sycdn.imooc.com//climg/5e86e39809cf3e7901910087.jpg

紧接着,执行s = "world";时,JVM虚拟机先创建字符串"world",然后,把字符串变量s指向它:

http://img1.sycdn.imooc.com//climg/5e86e3a509533c3b03220099.jpg

原来的字符串"hello"还在,只是我们无法通过变量s访问它而已。因此,字符串的不可变是指字符串内容不可变。


问题已解决,确定采纳
还有疑问,暂不采纳

恭喜解决一个难题,获得1积分~

来为老师/同学的回答评分吧

0 星
请稍等 ...
意见反馈 帮助中心 APP下载
官方微信

在线咨询

领取优惠

免费试听

领取大纲

扫描二维码,添加
你的专属老师