创建本地内部类的实例

时间:2014-04-08 08:21:42

标签: java inner-classes

案例我

 class Outer {    

    void outerMethod() {
        Inner i = new Inner();    //compile error : cannot find symbol
        i.innerMethod();

        class Inner {
            void innerMethod() {
                System.out.println("inner class method...");
            }
        }       
    }
}


 案例II

class Outer {    

    void outerMethod() {
        Inner i = new Inner();
        i.innerMethod();        
    }
    class Inner {
            void innerMethod() {
                System.out.println("inner class method...");
            }
    }   
}

这两种情况下有两个单独的类文件。但是一个是编译错误而另一个是好的。这是什么原因?

6 个答案:

答案 0 :(得分:3)

Local classes有不同的范围规则。 来自JLS, section 6.3

  

“由a括起来的本地类声明的范围   block(§14.2)是紧邻的块的其余部分,   包括自己的类声明。 “

在第一个示例中,您在此内部类的范围之前调用Inner类的构造函数,因此它是非法的。

在您的代码中说明这一点:

void outerMethod() {
    // ...        
    // ...

    // Beginning of legal usage scope of the local class
    class Inner {
        void innerMethod() {
            System.out.println("inner class method...");
        }
    }
    // ...
    // ...
    // End of legal usage scope of the local class
}

答案 1 :(得分:1)

您的案例II正在运作,因为您已经做了适当的范围

class Outer {    

    void outerMethod() {
        Inner i = new Inner();
        i.innerMethod();        
    }   --> You have the scope change here in this case
    class Inner {
            void innerMethod() {
                System.out.println("inner class method...");
            }
    }   
}

即,必须在使用之前定义本地内部类。

在第一种情况下,当您实例化Inner类时,它是未知的,因此导致编译时错误

答案 2 :(得分:1)

在案例1中,您必须先定义一个类然后再使用它。原因是类Inner的上下文。考虑一下:

 class Outer {    

    void outerMethod() {
        Inner i = new Inner();    //compile error : cannot find symbol
        i.innerMethod();

        final int localVar = 1;
        class Inner {
            void innerMethod() {
                System.out.println("inner class method... localVar = " + localVar );
            }
        }       
        Inner i = new Inner();    // No Error
        i.innerMethod();
    }
}

如您所见,类Inner使用先前定义的局部变量,但稍后只能在代码中使用。

答案 3 :(得分:0)

在您的第一种情况下,当您实例化Inner课程时,它是未知的。只需更改说明的顺序:

void outerMethod() {
   class Inner {
       void innerMethod() {
           System.out.println("inner class method...");
       }
   }   

   Inner i = new Inner();
   i.innerMethod();
}

答案 4 :(得分:0)

在使用之前,必须在方法中定义本地内部类。

试试这个:

class Outer {    

    void outerMethod() {
        class Inner { // Inner class definition 
            void innerMethod() {
                System.out.println("inner class method...");
            }
        }       

        Inner i = new Inner();    // No compilation error 
        i.innerMethod();

    }
}

答案 5 :(得分:0)

在第1种情况下 - 将类视为变量声明(因为它只存在于此方法的范围内),当它仍然不存在时,您尝试分配变量“inner”,将类声明移到顶部方法,它将编译。

 class Outer {    

    void outerMethod() {
        class Inner {
            void innerMethod() {
                System.out.println("inner class method...");
            }
        }   
        Inner i = new Inner();
        i.innerMethod();   
    }
}