在Java中使用默认构造函数复制构造函数

在Java中使用默认构造函数复制构造函数,java,copy-constructor,default-constructor,Java,Copy Constructor,Default Constructor,我需要在我的类中有一个复制构造函数,因为我需要创建重复的对象。我相信如果我要创建一个复制构造函数,我也必须指定非参数化构造函数,因为Java将不再提供默认构造函数 我不想触及默认构造函数,因为我在代码中到处都在使用它。是否有一种变通方法,可以在不定义基本构造函数的情况下使用复制构造函数或类似的构造函数 否,如果希望同时拥有无参数构造函数和带参数构造函数,则需要同时声明它们。不过,声明无参数构造函数非常容易: public YourClassName() { } super()是隐式的 这将与默

我需要在我的类中有一个复制构造函数,因为我需要创建重复的对象。我相信如果我要创建一个复制构造函数,我也必须指定非参数化构造函数,因为Java将不再提供默认构造函数


我不想触及默认构造函数,因为我在代码中到处都在使用它。是否有一种变通方法,可以在不定义基本构造函数的情况下使用复制构造函数或类似的构造函数

否,如果希望同时拥有无参数构造函数和带参数构造函数,则需要同时声明它们。不过,声明无参数构造函数非常容易:

public YourClassName() {
}
super()是隐式的

这将与默认构造函数的行为完全相同,尽管它不一定具有与默认构造函数相同的访问权限。(当然,如果您愿意,您可以将其从
公共设置更改为
):

如果一个类不包含构造函数声明,则隐式声明一个没有形式参数和没有throws子句的默认构造函数

如果要声明的类是原始类对象,则默认构造函数的主体为空。否则,默认构造函数只调用不带参数的超类构造函数

如果隐式声明了默认构造函数,但超类没有可访问的构造函数(§6.6),且该构造函数不带参数且没有throws子句,则这是编译时错误

在类类型中,如果该类被声明为public,则默认构造函数被隐式地赋予访问修饰符public(§6.6);如果该类被声明为受保护,则默认构造函数隐式地被赋予访问修饰符protected(§6.6);如果类被声明为private,则默认构造函数被隐式地赋予访问修饰符private(§6.6);否则,默认构造函数具有由无访问修饰符暗示的默认访问权限


不,如果希望同时拥有无参数构造函数和带参数构造函数,则需要同时声明它们。不过,声明无参数构造函数非常容易:

public YourClassName() {
}
super()是隐式的

这将与默认构造函数的行为完全相同,尽管它不一定具有与默认构造函数相同的访问权限。(当然,如果您愿意,您可以将其从
公共设置更改为
):

如果一个类不包含构造函数声明,则隐式声明一个没有形式参数和没有throws子句的默认构造函数

如果要声明的类是原始类对象,则默认构造函数的主体为空。否则,默认构造函数只调用不带参数的超类构造函数

如果隐式声明了默认构造函数,但超类没有可访问的构造函数(§6.6),且该构造函数不带参数且没有throws子句,则这是编译时错误

在类类型中,如果该类被声明为public,则默认构造函数被隐式地赋予访问修饰符public(§6.6);如果该类被声明为受保护,则默认构造函数隐式地被赋予访问修饰符protected(§6.6);如果类被声明为private,则默认构造函数被隐式地赋予访问修饰符private(§6.6);否则,默认构造函数具有由无访问修饰符暗示的默认访问权限


如果确实不想编写默认构造函数,可以执行以下操作:

public static MyClass create(MyClass original) {
    // return the new instance
}

如果确实不想编写默认构造函数,可以执行以下操作:

public static MyClass create(MyClass original) {
    // return the new instance
}

谢谢你,乔恩。但是上面的构造函数会正确地将成员初始化为默认值吗。我的意思是不用在这个无参数构造函数中指定默认值。在这个答案中声明的构造函数与编译器生成的默认构造函数完全一样,谢谢Jon。但是上面的构造函数会正确地将成员初始化为默认值吗。我的意思是没有在这个无参数构造函数中指定默认值。在这个答案中声明的构造函数与编译器生成的默认构造函数完全一样,