面试题-值传递和String类变量

面试题的个人理解-对于String类的理解以及值传递

首先我们看看如下代码
public class StringTest1 {
    static String str = new String("good");
    char[] ch = {'t','a'};

    public void change(String str,char ch[]){ //这里str是个变量
        //由于str被final修饰,所以不可改变
        str  = "hello";//这里无法修改上面的str
        ch[0] = 'a';
    }

    public static void main(String[] args) {
        StringTest1 s1 = new StringTest1();
        //
        s1.change(s1.str,s1.ch);
        System.out.println(s1.str);//good
        str  = "hello";
        System.out.println(str);
        System.out.println(s1.ch);
    }
}

   首先在堆空间中new了一个静态String类变量str,和一个char类型数组ch。
我们定义了一个方法change,用来改变变量值,在主函数中我们在堆中实例化StringTest1对象,调用方法。
   在调用change方法后,我们输出s1.ch,输出为aa,这里是因为我们将ch传入方法后,ch[0]指向的地址值与一开始定义的ch地址值相同,所以我们输出后,ch内被改变为aa。
而当我们在调用change后输出s1.str后,值仍为good,并未改变。
    首先,我们在开始定义str时是在堆空间中new了一个String类对象,此对象指向常量池中的good,我们在change方法中将str作为参数传进去后赋值hello,此时hello在常量池中被创建,指向堆空间中新的对象后指向方法中的str,所以当我们输出时仍为good。而之后我们在主函数中的hello已经在常量池中被创建,所以直接将hello指向成员变量str,所以输出str为hello。
至此本博客仅为学习过程中的个人理解,后续学习更深后会重新理解。。。如有错误请指出

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值