首页 > 试题广场 >

指出下列程序运行的结果

[单选题]
指出下来程序运行的结果是
  • good and abc
  • good and gbc
  • tst ok and abc
  • tst ok and gbc
**,掉坑里去了,String类型一旦被定义不可更改,每次对其操作都相当于新建了个对象
发表于 2018-09-03 14:31:14 回复(0)
更多回答
推荐
B.
实参和形参的问题。"ex.change(ex.str, ex.ch)"语句调用"change"方法时,将ex.str变量(实参)的赋给了"change"方法中的str变量(形参),而将ex.ch(实参)的地址赋给了"change"方法中的ch(形参)。"change"方法运行时,第一条语句改变的是方法中形参的值,对实参没影响,第二条语句由于是直接改变的ch所指地址的值,所以把实参也进行了改变。
编辑于 2017-03-19 20:03:50 回复(8)
感觉楼上答的都不痛不痒,我从内存模型分析下,这道题从内存模型上可以这样分析:

内存分析:

 

首先主线程调用main方法,在主线程栈中main方法执行,main方法对应的栈帧(一个线程一个栈,一个方法一个栈帧)入栈。

1)当代码执行到

Example ex = new Example();

 

这条语句时,内存模型如下图:

解释:ex作为对象引用保存在栈帧内的局部变量表内,指向在堆中的对象实例,而该对象内的成员str、ch分别指向堆中分配的另外两个对象实例(new String(“good”)、以及数组,数组和对象实例在堆中分配)


2)当主线程代码执行到ex.change(ex.str, ex.ch);这段代码,change方法执行,对应栈帧在主线程栈内入栈,方法内的局部变量存放在栈帧的局部变量表内。

该语句执行时,内存模型如下图:

解释:

Change方法的传入的值

 

本质上都是字符数组和good的对象实例在堆中的地址,因此change方法内的局部变量ch、str也是分别指向这两个地址,如上图栈帧2中所示。

当change方法内的语句执行完

str = "test ok";

ch[0] = 'g';

这两句时,内存模型如下图:

 

解释:

1,str = "test ok";

右边这种写法,会直接在运行时常量池内分配字符串“test ok”,并将该地址传递给栈帧2内的局部变量str。

自行百度:

String str = “test”;

String str = new String(“test”);

的区别。

2,ch[0] = 'g';

该语句表示将指向的数组对象的第一个字符内容改成’g’。

 

总结:

由于栈帧1的ex局部变量指向的对象内的成员str指向的对象没有任何变化,因此

System.out.println(ex.str+"and"); 依然打印结果为:good and

 

而成员ch指向的对象内容有所变化,因此

System.out.println(ex.ch);打印结果为:gbc

 

纯手打,望点赞。



发表于 2017-12-09 18:32:16 回复(42)
因为String是被final修饰的类,所以本身的内容是不会改变的,相当于基本数据类型的值传递,在changge方法中给str赋值了“test”,相当于重新创建了一个string类型的变量
发表于 2017-02-19 08:37:35 回复(8)
总结一句话:就数组能改值,剩下全都相当于新建了一个新变量
发表于 2018-09-21 11:12:06 回复(2)
值传递和引用传递 基本数据类型都是值传递 类,数组,接口是引用传递 由于String对象本身的特殊性,导致它值传递的特征
发表于 2018-02-07 07:25:53 回复(0)
发表于 2020-11-08 00:00:46 回复(2)
因为String是被final修饰的类,所以本身的内容是不会改变的,相当于基本数据类型的值传递,在changge方法中给str赋值了“test”,相当于重新创建了一个string类型的变量
发表于 2017-07-23 00:39:24 回复(0)
String 在new后会在堆新建一个地址,并且由于final修饰了方法,地址本身值无法改变,所以在重新赋值后,会新开辟地址并存放修改后的内容,这里在调用时相当于change 方法中str指向了main 中str的地址,改变后只有change方法中的str改变了指向地址,main方法中str并没有改变指向,所以值没有发生变化. (个人见解,欢迎大神指正)
发表于 2019-06-18 10:16:52 回复(0)
www.cnblogs.com/woshimrf/p/5263018.html
java所有的参数传递都是传递的副本,变量所代表的值的副本!
发表于 2017-07-24 13:18:57 回复(0)
实参:如果是基本类型或者String,则实参不会变(传的是值); 如果是对象集合或者数组,则实参会改变(传的是引用)。
发表于 2019-07-20 10:25:18 回复(1)
String类型虽然是引用类型,但是却进行值传递。
发表于 2018-02-18 10:39:13 回复(1)

实参,形参"ex.change(ex.str, ex.ch)"语句调用"change"方法时,将ex.str变量(实参)的赋给了"change"方法中的str变量(形参),而将ex.ch(实参)的地址赋给了"change"方法中的ch(形参)。"change"方法运行时,第一条语句改变的是方法中形参的值,对实参没影响,第二条语句由于是直接改变的ch所指地址的值,所以把实参也进行了改变。
发表于 2017-02-27 17:01:47 回复(0)
java中虽然没有明确指出有指针传递这一传递方式(Java中咩有指针)但是实际上却是充斥这指针的!传递的是地址还是值,这一点很重要!
发表于 2017-08-18 17:09:24 回复(0)
java中可以明确的是只有值传递。
不论参数的是基本类型还是引用类型,传递的都是原数据的一个副本,那么既然是值传递,为什么参数传递到方法后,原来的数据也改变了呢?这是因为,java传递的的确是原来数据的一个副本,但是这个副本和原始数据指向的是同一个对象,change方法修改的是副本指向的对象的属性,因此原始数据的值也就发生了改变,如果change方法改变的是副本本身而不是原始数据指向的对象,原始数据就不会发生改变。
发表于 2021-08-11 16:11:42 回复(0)
如果在change()方法中将str="test ok";改成this.str = "test ok";就不一样了。
发表于 2017-11-28 10:44:13 回复(1)
String的不变性
发表于 2017-01-08 17:43:15 回复(0)
String是不可变类,如需改变值,必须新建(内存开辟新的地址来存),字符数组是可变的,改变值就是改变的同一份变量,改变后的值比对后选B是对的。
发表于 2021-05-09 10:39:00 回复(0)
java版本1.11,通过测试代码算是摸清楚了。 demo.change(,)方法中传的两个都是引用,然后把引用赋值给了方法的两个形参。 在java中形参就是局部变量,str作为局部变量接受了"test ok"的地址值之后,与原来传入的"hello"地址值断开连接,两者之间再没有联系(改变的是局部变量的引用,而且str没有返回新的地址值的途径) 至于ch,获得的地址从未变过,所以修改会对原来的数组产生影响。可以试试给ch new一个新的字符数组,你会发现这种操作并不能改变原字符数组的值,原理同上(局部变量不过是换了个引用,已经与原引用断开连接)
发表于 2021-03-30 17:21:25 回复(0)
字符串传的是值,字符数组传的是地址
发表于 2018-12-13 12:21:52 回复(1)
String内部是被final给修饰的 本身是不会改变的 这里可以看作基本数据类型的值传递
只是改变change方法中的str指向的内存地址 不改变main里的内存地址
第二个 由于是传递的是内存地址 直接改变
发表于 2023-08-22 02:35:11 回复(0)
String 是 值传递
数组 是 引用传递
发表于 2022-09-26 17:08:01 回复(0)