Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/363.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
java中的传递值问题_Java_Pass By Value - Fatal编程技术网

java中的传递值问题

java中的传递值问题,java,pass-by-value,Java,Pass By Value,Java支持按值传递(总是在副本上工作),但是当你传递一个用户定义的对象时,它会改变实际的对象(有点像按引用传递,但指针不会改变),我理解这一点,但是为什么下面的changeObject2CLEAR方法会改变对象的值呢?相反,它必须在副本上工作 import java.util.HashMap; 导入java.util.Map; 公务舱乘客{ 类CustomBean{ 公共CustomBean(){ } 私有int-id; 私有字符串名称; 公共int getId(){ 返回id; } 公共无

Java支持按值传递(总是在副本上工作),但是当你传递一个用户定义的对象时,它会改变实际的对象(有点像按引用传递,但指针不会改变),我理解这一点,但是为什么下面的changeObject2CLEAR方法会改变对象的值呢?相反,它必须在副本上工作


import java.util.HashMap;
导入java.util.Map;
公务舱乘客{
类CustomBean{
公共CustomBean(){
}
私有int-id;
私有字符串名称;
公共int getId(){
返回id;
}
公共无效集合id(内部id){
this.id=id;
}
公共字符串getName(){
返回名称;
}
公共void集合名(字符串名){
this.name=名称;
}   
@凌驾
公共字符串toString(){
返回id+“,”+名称;
}
}
公共地图ChangeObject2Full(地图m){
m=零;
返回m;
}
公共地图changeObject2CLEAR(地图m){
m、 清除();
返回m;
}
公共CustomBean changeCustomObject(CustomBean _e){
_e、 setId(_e.getId()+1);
返回e;
}
公共静态void main(字符串[]args){
PassBy PassBy=新PassBy();
Map Map=newhashmap();
地图放置(1,“值”);
CustomBean=passby.new CustomBean();
setId(1);
设置名称(“arun”);
//初始值
System.out.println(map.toString());
System.out.println(bean.toString());
System.out.println(“---------------------------”);
//通过值可以正常工作
passby.changeObject2NULL(映射);
changeCustomObject(bean);
//自定义对象值在作为对象引用传递后发生更改,但贴图仍保留实际值
System.out.println(map.toString());
System.out.println(bean.toString());
System.out.println(“---------------------------”);
//测试通过值-无法理解为什么它会更改对象,因为在这种情况下它必须通过值而不是通过引用??
//为什么设置为null时不链接值,而设置为clear?
passby.changeObject2CLEAR(地图);
System.out.println(map.toString());
}
}

AFAIK Java只按值传递,但值实际上是引用

所以让我试着帮助您理解,Java总是按值传递,但我相信您知道所有对象实例实际上都是指向这些对象的指针。现在,当您发送一个对象时,您正在传递对象地址的值。如果您对对象本身做了任何更改(如m.clear()),那么它将转到该地址,键入强制转换对象并对其执行操作。但是,如果更改指针本身,如m=null,则仅更改您持有的地址副本。

调用
changeObject2CLEAR

passby.changeObject2CLEAR(map);
public Map<Integer, String> changeObject2CLEAR (Map<Integer, String> m) {
    m.clear();
    return m;
}
您正在传递实例
map

在方法
changeObject2CLEAR

passby.changeObject2CLEAR(map);
public Map<Integer, String> changeObject2CLEAR (Map<Integer, String> m) {
    m.clear();
    return m;
}
请注意,您不必返回
Map m
,因为您可以访问的
Map
是在调用该方法的地方传入的同一实例对象

编辑:为什么
m=null表现为传递值,但
m.clear()
表现为传递引用?

当您将值
null
指定给
m
时,您正在将引用从以前的实例对象
map
更改为新的内存位置
null


当您在实例对象
m
上调用
.clear()
方法时,您在
map
引用的内存位置的同一对象上调用该方法,因此您修改了
map
对象。

您正在通过值传递引用。谷歌上有很多关于这方面的信息。好问题。@Arun我已经更新了我的答案,用简短的
changeObject2NULL(Map m)
来回答您的问题,它包含自己的局部变量
m
,它恰好也是方法参数。当您使用像
changeObject2NULL(map)
m
这样的方法时,会复制有关对象
map
保存的信息(此地址是
map
变量的值)。因此,当您调用
m.clear()
时,它会在
map
保持的同一对象上调用
clear
方法,以便您能够通过
map
查看该对象的新状态。当您调用
m=null
时,只需将
m
持有的对象更改为
null
;这不会影响
map
或它所引用的对象。对于
object
实例,这是正确的,但对于基本类型,这是不正确的。为什么将object设置为null是pass-by-value,而clear-method是pass-by-ref?
null
是一个引用,因此通过指定null,您正在更改当前范围内的引用,从而“丢失”您正在处理的对象,当clear更改您传递到functiondownvoter的引用的对象时,是否要进行注释?这是正确的答案。至少,答案没有错。因为这个问题是重复的,我对这个问题和重复的所有答案都投了赞成票。副本中的答案远远优于此答案。所以在我看来,它没有添加任何有用的内容。如果你有什么要补充的,那么把答案添加到副本中。@Bathsheba当然你可以随意投反对票,但我发现一个很好的经验法则是当一个问题严重错误或有害时投反对票。如果它不如另一个答案好,那么我会投票给更好的答案,让不太好的答案保持不变。换句话说,我帮助更好的答案上升到顶端,而不担心让不太好的答案下降。这是看待事物的好方法。我收回了否决票。David/Bathsheba/LanguidQuid/其他受人尊敬的贡献者…为什么将object设置为null是通过值传递,而不是cle