【问题标题】:I don't understand how Java is pass by value [duplicate]我不明白 Java 是如何按值传递的 [重复]
【发布时间】:2015-06-23 18:06:44
【问题描述】:

所以我以为Java是按值传递的,但是为什么下面的代码:

public static void main(String[] args) {

    List<Integer> numbers = new ArrayList<Integer>();
    numbers.add(1);
    numbers.add(2);
    numbers.add(3);

    phase1(numbers);

    for (Integer number: numbers) {
        System.out.println("number = " + number);
    }
}

static void phase1(List<Integer> numbers) {
    numbers.remove(0);
}

打印以下内容?

number = 2
number = 3

【问题讨论】:

    标签: java pass-by-reference pass-by-value


    【解决方案1】:

    所以我认为 Java 是按值传递的

    是的。

    ...但是为什么下面的代码...打印以下内容?

    因为为引用类型传递的是引用,而不是对象的副本。

    “通过引用传递”是指完全不同的东西,将引用传递给变量。 Java 没有。

    如果 Java 有传递引用,那么对您的方法进行以下更改:

    static void phase1(List<Integer> &numbers) {
    // Pass-by-reference indicator --^--- that Java doesn't actually have
        numbers = new ArrayList<Integer>()
    }
    

    ...将使您的代码根本不打印任何数字。但它没有,所以它没有。

    将对象引用视为一个intlong,它唯一地标识内存中其他位置的对象。 (基本上就是这样。)就像a = bints 复制 b 的值到a,所以a = b 复制 b 转换为 a,即使该值是对象引用。被复制的值是引用,而不是它所引用的对象。

    【讨论】:

    • @QLiu:不用担心。 :-) 顺便说一句,咒骂是禁止的。
    • 所以我知道 Java 是按值传递的,其中值可以是引用,但在内部,这与在 C 中通过引用传递 & 在内部有什么不同?
    • @QLiu:C 没有传递引用。 C++ 可以。不同之处在于引用的含义:在 C++ 中,如果我们有 foo(int &amp;bar) 并使用 foo(x) 调用它,则在 foo 内部,bar 是对 变量 @987654335 的引用@。所以foo 可以联系并更改变量。这与对象引用无关,它与 variable 引用有关。 Java 没有变量引用。
    猜你喜欢
    • 2011-05-16
    • 2011-12-23
    • 2013-11-22
    • 2013-12-02
    • 2012-03-12
    • 2013-09-15
    • 2012-03-13
    • 2014-09-10
    • 2016-04-22
    相关资源
    最近更新 更多