案例我
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...");
}
}
}
这两种情况下有两个单独的类文件。但是一个是编译错误而另一个是好的。这是什么原因?
答案 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();
}
}