今天在牛客刷到一道题,主要涉及的知识点是:
String变量 a 作为参数传递时,会产生一个指向堆中相同字符串的副本变量 b ,在方法内的所有操作都是对 b 引用的操作,并不会改变原引用 a 。
原题如下:
指出下列程序运行的结果:
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.println(ex.str + " and ");
System.out.println(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
详解:
题目中的形参str只是原引用ex.str的一个副本,传的是一个副本地址值,这个值与ex.str地址值是不一样的,但是它们同时指向了堆中的对象 new String(“good”) ,当你在方法中改变形参也就是地址的副本值,也就是这句 str = “test ok” ,只是将副本地址指向常量"test ok",并没有改变原ex.str的指向方向,它还是指向对象new String(“good”)。