2012-07-13 46 views
4

当我发现其中一个构造函数具有“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; 
    } 
} 

虽然编译类实施例,第一次,编译器会遇到“实施例”类对象作为参数的第二构造函数。在这一点上,它将如何找到它,因为它仍在编译这个类?

+0

与Class1引用Class2相同,Class2引用Class1。 – 2012-07-13 07:29:08

+0

@MichaelLaffargue是的,我也担心这种情况。比如,String类使用java.util.Arrays和Arrays使用String类。但是通过aiobe的回答解决了这个难题。 – param 2012-07-13 08:23:18

回答

12

当编译该类时,它需要访问的全部内容是该类的declaration,而不是完整的实现。


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

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

它需要知道的一切是存在命名为Example和一类,它有一个方法getValue。在实际尝试编译代码之前,可以在源文件中单独传递这些信息。乍一看,它可能看起来像一个构造函数需要在编译任何方法之前进行编译,但是这种推理将编译时问题与运行时混合在一起,时间问题。)

+0

你能更详细一点吗? – 2012-07-13 07:29:29

+0

当编译一个类时,它需要知道的只是该类的名称 - 而不是它的编译版本。 – Brad 2012-07-13 07:30:00

-1

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

这就像告诉另一个对象'嘿人,我已经有一些属性工作正常,你也可以使用相同的属性。'

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

+0

另一个例子可能是必须有人先在课堂上完成作业,以便课堂上的其他学生可以复制它。 – noob 2012-07-13 07:45:00

+0

-1。这个答案显然是错误的。我很容易想象有一个'MyLinkedList(MyLinkedList tail)'构造函数接受'null'作为参数(或传递'MyLinkedList'的子类的对象)。即使这是不允许的,也没有什么能阻止你编译一个只有一个拷贝构造函数的类。此外,这与此处提出的问题相去甚远。 – aioobe 2012-07-13 09:22:50

+0

@aioobe检查我的答案,我写道,没有非复制构造函数不会在编译时给你任何错误。在构造函数中为null提供一个条件将使构造函数成为非复制的构造函数,我们不复制属性。此外,我只是在解释提问者如何以外行的方式工作。 – noob 2012-07-13 10:08:12

相关问题