华为面试第一题就把我整晕了!!

liuccc1 2007-01-15 08:22:02
public class TestString{
public static void link(String a){
a += "World";
}
public static void main(String[] args){
String a = "Hello";
link(a);
System.out.println(a);
}
}
打印出来的结果是好多人想得不一样,即使一样很多人的思路也是错的(也就是瞎猜的)
请指点!!!!!!!
...全文
3723 78 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
78 条回复
切换为时间正序
请发表友善的回复…
发表回复
霹雳虫 2007-01-16
  • 打赏
  • 举报
回复
hello
知道String与StringBuffer的区别就明白了。
楼主的问题中如果使用StringBuffer就会是Hello World
luyang1016 2007-01-16
  • 打赏
  • 举报
回复
hello
ybyb14 2007-01-16
  • 打赏
  • 举报
回复
看了这贴,也学到点东西!
kinsey0514 2007-01-16
  • 打赏
  • 举报
回复
mark!
饭饭之辈 2007-01-16
  • 打赏
  • 举报
回复
学习了……
wdman 2007-01-16
  • 打赏
  • 举报
回复
其实上面已经有人解释了。
唉,今天不睡觉了,再解释解释,其实也不是我说的,我是听侯捷说的,其实也不是侯捷说的,他也是翻译过来的(要是多写点文字能赚稿费就好了:)。
对于这个程序,
public class TestInteger{
public static void change(Integer i) {
i = new Integer(2);
}

public static void main(String[] args){
Iteger i = new Integer(1);
change(i);
System.out.println(i);
}
}

//////////////////////////////////////////////////
Iteger i = new Integer(1);
change(i);

i是指向Integer(1)的一个引用,change(i)执行的时候,并没有将i这个引用传进去,而是讲i这个引用的一个copy传进去了,可以看作执行了change(icopy),i和icopy指向同一个对象。在change函数里实际上是给icopy重新赋了值,但是i指向的那个对象并没有改变,只是icopy指向的对象变了。如果这么解释的话,还可以解释另外一个问题。就是下面的这个例子,如果不允性能得出正确答案,说明你过关了。大概changeObjectPart这个函数的原理和StringBuffer的appand差不多吧,哈哈。

/**
* @author wdman
*
*/
public class TestObject {

/**
* @param args
*/
public static void main(String[] args) {
TestObject to = new TestObject();
MyData myData = to.new MyData("Hello ","World!");
System.out.println(myData);
to.changeObject(myData);
System.out.println(myData);
to.changeObjectPart(myData);
System.out.println(myData);
}

public void changeObject(MyData myData) {
myData = new MyData("Hello ","Money!");
}

public void changeObjectPart(MyData myData) {
myData.s1 = "Hello ";
myData.s2 = "Girl!";
}

class MyData {
public String s1;
public String s2;
public MyData(String s1,String s2) {
this.s1 = s1;
this.s2 = s2;
}

public String toString() {
return s1 + s2;
}
}
}
software_jianghai 2007-01-16
  • 打赏
  • 举报
回复
String类是final修饰的,不可改变的,如果对该String进行操作就会产生一个新的对象,
所以link之后产生了一个新的对象HelloWorld,而原来的a还是只向hello的,所以最后打印出hello
kaoloveting 2007-01-16
  • 打赏
  • 举报
回复
老问题
java_road 2007-01-16
  • 打赏
  • 举报
回复
简单.就是String 的对象并没有改变嘛.
xindddd 2007-01-16
  • 打赏
  • 举报
回复
这好像是作用域和传址,传值的问题吧,试一下就可以弄明白了.学习...巩固....
wlp555ren 2007-01-16
  • 打赏
  • 举报
回复
关注!学习。。。
sky3168095 2007-01-16
  • 打赏
  • 举报
回复
建议去看下孙鑫老师的java视频教程,里面这个讲得很详细.看过了保准不会选错,一眼就知道是Hello.
里面有很详细的java传参的内存图解.
yudinosaur 2007-01-16
  • 打赏
  • 举报
回复
你是不是叫刘畅阿?天津的吗?
wft001 2007-01-16
  • 打赏
  • 举报
回复
恩,String定长,方法中调用的不是变量的引用,而是变量的copy,学习了
shenglijay 2007-01-16
  • 打赏
  • 举报
回复
在给你们一个类似的例子看看吧,参数是对象。结果是?????

public class A{
public static void swap(Integer a,Integer b){
Integer temp ;
temp = a;
a = b;
b = temp;
System.out.println("swap--->a\t"+a.intValue());
System.out.println("swap--->b\t"+b.intValue());
}
public static void main(String[] args){
Integer a = new Integer(1);
Integer b = new Integer(3);
swap(a,b);
System.out.println("main--->a\t"+a.intValue());
System.out.println("main--->b\t"+b.intValue());
}
}
结果是
swap--->a 3
swap--->b 1
main--->a 1
main--->b 3
参数是对象啊,怎么没交换呢?????
原因上面的 wdman(只会Java,郁闷!) 说的很清楚,不知道怎么跟String是final类扯上关系了
gyblin 2007-01-16
  • 打赏
  • 举报
回复
学习不少知识
狂啃馍馍 2007-01-16
  • 打赏
  • 举报
回复
mark!
macongbin88 2007-01-16
  • 打赏
  • 举报
回复
dazhen520()
public final class String extends Object
String是final所修饰的.它的值一旦被初始化..就永远都不会改变的...

------
有点不正确吧,这里的final表示的是String类不能被继承吧
luobo525 2007-01-16
  • 打赏
  • 举报
回复
学习!
xfwf 2007-01-16
  • 打赏
  • 举报
回复
楼上的:
String 是不可改变的
StringBuffer 是可以改变的
说法是对的,因为 String是值传递,而函数有没有返回一个结果,所以当然A的值不变,
StringBuffer是引用传递,函数对StringBuffer引用的内容进行了更改,所以作为引用的A的区域当然是新的值了。
加载更多回复(57)

62,634

社区成员

发帖
与我相关
我的任务
社区描述
Java 2 Standard Edition
社区管理员
  • Java SE
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧