Java是否具有C ++的默认复制构造函数?如果它有一个 - 如果我明确声明另一个构造函数(不是复制构造函数),它是否仍然可用?
答案 0 :(得分:8)
Java没有bulit-in复制构造函数。
但是你可以编写自己的构造函数。请参阅以下示例:
class C{
private String field;
private int anotherField;
private D d;
public C(){}
public C(C other){
this.field = other.field;
this.anotherField = other.anotherField;
this.d = new D(other.d); //watch out when copying mutable objects; they should provide copy constructors, as well. Otherwise, a deep copy may not be possible
}
//getters and setters
}
class D{//mutable class
//fields
public D(D other){
//this is a copy constructor, like the one for C class
}
}
答案 1 :(得分:4)
Java没有默认的复制构造函数。您需要自己定义它。
答案 2 :(得分:2)
不,它没有默认的复制构造函数。默认构造函数。
您不必为您的班级提供任何constructors,但在执行此操作时必须小心。编译器自动为没有构造函数的任何类提供无参数的默认构造函数。此默认构造函数将调用超类的无参数构造函数。在这种情况下,如果超类没有无参数构造函数,编译器将会抱怨,因此您必须验证它是否存在。如果你的类没有显式的超类,那么它有一个隐式的超类Object,它有一个无参数的构造函数。
通常我会提供一个喜欢的,
public class CopyConEx {
/**
* Regular constructor.
*/
public CopyConEx(type field1, type field2) {
this.field1 = field1;
this.field2 = field2;
}
/**
* Copy constructor.
*/
public CopyConEx(CopyConEx aCopyConEx) {
this(aCopyConEx.getField1(), aCopyConEx.getField2());
}
答案 3 :(得分:2)
有一个复制构造函数(但不是默认一个),但它应该被称为显式(在C ++中它将是< em>在需要时隐式调用:
public MyClass(MyClass toCopy) {
someField = toCopy.someField;
}
答案 4 :(得分:1)
Java支持克隆但不使用复制构造函数。请在下面找到Java克隆的URL。
http://adtmag.com/articles/2000/01/18/effective-javaeffective-cloning.aspx
答案 5 :(得分:1)
在Java中,提供自动拷贝构造函数毫无意义。
Java不需要一个,因为您只能对对象进行引用。 (在C ++中,您可以按值传递对象,因此语法需要允许自动对象复制。)
如果您需要在Java中获取对象的深层副本,请实现Cloneable
。
答案 6 :(得分:0)
与C ++一样,Java也支持复制构造函数。但是,与C ++不同,如果您不编写自己的Java,则Java不会创建默认的复制构造函数。