java:按值传递或按引用传递[重复]
Posted
技术标签:
【中文标题】java:按值传递或按引用传递[重复]【英文标题】:java: pass-by-value or pass-by-reference [duplicate] 【发布时间】:2012-03-12 09:03:39 【问题描述】:我要两个代码 sn-ps:
第一
class PassByTest
public static void main(String... args)
PassByTest pbt=new PassByTest();
int x=10;
System.out.println("x= "+x);
pbt.incr(x);//x is passed for increment
System.out.println("x= "+x);//x is unaffected
public void incr(int x)
x+=1;
在此代码中,x
的值不受影响。
第二
import java.io.*;
class PassByteTest
public static void main(String...args) throws IOException
FileInputStream fis=new FileInputStream(args[0]);
byte[] b=new byte[fis.available()];
fis.read(b);//how all the content is available in this byte[]?
for(int i=0;i<b.length;i++)
System.out.print((char)b[i]+"");
if(b[i]==32)
System.out.println();
在此文件的所有内容都可以在byte[] b
中找到。
如何以及为什么?
【问题讨论】:
int 是原始类型,byte[] 是引用类型? @YuriyZubarev 所有类型,包括原始类型和引用类型,在 Java 中都是按值传递的 阅读manyrelatedquestions关于这个话题。 @YuriyZubarev:doesn't guarantee to read the whole file. You need to loop.
是什么意思?
【参考方案1】:
Java is always pass-by-value.
不过,在第二种情况下,您通过值传递引用(数组是一个对象,Java 对象总是通过引用访问)。因为该方法现在有一个对数组的引用,所以可以随意修改它。
【讨论】:
@Yuriy 然后继续用java写一个swap方法。那会很有趣.. @oil charlesworth:谢谢你的回答。在此之前我一直以为byte[]
也是primitive
数据类型,忘记了java中的array
是动态的(即reference
类型)。
不,数组是对象。它们是引用类型。【参考方案2】:
Java 是按值传递的 - 总是。
这是一个 reference 引用詹姆斯·高斯林的话,他应该对任何人都足够权威:
来自 Java 的作者:“有 正是一种参数传递模式 Java - 按值传递 - 这有帮助 保持简单。”Java 编程语言,第 2 版。由肯 阿诺德和詹姆斯高斯林,部分 2.6.1,第 40 页,第 3 段。
【讨论】:
如果你使用对象,它是通过引用传递,但在使用原始类型时是通过值传递。看这里docs.oracle.com/javase/tutorial/java/javaOO/arguments.html 错了,错了,错了……你完全错了,乔尼。你甚至都没有错——保利。你会不同意发明语言的人詹姆斯高斯林的话吗?从第一天起就没有改变。 那么 Sun java oracle 的那篇文章就错了。这篇文章也错了javacertificate.net/passbyvalue.htm?两者都说同样的事情,即方法参数中的对象作为引用传递。如果您希望将对象作为值传递,请使其不可变 不,我确定这篇文章是正确的 - 你读错了。对象不通过。引用是传递的,它们是按值传递的。传递机制不会改变,因为对象是不可变的。你没有意识到差异。这很微妙,但却是真实的。 是的,我必须阅读 10 篇文章来确认您所说的内容,而您的解释令人困惑,即理论上,对象没有被传递,但那些引用包含一个指针值的引用实际上是在传递某种价值以上是关于java:按值传递或按引用传递[重复]的主要内容,如果未能解决你的问题,请参考以下文章