2013-03-16 51 views
1

Java是否允许在其定义中使用当前类的实例?Java是否允许在其定义中使用当前类的实例?

例子:

public class Component 
{ 
    Component() 
    { 
     // some code 
    } 

    public void method() 
    { 
     Component comp=new Component(); 
     // some code 
    } 
} 

我知道,它不会导致编译时错误。但我发现自我引用有点混乱。这是否意味着Java的语义允许循环定义类?

+1

递归数据结构就是这种用法的典型例子。将从包含相同类型的节点的节点构建树。请注意,这既不是自我引用,也不是循环的 – HXCaine 2013-03-16 01:45:27

回答

2

我想你想过这样的事情... 运行,这导致

异常线程 “main” java.lang.StackOverflowError的

public class AClass { 

    private AClass aClass; 

    public AClass() { 
     this.aClass = new AClass(); 
     this.aClass.printHello(); 
    } 

    private void printHello() { 
     System.out.println("Hello"); 
    } 

    public static void main(final String[] args) { 
     new AClass(); 
    } 
} 

我还没有需要这样的递归代码。但我认为可能会有一些用例。 有一个中止标准来防止无限循环和StackOverflowError是很重要的。

要回答你的问题,我会说Java允许cylic实例化。

+0

我认为你是正确的如何在构造函数中的自引用可以被称为循环,而不是方法中的引用。感谢您的回答! :) – r2d2oid 2013-03-16 02:58:52

0

在定义的类上使用/创建相同类型的实例是完全合法的,没有添加循环定义。

编译器通常会首先检查类的所有方法,一旦编译器知道所有类中可用的所有方法,将在稍后完成实际的方法实现代码生成。

0

这不是一个循环定义。

循环定义是两个或多个类以循环方式彼此引用的时候。 但即使这样做会编译,但可能会导致执行问题。

这是一个“使用提前”的定义,这就是我所说的。

您可以定义一个类,并在其方法中使用对同一类的引用。

这有点矛盾 - 在你使用一个类之前,你应该完全定义它。 类的方法是其定义的一部分。 在一个方法中,你引用一个类实例,就好像这个类已经被定义一样。

我同意这很混乱,但Java让你这样做。

想想单身。

通常有一个静态方法返回类实例。 同样的问题。