Java Pass-by-Reference Confusion / Example

时间:2016-07-12 21:55:03

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

这可能是语义的一种情况,但作为一个实际问题,我发现Java绝对有时以传递方式传递,而不是传值。例如:

public String example() {
    SimpleDateFormat f = new SimpleDateFormat("yyyy-MM-dd");

    String sResult = "Example:";
    GregorianCalendar CAL = new GregorianCalendar(2016, 0, 1);  //January 1, 2016
    sResult += "\nBegin: CAL = " + f.format(CAL.getTime());
    passTo(CAL);
    sResult += "\nEnd: CAL = " + f.format(CAL.getTime());
    return sResult;
}

public void passTo(GregorianCalendar CAL) {
    CAL.add(CAL.DAY_OF_YEAR, 56);
}

执行example()将导致:

Example: 
Begin: CAL = 2016-01-01 
End: CAL = 2016-02-26

显然,passTo方法已将CAL对象作为参数,对其进行操作,并影响example()中包含的原始对象。如果原始对象被改变了,那么怎么会争辩说只传递了一个值呢?

这符合编程中通常理解的传递引用的定义。

1 个答案:

答案 0 :(得分:-1)

你有没有检查过其他答案?

无论如何。您按值传递对象的引用。 类似于C传递指针。 复制引用,但由于它引用了内存位置,您仍然可以修改该内存位置上的内容。

将它与原始数据类型(int,boolean等)进行比较,这些数据类型不是对象。