上次看到一个面试题: 关于值传递?引用传递

asdujiayong 2010-11-19 03:02:24
题目:
有Object1 Object2;写一个方法实现object1-->object2;object2-->o1

public class SwapObject {
public static void main(String[] args){
Object o1 = new Object();
Object o2 = new Object();
System.out.println("o1:"+o1.hashCode());
System.out.println("o2:"+o2.hashCode());
swap(o1, o2);//不可以
System.out.println("o1:"+o1.hashCode());
System.out.println("o2:"+o2.hashCode());
}
public static void swap(Object o1,Object o2) {
Object o = new Object();
o = o1;
o1 = o2;
o2 = o ;
}
}

输出:
o1:14576877
o2:12677476
o1:14576877
o2:12677476

这样写肯定是行不通的
所以请大家讲讲java中的值传递,引用传递
顺便讲下有什么其它方法可以交换。
...全文
280 17 打赏 收藏 转发到动态 举报
写回复
用AI写文章
17 条回复
切换为时间正序
请发表友善的回复…
发表回复
asdujiayong 2010-11-21
  • 打赏
  • 举报
回复
[Quote=引用 16 楼 pdw_jsp 的回复:]

看此贴有趣,我也来发表一下我的正解吧:
首先, 大家争论的一个话题是java中有没有引用传递。
对于这个问题,可以分两个来表述。①:sun官方的表述是,都是只传值
②:很多书籍上表述的是基本类型传值,对象传引用那么到底是传值呢?还是传引用呢?其实大家都不要去被误导了。引用其实就……
[/Quote]
还想听听数组创建时的堆栈的分配情况...
Dongo2 2010-11-20
  • 打赏
  • 举报
回复
看此贴有趣,我也来发表一下我的正解吧:
首先, 大家争论的一个话题是java中有没有引用传递。
对于这个问题,可以分两个来表述。①:sun官方的表述是,都是只传值
②:很多书籍上表述的是基本类型传值,对象传引用那么到底是传值呢?还是传引用呢?其实大家都不要去被误导了。引用其实就是相当于一个指针了,它其实也是一个值0x****所以我觉得还是传值比较准确。而其他的书上所说的也不错。
然后, 解决LZ的问题了吧。
我觉得楼主可能对JVM对内存的管理还有待加强。每一个栈中的引用它的hashcode是不同的。而每一个栈中的数据也是私有的。如果你想改变的话是没门的。就像一楼的那样用数组来做的话它在栈中存取的就是同一个栈中的数据了(只是这个数据是引用的)。在同一个栈中的数据当然是可以交换的了约。所以我的解释就是如此了。希望你能明白我的良苦用心啊。半夜三更起来帮你回复。眼睛都肿了。。。。如果还是不懂的话就私聊了吧!
海的来信 2010-11-20
  • 打赏
  • 举报
回复
四楼说的很清楚,顶一个……
吴红军 2010-11-19
  • 打赏
  • 举报
回复
[Quote=引用 3 楼 youfeng445 的回复:]
java好像都是值传递
[/Quote]
要的就是这结果,不用在怀疑!
nihaoma00100 2010-11-19
  • 打赏
  • 举报
回复
java里都是值传递,没有引用传递。4楼讲的很具体。
HEAVEN 2010-11-19
  • 打赏
  • 举报
回复
java里的这个关于值传递和引用传递的概念与C语言中的相差无几,可以试着一同理解!!

推荐谭浩强老师的《c语言程序设计》第三版 大有裨益!!
ccking001 2010-11-19
  • 打赏
  • 举报
回复
只能是 值传递 只能改变参数属性的值
quanquanfly 2010-11-19
  • 打赏
  • 举报
回复
[Quote=引用 4 楼 keeya0416 的回复:]

java里都是值传递
所以在调用方法后是无法改变参数的值,只能改变参数的属性值
所以 1 楼曲线救国了 将参数变成一个数组
而需要对调的 2 个对象成了数组的 2 个属性值
C# 中有引用传递
C 里有双指针都可以做到这点
java这边就只能像 1 楼那样了
[/Quote]属性值感觉好像很虚..能不能从内存方面讲述一下呵..我也很想知道本质的原理是什么
asdujiayong 2010-11-19
  • 打赏
  • 举报
回复
有两人推老马了
等会去看看
gujinf2008 2010-11-19
  • 打赏
  • 举报
回复
[Quote=引用 6 楼 caofaping 的回复:]
马士兵不是有一集内存分析视频,相当不错。建议去看下。
[/Quote]
看过的确不错,建议楼主去看看。
至于实现方法,看楼主实现了,好像是将那两个引用封装了一样,一个大的引用包含了两个小的引用,传大引用过去,在方法里再对俩个小引用交换处理,说的通俗了点,可能不恰当,呵呵
caofaping 2010-11-19
  • 打赏
  • 举报
回复
马士兵不是有一集内存分析视频,相当不错。建议去看下。
asdujiayong 2010-11-19
  • 打赏
  • 举报
回复
[Quote=引用 4 楼 keeya0416 的回复:]

java里都是值传递
所以在调用方法后是无法改变参数的值,只能改变参数的属性值
所以 1 楼曲线救国了 将参数变成一个数组
而需要对调的 2 个对象成了数组的 2 个属性值
C# 中有引用传递
C 里有双指针都可以做到这点
java这边就只能像 1 楼那样了
[/Quote]
以前上学时 学c++
记的老师讲过
c++中如果传的是引用 就是引用传递.
keeya0416 2010-11-19
  • 打赏
  • 举报
回复
java里都是值传递
所以在调用方法后是无法改变参数的值,只能改变参数的属性值
所以 1 楼曲线救国了 将参数变成一个数组
而需要对调的 2 个对象成了数组的 2 个属性值
C# 中有引用传递
C 里有双指针都可以做到这点
java这边就只能像 1 楼那样了
youfeng445 2010-11-19
  • 打赏
  • 举报
回复
java好像都是值传递
asdujiayong 2010-11-19
  • 打赏
  • 举报
回复
沙发先占了:
public class SwapObject {
public static void main(String[] args){
Object[] oArray = new Object[2];
oArray[0] = new Object();
oArray[1] = new Object();
System.out.println("o1:"+oArray[0].hashCode());
System.out.println("o2:"+oArray[1].hashCode());
swapArray(oArray);
System.out.println("o1:"+oArray[0].hashCode());
System.out.println("o2:"+oArray[1].hashCode());
}
public static void swapArray(Object[] oArray){
Object o = new Object();
o = oArray[0];
oArray[0] = oArray[1];
oArray[1] = o;
}
}

输出:
o1:14576877
o2:12677476
o1:12677476
o2:14576877

62,615

社区成员

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

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