Java按引用传递混淆/示例

Java按引用传递混淆/示例,java,arguments,pass-by-reference,pass-by-value,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

这可能是语义学的一个例子,但作为一个实际问题,我发现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()中包含的原始对象。如果原始对象被更改,怎么会有人认为只传递了一个值


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

您是否检查了其他答案

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


将其与非对象的基本数据类型(int、boolean等)进行比较。

Java总是按值传递。但是,引用类型(即
对象
)的值是引用。换句话说,
CAL
不是
GregorianCalendar
CAL
是对
GregorianCalendar
的引用。这符合编程中通常理解的按引用传递的定义。不。通过引用传递是一个适用于变量而不是对象的概念。这个概念和名称与Java的参考值无关,这完全是您的逻辑错误。一个参数被传递给一个方法,该方法的操作改变了原始对象。这就是引用传递的定义。这是一个非常非常糟糕的语义的例子,我想你会发现很多程序员都会对它产生异议。Java按值传递引用。Java按值传递引用。每天在镜子中重复它,直到它粘住为止。这里有一个快速的方法可以看出,即使在您的示例中,Java也是按值传递的:add
CAL=new gregorianalendar(2016,0,1)
作为
passTo
函数的第一行。您将看到“开始:”和“结束:”现在打印相同的内容。如果Java通过引用传递,那么也会修改调用函数中的值。重要的是要理解,“按值传递”并不意味着“引用不存在”或“无法传递引用”-它只是意味着传递的实际对象始终是一个值(即使它是引用的值)