一道题目,JAVA高手看过来

wf031197 2002-10-08 11:41:40
public class test {
String s = "a";
private void change (test ss) {
ss = null;l
}
public static void main(String args[]) {
test t = new test();
System.out.println(t.s);
t.change(t);
System.out.println(t.s);
}
}
输出结果是什么?为什么?
...全文
26 17 打赏 收藏 转发到动态 举报
写回复
用AI写文章
17 条回复
切换为时间正序
请发表友善的回复…
发表回复
chen_2001 2002-10-09
  • 打赏
  • 举报
回复
up
BenLadeng5225 2002-10-09
  • 打赏
  • 举报
回复
public class test {
String s = "a";
private void change (test ss) {
ss = null;l
}
public static void main(String args[]) {
test t = new test();
System.out.println(t.s);
t.change(t);
System.out.println(t.s);
}
}
肯定是a a.
kreven 2002-10-08
  • 打赏
  • 举报
回复
a a
bluevagrant 2002-10-08
  • 打赏
  • 举报
回复
同意jgo(航海家),对象传递的是引用
林仪明 2002-10-08
  • 打赏
  • 举报
回复
输出结果是a a
理由同haichuang(不戒和尚)
dshawn 2002-10-08
  • 打赏
  • 举报
回复
我测试了一下,输出结果是a a
jgo 2002-10-08
  • 打赏
  • 举报
回复
楼上的应该是错了。
java传递的是引用和值。
Test是引用类型,传递的是引用。
我的理解是这样的。

test t = new test();
变量t指向Test实例。
t--->test实例。
t.change(t),在方法内ss变量也指向t。
变成t--->test实例<----ss
方法执行ss=null;是将ss指为空。
变成t-->test实例,ss为空。
很容易验证。如果照楼上的说。
我们把ss=null;改成ss.s="b";同样不会改变。但实际上会打印 a b.因为
t.change(t),在方法内ss变量也指向t。
变成t--->test实例<----ss
ss.s与t.s是指向同一个地址的。
关键是指向 = 与 . 操作的不同。


wf031197 2002-10-08
  • 打赏
  • 举报
回复
结果应该是aa吧?但我不太清楚为什么
haichuang 2002-10-08
  • 打赏
  • 举报
回复
输出结果是a
这是因为java中传递的是变量的值,而不是变量的指针,所以你将传入的对象变量设置为null,是不会影响到外部变量的指向的.
xiaosongyu 2002-10-08
  • 打赏
  • 举报
回复
刚刚在.NET Framework SDK看到一段文字,感觉对值和引用理解的比较深刻,贴上来大家共享,不过不是针对java的,大家不要死扣字眼:

值是数据的二进制表示形式,类型提供了一种解释该数据的方式。值类型直接以类型数据的二进制表示形式存储。引用类型的值是表示该类型的数据的位序列的位置。
每个值都有一个准确的类型,完全定义了值的表示形式和针对值定义的操作。自描述类型的值称为对象。通过检查值,总是可以确定对象的准确类型,但却不能这样处理值类型和指针类型。值可以有多种类型。一种实现某一接口的类型,其值也是该接口类型的值。同样,从某一基本类型派生的类型,其值也是该基本类型的值。
xuemojie 2002-10-08
  • 打赏
  • 举报
回复
chang()方法中的确是传的引用,但是,这个方法是void的,所以只能是对改地址进行操作,但是如果赋值为null,相当于重新分配了一个内存地址,而原先的地址中的内容还是没有改变,所以不会出现问题,如果该方法改为这样:private test change (test ss) {
ss = null;
return ss;
}
就不会出现刚才的情况了
chen_2001 2002-10-08
  • 打赏
  • 举报
回复
up
xiaosongyu 2002-10-08
  • 打赏
  • 举报
回复
同意 jgo(航海家)

代码似乎改成这样更明显一些:

public class test {
String s = "a";
private test change1 (test ss) {
ss = null;
return ss;
}
private test change2 (test ss) {
return ss;
}
public static void main(String args[]) {
test t = new test();
System.out.println(t.s);

test t2 = t.change1(t);
System.out.println(t2==null);
System.out.println(t.equals(t2));

test t3 = t.change2(t);
System.out.println(t3==null);
System.out.println(t.equals(t3));
}
}

输出结果:

a
true
false
false
true
freecolor 2002-10-08
  • 打赏
  • 举报
回复
楼上老兄程序的结果应该是a null
因为在他的程序中对其中的一个引用做了改变(ss.s = null),所以两个引用都改变了





scbb2001 2002-10-08
  • 打赏
  • 举报
回复
试试:
public class test {
String s = "a";
private void change (test ss) {
ss.s = null;//update

}
public static void main(String args[]) {
test t = new test();
System.out.println(t.s);
t.change(t);
System.out.println(t.s);
}
}
freecolor 2002-10-08
  • 打赏
  • 举报
回复
在JAVA中,作为参数传递是如果是基本类型则是值传递
如果是类类型则是传递引用
传递后两个引用都应用同一个对象,这时候如果只是将其中一个引用指向另一个对象,则对另一个引用不产生影响
而如果对其中一个引用做改变,则两个引用都将改变

在上边的例子中正是将引用指向了另一个对象(NULL),所以另一个引用不受影响
所以最后的输出结果是a a
maple92 2002-10-08
  • 打赏
  • 举报
回复
输出结果是a a
这是因为java中传递的是变量的值,而不是变量的指针,所以你将传入的对象变量设置为null,是不会影响到外部变量的指向的.

62,614

社区成员

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

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