Java如何分配指向对象而不是复制?
在课堂上,我有:
private Foo bar; public Constructor(Foo bar) { this.bar = bar; }
而不是从参数中提供的对象创建条的副本,是否可以在构造函数中包含指向bar的指针,以便更改原始条更改此对象中的字段?
另一种方式:
int x = 7; int y = x; x = 9; System.out.print(y); //Prints 7.
可以将其设置为打印y打印9而不是7?
您的上一个示例以这种方式工作,因为int是基元,它是按值复制的。 在第一个示例中,“ this.bar ”将保留引用的副本(类型指针)到bar 。 因此,如果您更改原始栏(内部),更改将反映在您的class级中。 尝试一下。
当变量用作方法的参数时, 始终复制内容。 (Java 只有 按值调用 。)这里要理解的重要一点是,你只能通过引用来引用对象。 因此,当您传递引用对象的变量时实际发生的是您将引用传递给对象(按值!)。
有人可能会告诉你“基元通过值传递”和“非基元通过引用传递”,但这仅仅是因为变量永远不能包含一个开始的对象,只能引用一个对象。 当有人理解这一点时,他会同意甚至引用对象的变量都是按值传递的。
来自Java“传递参考”还是“传递价值”?
Java始终是按值传递的。 困难的是可以理解Java将对象作为值传递的引用传递。
来自http://www.javaworld.com/javaworld/javaqa/2000-05/03-qa-0526-pass.html
Java通过引用操作对象,并且所有对象变量都是引用。 但是,Java不通过引用传递方法参数; 它按值传递它们。
在Java中,基元的C ++“引用类型”没有对应部分。
要获得该行为,您可以修改对象的成员:
public class Number{ int value; Number(int value){ this.value = value; } public String toString() { return "" + value; } }
然后你可以这样做:
Number x = new Number(7); Number y = x; x.value = 9; System.out.println(y);//prints 9
Java永远不会复制对象。 最容易想到的是每个“新”你将拥有一个对象实例 – 永远不会更多。
当人们通过引用/传递值来讨论这个问题时,人们会得到真正的混淆,如果你不熟悉这些术语的意思,我建议你忽略它们,并且只记得Java永远不会复制对象。
因此,java的工作方式与您希望第一个示例的工作方式完全一致,这是OO Design的核心部分 – 事实上,一旦您实例化了一个对象,它就是每个人使用它的同一个对象。
处理原语和引用有点不同 – 因为它们不是对象,所以它们总是被复制 – 但实际上,java只是总是做你想做的事情,而没有额外的语法或混淆选项。
为了保持成员栏的原始值,您需要实现Cloneable接口。 然后,在为对象分配新值之前,您需要对其进行克隆并传递克隆值并将新值分配给克隆对象。 这是一个如何做到这一点的教程http://www.java-tips.org/java-se-tips/java.lang/how-to-implement-cloneable-interface.html 。