当我发现其中一个构造函数将“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;
}
}
第一次编译类Example时,编译器会遇到第二个带有'Example'类对象作为参数的构造函数。在这一点上,它将如何找到它,因为它仍在编译这个类?
答案 0 :(得分:12)
编译类时,它需要访问的是类的declaration,而不是完整的实现。
在编译构造函数时使用不同的方法
public Example(Example e) {
value = e.getValue();
}
所有需要知道的是存在一个名为Example
的类,并且它有一个方法getValue
。在实际尝试编译代码之前,可以在源文件的单独传递中解析此信息。
(顺便说一下,构造函数与方法的工作方式不同。乍一看,在编译任何方法之前,似乎需要编译构造函数,但这种推理会将编译时问题与运行时混淆的问题。)
答案 1 :(得分:-1)
每当类中有任何Copy Constructor时,总会有一个构造函数。没有它不会给出任何错误,但在运行时它将无法正常工作。首先,需要使用非复制构造函数构造对象,然后将其引用传递给其他构造函数的构造函数。
这就像告诉另一个对象'嘿,我已经找到一些工作正常的房产,你也可以使用相同的房产。'
请记住,总是有一个非复制的构造对象,因此其他对象只能复制它的属性。