错题分析two

本文探讨了Java中String对象和char数组的交互。在main方法中,创建了一个String对象和一个字符数组,并通过change方法尝试修改它们的值。然而,由于String对象是不可变的,change方法内部对str的修改并未影响全局的str。相反,字符数组的修改成功,第一个元素被更改为'g'。因此,最终输出为'goodandgbc'。
摘要由CSDN通过智能技术生成
public class Example{
    String str = new String("good");
    char[ ] ch = { 'a' , 'b' , 'c' };
    public static void main(String args[]){
        Example ex = new Example();
        ex.change(ex.str,ex.ch);
        System.out.print(ex.str + " and ");
        System.out.print(ex.ch);
    }
    public void change(String str,char ch[ ]){
        str = "test ok";
        ch[0] = 'g';
    }
}

A:good and abc

B:good and gbc

C:test ok and abc

D:test ok and gbc

首先我们都知道 String 和char[]都是引用数据类型,他们都会在栈中存放地址,在堆中存放的是具体的值,由栈中的值指向具体的地址。

现在我们来看题,我们现在先假设ex.str地址为0x110,它指向的是“good”,ex.char[]的地址为0x111,指向的是{‘a’,'b','c'}。现在我们通过change方法,将我们的str的值赋给了change中的局部变量str,(这个是局部变量和前面的str有区别,那个是全局变量,并不是同一个)所以它现在还是指向“good”,它的地址也是0x110,现在通过代码将局部str等于“test ok”,所以说会在堆中重新付一个值给str,即局部str的地址会修改,假设变成0x1100,指向test ok。但我们此时全局的str的地址并没有修改,还是指向“good”。再看ch,这个全局变量的ch会将值也会付给局部变量的ch,现在我们通过坐标索引改变它的值,这里记住我们是改变它的值,并没有重新赋值给他。所以堆中的{‘a’,'b','c'}就会变成{‘g’,'b','c'},此时我们全局变量的ch还是指向这个值的,所以我们的输出结果就为good and gbc。如图:

 

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值