7

当我发现其中一个构造函数具有“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”类对象为参数的构造函数。此时,它如何找到它,因为它仍在编译这个类?

4

2 回答 2

13

当类被编译时,它需要访问的只是类的声明,而不是完整的实现。


换句话说,在编译构造函数时

public Example(Example e) {
    value = e.getValue();
}

它只需要知道存在一个名为的类Example并且它有一个方法getValue。在实际尝试编译代码之前,可以在源文件的单独传递中收集此信息。

(顺便说一句,构造函数与方法的工作方式没有太大不同。乍一看,似乎需要在编译任何方法之前编译构造函数,但这种推理将编译时问题与运行时问题混为一谈。)

于 2012-07-13T07:28:22.920 回答
-1

每当类中有任何复制构造函数时,总会多出一个构造函数。没有它不会给出任何错误,但在运行时它将不起作用。由于首先需要使用非复制构造函数构造对象,然后将其引用传递给其他构造函数的构造函数。

这就像告诉另一个对象“嘿,伙计,我已经有了一些运行良好的属性,你也可以使用相同的属性。”

请记住,总是有一个非复制构造的对象,因此其他对象可以复制它的属性。

于 2012-07-13T07:44:14.857 回答