了解Java中的本地类
众所周知,本地类是内部类。 JLS 14.3
所有本地类都是内部类(第8.1.3节)。
内心阶层是什么
JLS 8.1.3
如果O是C的直接封闭类型声明并且C的声明不在静态上下文中,则内部类C是类或接口O的直接内部类。
类C是类或接口O的内部类,如果它是O的直接内部类或O的内部类的内部类。
这意味着内部类的声明不应该出现在非静态的上下文中。 但考虑下面的程序:
public static void main (String[] args) throws java.lang.Exception
{
class Foo{ } //occured in the static-context
}
DEMO
尽管在静态上下文中声明,但Foo
类的声明没有问题。 虽然内部类不可能在静态上下文中声明。
在称为本地类的块中定义的类,它们可以出现在方法块的任何地方。 阅读官方文档的更多信息 - 本地课程:
本地类是在块中定义的类,它是平衡花括号之间的一组零个或多个语句。 您通常会在方法的主体中找到定义的本地类。
你的情况有一个非常相似的例子。
你也可以看到JLS - 14.3。 本地类声明 :
本地类是一个嵌套类(§8),它不是任何类的成员,并且有一个名称(§6.2,§6.7)。
本地类是在块中定义的类,它是平衡花括号之间的一组零个或多个语句。 您通常会在方法的主体中找到定义的本地类。
看到这个oracle链接
本地类与内部类相似,因为它们不能定义或声明任何静态成员。 静态方法中的本地类,例如在静态方法validatePhoneNumber中定义的PhoneNumber类,只能引用封闭类的静态成员。
这里是例子: -
public class localInner1{
private int data=30;//instance variable
void display(){
class Local{
void msg(){System.out.println(data);}
}
Local l=new Local();
l.msg();
}
public static void main(String args[]){
localInner1 obj=new localInner1();
obj.display();
}
}
我想我混淆了两个相似但不同的概念。 他们是:
- 内部课堂
由JLS 8.1.3定义。
内部类是一个嵌套类,它不是明确或隐式地声明为静态的。
现在我们可以看到那个
内部类可以是非静态成员类(§8.5),本地类(§14.3)或匿名类(§15.9.5)。
考虑到JLS 15.9.5并不阻止在静态上下文中声明匿名类,我们可以说class Foo
是一个inner class
,但是可以direct inner class of a class Main
或direct inner class of a class Main
inner class of a class Main
- 类或接口O的内部类
由JLS 8.1.3定义。
如果O是C的直接封闭类型声明并且C的声明不在静态上下文中,则内部类C是类或接口O的直接内部类。
类C是类或接口O的内部类,如果它是O的直接内部类或O的内部类的内部类。
任何属于这种类的类都应该出现在非静态的上下文中。 它可能是一个匿名的班级,也可能是一个地方班级等等,而这个班级并没有出现在一个有条理的环境中。
链接地址: http://www.djcxy.com/p/91987.html