| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 961 人关注过本帖
标题:讨论程序运行结果!!
只看楼主 加入收藏
michelecindy
Rank: 1
等 级:新手上路
帖 子:2
专家分:0
注 册:2007-9-15
收藏
 问题点数:0 回复次数:11 
讨论程序运行结果!!

一、求下面程序的运行结果:
public class PrintTest {
public static void main(String[] args){
User origin = new User(“userA”);
User dest = new User(“userB”);
swap(origin,dest);
System.out.println(origin.getUserName());
}
public static void swap(User userA, User userB){
User tmp = userA;
userA = userB;
userB=tmp;
}
static private class User{
String userName = null;
User(String name){
userName = name;
}
String getUserName (){
return userName;
}
}
}



二、 当overwrite了一个Object的equals方法,一般还要overwrite什么方法,为什么?

搜索更多相关主题的帖子: 结果 运行 
2007-09-15 22:01
george_vcool
Rank: 2
等 级:新手上路
威 望:3
帖 子:453
专家分:0
注 册:2007-7-23
收藏
得分:0 
运行的结果是userA
说实话,我也不太理解!!!可能跟编译期绑定机制有关吧!!
下面的的一般还要重写hashcode()这个方法!!
2007-09-15 23:04
steven_yaoo
Rank: 1
等 级:新手上路
帖 子:14
专家分:0
注 册:2007-8-7
收藏
得分:0 
[QUOTE][CODE]

public static void swap(User userA, User userB){
User tmp = userA;
userA = userB;
userB=tmp;

[/CODE][/QUOTE]

我觉得问题在这里 参数传递上
调用swap()这个方法的时候传递了对象的引用 当程序运行到程序结束时 对象本身并没有改变
所以输出userA.

个人理解,请大家指正!

富家不用买良田,JAVA自有千锺粟; 安居不用架高楼,JAVA自有黄金屋; 娶妻莫恨无良媒,JAVA自有颜如玉;
2007-09-15 23:21
狂放不羁
Rank: 4
等 级:贵宾
威 望:12
帖 子:925
专家分:0
注 册:2007-1-24
收藏
得分:0 
LS正确。这也是JAVA中没有指针的一个不便之处。
2007-09-16 09:41
HK狼
Rank: 1
等 级:新手上路
威 望:1
帖 子:46
专家分:0
注 册:2007-9-9
收藏
得分:0 
引用问题 。。

这个可以在 class user{
//加个set方法
String setUserName (){
}
}
这样就不会出现上面的问题了

2007-09-16 10:12
michelecindy
Rank: 1
等 级:新手上路
帖 子:2
专家分:0
注 册:2007-9-15
收藏
得分:0 
谢谢各位大大的回答....

2007-09-16 13:54
huwangvs
Rank: 7Rank: 7Rank: 7
等 级:贵宾
威 望:34
帖 子:764
专家分:0
注 册:2007-2-4
收藏
得分:0 
你的程序和传普通类型其实是一样的。。。
一般书里比较传值还是传引用的时候都会说个例子。。
你肯定知道swap(int a,int b),最后结果是没有改变的。。
你的程序就和这个一样。。你将两个引用传进来,其实传的是他们的拷贝。。你将他们交换,在方法他们交换了,但是在外面还是没有变化的。。。只有你通过传进来的引用来改变他们所引用的对象的时候,对象就改变了。。。外面的引用还是指向原来的地址,但是地址所存储的内容 改变了。
说得很乱。。。
2007-09-16 18:27
lh213
Rank: 1
等 级:新手上路
帖 子:4
专家分:0
注 册:2007-6-5
收藏
得分:0 

方法结束时参数变量userA和userB被丢弃了啊
原来的变量origin和dest 仍然这个方法调用之前的所引用的对象

记住:一个方法不能让对象参数引用一个新的对像
2007-09-16 21:59
晨风lxj
Rank: 1
等 级:新手上路
帖 子:59
专家分:0
注 册:2007-9-13
收藏
得分:0 
userA和origin对象都指向同一个引用,在方法里是把userA和userB指向的引用进行了交换,而origin和dest指向的引用并没有发生改变!
2007-09-16 23:24
bjlei86
Rank: 1
等 级:新手上路
帖 子:4
专家分:0
注 册:2007-9-17
收藏
得分:0 

三楼是正解
现以本人对三楼进行详细的解释:

java 方法中的参数都是传值的,不管什么类型
不管是简单类型 int
还是引用类型,传的是引用的值 如楼主讲的 User
int 型传的是int 的值,即 拷贝了一 个 int 的副本
引用型也是的, 拷贝了一 个 引用 的副本 ,注意是引用的值,而不是new 出来的具体内容

对于简单类型:
void swap1(int a,int b)
{
int t=a;
a=b;
b=t;
}

假设方法中参数拷贝后生成的副本为 aa,bb;
对于以下代码

int a=1,b=2;
swap1(a,b);

分析过程如下
a=1,b=2;
aa=1,bb=2;
aa=2,bb=1;
a=1,b=2;


对于引用类型:
void swap2(User a,User b)
{
User t=a;
a=b;
b=t;
}

假设拷贝后生成的副本为 aa,bb;
对于以下代码
User p1=new User("userA");
User p2=new User("userB");
User a,b;
a=p1,b=p2;
swap2(a,b);

分析如下:
a->p1,b->p2; (注:这里的->表示指向,其实JAVA中的引用类似于C++中的指针)
aa->p1,bb->p2;
aa->p2,bb->b1;
a->p1,b->p2;


以上两种方法都不用进行交换

用如下方法可以(但引限于引用类型,简单类型int不可以,包装类Integer可以)
void swap3(User a,User b)
{
User t.userName=a.userName;
a.userName=b.userName;
b.userName=t.userName;
}


小结:java 方法中的参数都是传值的,不管是简单类型还是引用类型
搞明白这句话的实质,一切都很简单了

附: 其实C++中也一样,指针类型,传到函数中,会拷贝一个指针的副本
void swap2(User *a,User* b)
{
User* t;
t=a;
a=b;
b=t;
}

void swap3(User *a,User* b)
{
User* t;
*t=*a;
*a=*b;
*b=*t;
}

swap2换不了值,而swap3可以

学习时要善于思考要类比,


上课去了,


2007-09-17 09:27
快速回复:讨论程序运行结果!!
数据加载中...
 
   



关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.018060 second(s), 9 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved