编程C++时,我们习惯于在需要时创建复制构造函数(或者我们被教导).几年前切换到Java时,我注意到现在正在使用Cloneable接口.C#遵循定义ICloneable接口的相同路由.在我看来,克隆是OOP定义的一部分.但我想知道,为什么创建这些接口,并且复制构造函数似乎已被删除?
当我想到它时,我开始认为如果需要复制一个类型未知的对象(如对基类型的引用),则复制构造函数将没有用处.这看似合乎逻辑.但我想知道是否还有其他原因我不知道,Cloneable接口是否比拷贝构造器更受青睐?
Java是否具有C++的默认复制构造函数?如果它有一个 - 如果我明确地声明另一个构造函数(不是复制构造函数),它是否仍然可用?
c++ java language-comparisons copy-constructor object-construction
我正在为我的项目编写java中的遗传过程,我想模拟人类细胞的有丝分裂.人类细胞含有23对染色体.有丝分裂基本上是细胞分裂或繁殖,其中细胞产生两个遗传上相同的子细胞.你可以在这里找到一张相关图片(向下滚动一下):
我认为这种有丝分裂就像一个类"Cell"中的java方法.因此,我用它自己的方法制作了一个染色体类来代表单个染色体,并制作了一个包含23对染色体的"细胞"类.我计划将方法有丝分裂放在Cell类中,但问题是这个方法应该返回2个相同的单元格,我认为创建一个返回此类中2个单元格的方法是不可能的.我想过制作一个返回2个单元格数组的方法,它不起作用.有关如何创建此方法的任何建议?或者可能是另一种方法而不是我正在使用的方法?谢谢.
当我发现其中一个构造函数将"String"对象作为参数时,我正在查看String.java源代码.这看起来很简单,但我无法消化它.例如:
public class Example {
private String value;
public Example() {
// TODO Auto-generated constructor stub
}
public Example(Example e){
value = e.getValue();
}
String getValue() {
return value;
}
}
Run Code Online (Sandbox Code Playgroud)
在第一次编译类Example时,编译器会遇到第二个带有'Example'类对象作为参数的构造函数.在这一点上,它将如何找到它,因为它仍在编译这个类?
我们知道
String s = new Object();
Run Code Online (Sandbox Code Playgroud)
会导致错误:
incompatible types: Object cannot be converted to String
Run Code Online (Sandbox Code Playgroud)
因此,从下面的例子来看,我们不能这样做:
Car car = new Vehicle();
Run Code Online (Sandbox Code Playgroud)
但是对于 Java 来说,如果有这样的东西会有什么问题:
超级班:
public class Vehicle {
String color;
int numberOfWheels;
int maxSpeed;
// etc.
}
Run Code Online (Sandbox Code Playgroud)
子类:
public class Car extends Vehicle {
String engineType;
String transmissionType;
int numberOfDoors;
// etc.
Car(Vehicle vehicle) {
// the theoretical idea of passing
// the superclass object within a subclass
super = vehicle;
}
}
Run Code Online (Sandbox Code Playgroud)
“超级=车辆;” 将允许我们一次性将先前设置的超类(车辆)的所有值传递给新的子类(汽车)。用法是:
public class App { …Run Code Online (Sandbox Code Playgroud) 由于我是java新手,我想知道,1.当我创建一个空类时,定义了多少个默认构造函数?2.我是否需要定义复制构造函数,或者它是否在C++中自动定义?