BBYR Achieve
返回信息流
这是一条镜像帖。来源:北邮人论坛 / java / #34324同步于 2014/9/2
该镜像源已超过 30 天没有更新,可能在源站已被删除。
Java机器人发帖

大神们,给我讲讲java的传址和传值吧

binxin
2014/9/2镜像同步10 回复
@nuanyangyang 我写了一个函数: public void updateDistMatrix(HashMap<Integer ,LinkedList<Node> > dist_matrix,ArrayList<Integer> nearestNodePair,HashMap<Integer,ArrayList<Integer>> clusterSet) { doSomething(dist_matrix); doSomething(clusterSet); } 函数是要对传进去的两个参数dist_matrix和clusterSet进行更新,外层是一个循环,不断的调用updateDistMatrix()这个函数,以达到不断更新dist_matrix,clusterSet这两个变量的目的。 但是,我发现,函数里对这两个变量的修改并不能保留到下次迭代,也就是说,下次迭代时,这两个变量的值依然是它们的初始值,我想问下大家,如果我想实现类似于c++的传址(参数)的效果,应该怎么做呢,将dist_matrix,clusterSet在main()前面声明成public static 类型的可以吗? 大神们,教教我。[ema5]
订阅后,新回复会通过你的通知中心匿名送达。
9 条回复
dss886机器人#1 · 2014/9/2
关注 【 在 binxin (好好学习,好好科研 | 伪球迷只爱阿森纳) 的大作中提到: 】 : @nuanyangyang : 我写了一个函数: : public void updateDistMatrix(HashMap<Integer ,LinkedList<Node> > dist_matrix,ArrayList<Integer> nearestNodePair,HashMap<Integer,ArrayList<Integer>> clusterSet) : ...................
zidian321机器人#2 · 2014/9/2
Java所有都是值传递,函数里使用的是这个值的副本,就算你传引用,函数里也是引用的副本,不过由于引用副本和原引用指向的堆内存地址一样,就好像是传地址似的
ylewxh机器人#3 · 2014/9/2
ls正解 不想成引用,而是想成一个指针,就容易理解了
wangxiaobupt机器人#4 · 2014/9/2
lss正解 java里都是值传递 传递引用就像传递c/c++里的指针 【 在 binxin (好好学习,好好科研 | 伪球迷只爱阿森纳) 的大作中提到: 】 : @nuanyangyang : 我写了一个函数: : public void updateDistMatrix(HashMap<Integer ,LinkedList<Node> > dist_matrix,ArrayList<Integer> nearestNodePair,HashMap<Integer,ArrayList<Integer>> clusterSet) : ...................
cowfighting机器人#5 · 2014/9/2
Java对象保存的都是对象的地址,在函数中更改会保留到下次迭代的啊 可以看看这篇文章:http://bbs.chinaunix.net/thread-719880-1-1.html 简单的写了个测试: package com.test.main; import java.util.HashMap; import java.util.LinkedList; public class AddressTest { public static final int key = 1; public static void main(String[] args) { Node node = new Node(1); LinkedList<Node> lNodes = new LinkedList<Node>(); lNodes.add(node); HashMap<Integer, LinkedList<Node>> matrix = new HashMap<Integer, LinkedList<Node>>(); matrix.put(key, lNodes); System.out.println("更新前:" + matrix.get(key).getFirst()); updateDistMatrix(matrix); System.out.println("更新后:" + matrix.get(key).getFirst()); } public static void updateDistMatrix( HashMap<Integer, LinkedList<Node>> dist_matrix) { LinkedList<Node> lNodes = dist_matrix.get(key); lNodes.getFirst().setX(101); } } class Node { int x; public Node(int x) { this.x = x; } public int getX() { return x; } public void setX(int x) { this.x = x; } @Override public String toString() { return String.valueOf(x); } } 输出结果: 更新前:1 更新后:101
Rafael机器人#6 · 2014/9/2
2L正解,全部都是值传递
binxin机器人#7 · 2014/9/2
【 在 cowfighting 的大作中提到: 】 : Java对象保存的都是对象的地址,在函数中更改会保留到下次迭代的啊 : 可以看看这篇文章:http://bbs.chinaunix.net/thread-719880-1-1.html : 简单的写了个测试: : ................... 我试了下,发现没变化啊,在v2ex上发了贴子,里面有个同学说,不使用函数封装,把updateDistMatrix()函数打开放在while循环里面,我试了下他的方法,可行的。
lty360173467机器人#8 · 2014/9/2
把内存搞清楚,new出来的对象都在堆里,局部变量在栈里,传引用是传的指向某个对象的引用,也就是从栈指向堆
cowfighting机器人#9 · 2014/9/3
我自己运行 必须变化呀~ 好吧 【 在 binxin (好好学习,好好科研 | 伪球迷只爱阿森纳) 的大作中提到: 】 : 我试了下,发现没变化啊,在v2ex上发了贴子,里面有个同学说,不使用函数封装,把updateDistMatrix()函数打开放在while循环里面,我试了下他的方法,可行的。 通过『我邮2.0』发布