首页 > 试题广场 >

下列java程序的输出结果为____。

[单选题]
下列java程序的输出结果为____。
public class Example{
    String str=new String("hello");
    char[]ch={'a','b'};
    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]='c';
    }
}
  • hello and ab
  • hello and cb
  • hello and a
  • test ok and ab
  • test ok and cb
  • test ok and c
编辑于 2016-09-07 23:19:56 回复(88)
String类是final类型的,不能继承和修改这个类。str=“tesk ok”,其实是隐含的让Java生成一个新的String对象,那么就与原来的“Hello”没有任何关系,当函数结束,str作用结束,所以输出的还是“Hello”。 char ch[] 是传递引用,修改了原内容。
发表于 2015-08-27 22:09:11 回复(19)
画内存图
左侧为栈,右侧为堆


发表于 2015-09-09 16:14:40 回复(8)
经多方面查找,String很奇特,虽然是引用数据类型,但是采用的却是值传递!!!基本数据类型采用的都是值传递,数组和对象都是引用传递(数组可以按照对象来算),值传递不会改变本身,只是传递拷贝,而引用传动却会改变本身!!!str属于值传递,不会改变!char[] 属于引用传递,所以改变本身值!
发表于 2016-06-28 20:59:17 回复(6)
永远记得,数组和对象都是传引用。
发表于 2015-09-01 10:25:13 回复(5)
实际上change(String str,charch[])这里接受的两个参数(注意都是局部变量)都是引用。但是在函数内部对它们的处理不同。 str 在刚开始初始化时引用"hello",但是在执行str="test ok";之后 java 又创建了字符串对象"test ok",并且让str指向这个对象,函数调用完成之后,str被销毁,与"hello"没有关系; chch被初始化为ex.ch之后,ch[0]='c';执行之后 通过ch的引用访问了字符数组{'a','b'}并修改为{'c','b'}. 首先应该明白String类是不可改变类,String str=“123” ; str=“1”;并不是覆盖而是新建一个内存空间,然后指向它。 其次,String类的内部实现时char[] ,传参数时会执行拆封,降为基本类型,相当于值传递。
编辑于 2016-03-15 09:33:39 回复(1)
首先str指向hello,ch指向ab,调用change方法时,str的引用传给了形参str,是引用传递,虽然该形参指向test ok,但并没有改变原引用的内容。而ch将值传给形参ch,为值传递,并且该数组的第一个指针指向c,改变了原值。
发表于 2015-08-27 20:02:22 回复(2)
首先应该明白String类是不可改变类,String str=“123” ; str=“1”;并不是覆盖而是新建一个内存空间,然后指向它。
其次,String类的内部实现时char[] ,传参数时会执行拆封,降为基本类型,相当于值传递。
发表于 2015-11-09 20:29:40 回复(1)
我觉得针对这个题目这样子理解更加好:首先传值过来的参数String str的变量名称和类成员变量冲突了,所以str="test ok"这个赋值是传过来的变量值,如果改成this.str=“test ok”,则结果就是test ok了
发表于 2017-06-20 11:12:12 回复(0)
B
基本数据类型和String类型都是值传递,数组,对象等是引用传递
发表于 2015-09-08 16:37:53 回复(0)
选B
change第一个函数传递的不是string的引用,所以不会改变值,第二个参数会退化为指针,所以改变传入参数的值,第一个string不变为hello,第二个改变第一个字符,为cb,所以答案为B
发表于 2015-08-25 09:52:33 回复(0)
很简单一件事儿说的那么复杂 之所以会出错 主要是方法参数都是引用 但是注意 方法体中 第一句是引用划等号 第二句是赋值 下面说String是final类的自己都没搞清楚final是啥意思 字符串abcd是final 不代表String就是final 还有说常量池的 也只说对了一半new出来的字符串堆中也有 是从常量池copy的
发表于 2017-05-20 23:11:12 回复(1)
char ch[] 是传递引用,修改了原内容
发表于 2015-09-17 19:59:06 回复(0)
选B。
考虑内存中各个变量的变化:
开始 str 指向 “hello”;ch指向{'a','b'};
进入change函数后,生成两个临时变量str,ch,他俩和函数外的两个变量指向同样的地方。接着函数把str指向了“test ok”,修改了ch[0]的值。
发表于 2015-08-26 22:41:01 回复(0)
实际上change(String str,charch[])这里接受的两个参数(注意都是局部变量)都是引用。但是在函数内部对它们的处理不同。
str 在刚开始初始化时引用"hello",但是在执行str="test ok";之后 java 又创建了字符串对象"test ok",并且让str指向这个对象,函数调用完成之后,str被销毁,与"hello"没有关系;
chch被初始化为ex.ch之后,ch[0]='c';执行之后 通过ch的引用访问了字符数组{'a','b'}并修改为{'c','b'}.
发表于 2015-12-12 21:32:50 回复(0)
选B
先说一下,String这是个不可变类,所以方法中对String的变化,肯定不会影响实际参数的值。
再说一下,数组是个引用类型,可不是值传递。
发表于 2018-06-28 10:01:11 回复(0)
初学者很容易选e
发表于 2016-05-18 01:22:29 回复(0)
e
发表于 2015-08-24 20:44:57 回复(1)
String作为值传递
发表于 2022-01-30 23:17:22 回复(0)