Java:将克隆作为函数参数而不是引用传递

Java:将克隆作为函数参数而不是引用传递,java,Java,我有一段代码: Graph g = new Graph(); doCoverOperation(g) 其中在doCoverOperation(g,subset)中,我倾向于使用g执行一些操作,但我不想对我的g进行任何更改。因为我开始理解Java是一个通过引用传递的,所以我知道它应该是这样工作的,但是有没有一种方法可以在doCoverOperation上传递克隆?比如,我在doCoverOperation上使用g执行一些操作,但是上面的g没有改变 对这种方法有什么想法吗?进一

我有一段代码:

    Graph g = new Graph();

    doCoverOperation(g) 

其中在
doCoverOperation(g,subset)
中,我倾向于使用
g
执行一些操作,但我不想对我的
g
进行任何更改。因为我开始理解Java是一个通过引用传递的,所以我知道它应该是这样工作的,但是有没有一种方法可以在
doCoverOperation
上传递克隆?比如,我在
doCoverOperation
上使用
g
执行一些操作,但是上面的
g
没有改变


对这种方法有什么想法吗?进一步谢谢你

如果您自己实现了
Graph
类,那么您的类可以实现
Cloneable
接口,如下所示:

Graph g1=g.clone();
公共类图实现可克隆{
//您的方法和属性位于此处
...
@凌驾
公共对象克隆()引发CloneNotSupportedException{
返回super.clone();
}
}
然后,您可以像这样使用克隆方法:

Graph g1=g.clone();

“因为我开始理解Java是一个通过引用传递的”——不,引用是通过值传递的。看见但是,如果要创建克隆,则需要编写代码来克隆图形。这有时是困难的,有时是容易的,这取决于所涉及的数据结构。“因为我开始理解Java是一个通过引用传递的…”-,总是这样。如果您希望自动克隆发生这种情况,您很可能必须等待。Java只是传递值,但由于引用实际上是传递值,所以Java中的引用、对象具有传递引用语义。这是一个微妙的点,但需要记住。在internet上搜索“Java深层克隆库”,你会发现几个,你可以从stackoverflow开始问:我敦促你仔细想想,
doCoverOperation()
方法真的需要改变它的输入吗?一般来说,改变输入数据结构的方法比不改变输入数据结构的方法维护性差,更容易出错