黑马程序员技术交流社区

标题: 这里又搞了一个挺容易中招的题,认真看下啊,输出什么呢 [打印本页]

作者: 塞肥肥塞牙人    时间: 2014-9-3 11:54
标题: 这里又搞了一个挺容易中招的题,认真看下啊,输出什么呢
public static void main(String[] args){
                String s1 = “abc”;
                String s2 = “xyz”;
show(s1,s2);
System.out.println(s1+”-----”+s2);
}
static void show(String s1,String s2){
         s1 = s2+s1+”Q”;  
    s2 = “W”+s1;   
}

作者: 柳超    时间: 2014-9-3 11:58
abcxyzQ-----WabcxyzQ            
作者: bullfrog    时间: 2014-9-3 12:12
abc-----xyz
作者: 龙帅    时间: 2014-9-3 13:23
abc-----xyz    show函数并没有对主函数里的s1 s2产生赋值操作
作者: 王凯路路    时间: 2014-9-3 13:34
龙帅 发表于 2014-9-3 13:23
abc-----xyz    show函数并没有对主函数里的s1 s2产生赋值操作

没有进行赋值操作? 我给改了下你看看, 也没进行赋值操作
public static void main(String[] args) {
                String[] s1 = new String[]{"abc"};
                String s2 = "xyz";
                show(s1, s2);
                System.out.println(s1[0] + "-----" + s2);
        }

        static void show(String []s1, String s2) {
                s1[0] = s2 + s1[0] + "Q";
                s2 = "W" + s1;
        }
作者: 龙帅    时间: 2014-9-4 09:05
王凯路路 发表于 2014-9-3 13:34
没有进行赋值操作? 我给改了下你看看, 也没进行赋值操作
public static void main(String[] args) {
                St ...

好奇怪啊,好像对数组的操作就可以保存,变量就不行。

昨天我还发现,如果单独写一个交换变量的方法,是无法用来交换变量的。

请问这是怎么回事,我都一知半解的。。。
作者: OCTSJimmy    时间: 2014-9-4 09:16
龙帅 发表于 2014-9-4 09:05
好奇怪啊,好像对数组的操作就可以保存,变量就不行。

昨天我还发现,如果单独写一个交换变量的方法,是 ...

我理解了,原因是这样的:
1、字符串在内存中并不会被改变,假如对字符串变量赋值,改变的只是变量的指向。
2、字符串数组,数组中存储的都是指向对应字符串的引用地址。

由此可知:

楼主的帖子,对字符串s1做的任何操作由于没有回传,所以全部失去意义。因为被操作的并不是s1字符串,而是show函数中s1字符串的指向。

楼主的报纸中,对数组的操作,会产生效果,其原因同样如此。
比如毕老师的数组间的元素换位(交换),并没有返回值,但能起效果。

究其原因为,main函数将数组的引用地址给了show函数的s1,但指向的都是同一个数组对象,对同一个对象操作自然会影响对象本身。
作者: Java黑马    时间: 2014-9-4 09:22
字符串对象一旦创建就不可修改,shou()方法只是又生成了新的字符串对象,而且只是在方法内部起作用,是这样吗?
作者: 龙帅    时间: 2014-9-4 09:27
OCTSJimmy 发表于 2014-9-4 09:16
我理解了,原因是这样的:
1、字符串在内存中并不会被改变,假如对字符串变量赋值,改变的只是变量的指向 ...

感谢讲解,学到了
作者: 安茹黑马    时间: 2014-9-4 09:31
OCTSJimmy 发表于 2014-9-4 09:16
我理解了,原因是这样的:
1、字符串在内存中并不会被改变,假如对字符串变量赋值,改变的只是变量的指向 ...

如果交换时,只交换值,而不是交换数组,值类型是int型的,为什么会出现没法交换的现象?
作者: 黄小橙    时间: 2014-9-4 09:39
不注意很容易被坑啊,说明我还基础不够扎实{:3_66:}
作者: Darkhorse′Xa    时间: 2014-9-4 09:39
安茹黑马 发表于 2014-9-4 09:31
如果交换时,只交换值,而不是交换数组,值类型是int型的,为什么会出现没法交换的现象? ...

值类型和引用类型的问题,String是个特殊的引用类型.show方法当中s2跟main方法的s2不是同一个,重新为show方法创建了Wxyz这个对象对main方法当中的没有影响,s1是引用类型,show方法当中更改了s1数组当中的数据,main方法当中也会更改.你说的int类型是值类型,跟String是一样的.如果在swap方法当中交换了,是不会影响原先的值的
作者: 安茹黑马    时间: 2014-9-4 09:47
Darkhorse′Xa 发表于 2014-9-4 09:39
值类型和引用类型的问题,String是个特殊的引用类型.show方法当中s2跟main方法的s2不是同一个,重新为show ...

谢啦,学习了
作者: Darkhorse′Xa    时间: 2014-9-4 10:27
安茹黑马 发表于 2014-9-4 09:47
谢啦,学习了

互相学习
作者: 王凯路路    时间: 2014-9-4 11:27
龙帅 发表于 2014-9-4 09:05
好奇怪啊,好像对数组的操作就可以保存,变量就不行。

昨天我还发现,如果单独写一个交换变量的方法,是 ...

我只知道引用类型的变量, 不需要复制操作也可以改, 因为他们是改的堆内存中的,基本数据类型在栈内存开辟空间, 所以改不了,只能重新赋值.
数组是引用类型的, 所以不需要赋值操作, String的话, 大概是因为他是一个特殊的类吧 ?
作者: 王凯路路    时间: 2014-9-4 11:28
OCTSJimmy 发表于 2014-9-4 09:16
我理解了,原因是这样的:
1、字符串在内存中并不会被改变,假如对字符串变量赋值,改变的只是变量的指向 ...

原来是这个样子   :o    看来我还是太肤浅了....唉.
作者: 无风的细雨    时间: 2014-9-4 11:52
abc+”-----”+xyz
作者: king13131313    时间: 2014-9-4 12:20
曾经中招过……




欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2