Java如何分配指向对象而不是复制?

Mat*_*iak 10 java reference

在课堂上,我有:

private Foo bar;
public Constructor(Foo bar)
{
    this.bar = bar;
}
Run Code Online (Sandbox Code Playgroud)

而不是从参数中提供的对象创建bar的副本,是否可以在构造函数中包含指向bar的指针,以便更改原始栏会更改此对象中的字段?

另一种方式:

int x = 7;
int y = x;
x = 9;
System.out.print(y); //Prints 7.
Run Code Online (Sandbox Code Playgroud)

可以将其设置为打印y打印9而不是7?

aio*_*obe 16

当变量用作方法的参数时,它的内容总是被复制.(Java 只有 按值调用.)这里要理解的重要一点是,你只能通过引用引用对象.因此,当您传递引用对象的变量时实际发生的是您将引用传递给对象(按值!).

有人可能会告诉你"基元通过值传递"和"非基元通过引用传递",但这仅仅是因为变量永远不能包含一个开始的对象,只能引用一个对象.当有人理解这一点时,他会同意甚至引用对象的变量都是按值传递的.

来自Java"传递参考"还是"传递价值"?

Java始终是按值传递的.困难的是可以理解Java将对象作为值传递的引用传递.

来自http://www.javaworld.com/javaworld/javaqa/2000-05/03-qa-0526-pass.html

Java通过引用操作对象,并且所有对象变量都是引用.但是,Java不通过引用传递方法参数; 它按值传递它们.

在Java中,原语的C++"引用类型"没有对应部分.

  • 第一句话是正确的,但对于许多接触 Java 并认为“变量是对象”(实际上变量是对对象或基元的引用)的人来说可能会产生误导。初学者首先必须理解的是,当作为参数传递时,对象本身永远不会被复制。 (2认同)

leo*_*loy 8

您的上一个示例以这种方式工作,因为int是基元,它是按值复制的.在第一个示例中," this.bar "将保留引用的副本(类型指针)到bar.因此,如果您更改原始栏(内部),则更改将反映在您的班级中.试试吧.

  • 是.但是海报正在考虑对象.重要的是要理解 - 开始 - 对象(与C++相反)永远不会被值复制. (2认同)