首页 > 试题广场 >

指出以下程序运行的结果是 public class Exam

[单选题]
指出以下程序运行的结果是
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';
    }
}
  • good and abc
  • good and gbc
  • test ok and abc
  • test ok and gbc
推荐
由于String不可变,故当执行change方法时候,str的地址会指向“test  ok”,但是当执行完以后,依旧会输出原来地址指向的“good”,而char类型是可变的   故选择B
编辑于 2017-03-19 20:02:33 回复(3)

这道题我做了很多遍了,软件有问题啊

发表于 2018-07-30 13:55:54 回复(2)
没有正确答案吧。。。 输出是good and 一个地址。。。
发表于 2017-05-09 12:47:35 回复(2)
String类型是final的不可改变故 下面还是输入的是good
发表于 2017-02-23 15:18:58 回复(0)
注意:
1、java语言参数之间只有值传递,包括按值调用和按引用调用。 一个方法可以修改传递引用所对应的变量值,而不能修改传递值调用所对应的变量值。
按值调用:包括八大基本数据类型都是按值调用。传值的时候,也就是说方法得到的是所有参数值的一个拷贝。
按引用调用:数组、对象。传值时候,传递的是引用地址的拷贝,但是都是指向同一个对象。
2、String是不可变类(final and Immutable),这里只是把副本的指向修改成指向“test ok”,原地址str的指向的值没有发生改变。
发表于 2017-02-26 22:36:00 回复(6)

Java中,每一个new语句返回的都是一个指针的引用,只不过在大多数情况下Java不关心如何操作这个指针,唯一需要注意的是在给函数传递对象的时候

传值和引用中有静态变量,私有变量,clone等问题,对于基本数据类型和对象变量,存在不一样的操作:

  • 基本类型变量:传递的副本(副本变,本身不变)
  • 对象变量:传递引用的副本(副本变,本身也变)【即复制指向地址的指针】

    不论Java参数的类型是什么,一律传递的都是参数的副本

在Java中存在一个比较特殊的类型,String,也是对象型变量,只不过String是一个非可变类,使得值传递和引用传递没有区别

发表于 2017-07-04 19:49:50 回复(2)
change()方法中传入的第一个参数为值传递,意味着在方法体内创建了一个局部变量str,其初始值为good,因此str="test ok",只是使这个局部变量指向了新的字符串"test ok",不会影响原来的str的值,而change()方法中传入的第二个参数为引用传递,将ch指向的地址传了进去,因此ch[0] = g;语句会将位于ch所指向地址的数组的第一项进行改变
发表于 2017-01-12 21:29:37 回复(0)

一群瞎说的,根本没有抓住要点,这是java 不是C语言,我们是是没法对单个内存地址操作的。

Java里的形参本质上都是浅复制,也就是行参copy了一份地址,相当于行参配了一把钥匙,通过这把钥匙来访问实际参数指向的房子,实际参数也是钥匙,这点要理解。

这题的本质不在于String,你换一个Object结果不会有任何改变,在方法里面对String的操作可以看作新建了一个和原来完全无关的房子,把行参的老钥匙重新改造成了这个新房子的钥匙,钥匙的改变不会对老房子,也就是实参的任何结果,除非你返回,也就是把原来的实参的钥匙改变了。而哪怕是这个操作也不会对老房子造成任何操作,只是现在没有钥匙能进入老房子了,老房子会被GC拆了回收而已。

而char里面改变的是他所有的属性,就相当于进了房子,换了个台灯,房子依然还是还是原来的房子。

发表于 2019-07-26 21:17:18 回复(4)

B

ex.change(ex.str, ex.ch)相当于

String str = ex.str; char ch[] = ex.ch; str是值传递,ch[]是引用传递,值传递的修改不会影响原来的值,引用传递会

发表于 2017-04-03 15:33:48 回复(0)
1⃣️、传值是传递了值对应的变量的副本,该副本被赋予新值并暂存于常量池中,在方法调用结束后就会被释放,原来地址中存放的数值并没有被改变,所以方法调用结束后,该变量任然是原来地址中的值。 2⃣️、传引用是传递原变量的地址的副本,由于有新值被付给该副本地址,而一个地址对应一个数值,所以副本地址中的值被改变,而对象的地址是在堆中的,通过栈中的引用来操作,不会像变量那样被释放,所以方法调用结束后原地址中的值被新值取代。 3⃣️、String虽然是对象引用,但比较特殊,规定其引用是不可变的。
发表于 2018-05-24 15:52:14 回复(0)
基本数据类型的值传递是值;
引用数据类型的值传递是址。
发表于 2019-02-18 20:38:46 回复(0)
1、按值调用:包括八大基本数据类型都是按值调用。传值的时候,也就是说方法得到的是所有参数值的一个拷贝。
2、首先String的数据结构是,维护一个final char[]的数组,是不可变得
3、基本数据类型和包装类也是维护的 final int value
4、char []和arr[]是可以改变的传递的时候是。按引用调用:数组、对象。传值时候,传递的是引用地址的拷贝,但是都是指向同一个对象。
发表于 2018-08-06 08:12:02 回复(0)
始终记住一点,string的值传递和引用传递都不会引起实参的变化
发表于 2019-02-22 23:33:19 回复(0)
java中只有值传递,引用类型传递的是储存在引用中的引用值。普通的引用传递引用值后,通过引用对对象的操作会改变对象空间的值。但是String虽然是引用变量,但是String的final的,不可变。所以,此题的change()中不会改变堆中String的值,会在常量池中找是否有"test ok",有就指向,没有就在常量池中放入,在指向!
发表于 2017-03-31 19:14:02 回复(0)
string的类型需要新建一个对象存放字符串,是值传递,所以修改不会改变原来的值,字符是地址传递,所以修改了
发表于 2022-01-04 16:17:06 回复(0)
基本类型-值传递,引用类型-引用传递。引用类型有,数组,类,接口
发表于 2019-10-11 13:59:58 回复(0)
可以从形参和实参方面考虑
发表于 2019-06-21 08:47:40 回复(0)
当没有调用方式(即没有值传递的时候,是直接赋值。)
有值传递时,基本数据类型传递的是值,即把str中的值传递过去,指针指向了test ok这个值,但是其本身的地址不变,还是原值。
引用数据类型传递的是地址,改变值会发生改变。
发表于 2019-04-24 17:03:25 回复(0)
String不可变,char可变
发表于 2019-03-18 22:27:36 回复(0)
String是不可变常量
发表于 2019-01-11 07:33:28 回复(0)
java总是按值调用,方法中得到的是对参数值的一个拷贝,不能修改传递给它任何参数的内容,但如果通过对象提供的方法改变值,则这个对象的状态被改变了
编辑于 2018-12-21 20:01:22 回复(0)