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:按值传递或按引用传递[重复]的主要内容,如果未能解决你的问题,请参考以下文章

我应该在哪里更喜欢按引用传递或按值传递?

按引用传递或按值传递指针容器之间的区别

按值传递或按引用传递

第7章 按值传递或按引用传递:7.5 处理返回值

第7章 按值传递或按引用传递:7.6 推荐的模板参数声明方法

第7章 按值传递或按引用传递:7.3 使用std::ref()和std::cref()