众所周知,本地课程是内部课程。 JLS 14.3
所有本地类都是内部类(第8.1.3节)。
内在的是什么
内部类C是类或接口O的直接内部类,如果 O是C的直接封闭类型声明 C的声明不会发生在静态上下文中。
C类是类的内部类或接口O,如果它是a 直接O的内部类或O的内部类的内部类。
这意味着不应在非静态上下文中声明内部类的声明。但请考虑以下计划:
public static void main (String[] args) throws java.lang.Exception
{
class Foo{ } //occured in the static-context
}
尽管在静态上下文中声明,但Foo
类的声明很好。虽然在静态上下文中声明内部类是不可能的。
答案 0 :(得分:2)
在名为 local 类的块中定义的类,它们可以出现在方法块的任何位置。详细了解official docs - Local Classes:
本地类是在块中定义的类,它是一个 平衡括号之间的零个或多个语句的组。您 通常可以找到方法体中定义的本地类。
您的案例有一个非常相似的例子。
您还可以看到JLS - 14.3. Local Class Declarations:
答案 1 :(得分:2)
本地类是在块中定义的类,它是平衡大括号之间的一组零个或多个语句。您通常会在方法体中找到定义的本地类。
请参阅此oracle link
本地类与内部类相似,因为它们无法定义或声明任何静态成员。静态方法中的本地类,例如在静态方法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();
}
}
答案 2 :(得分:2)
我想我混淆了两个相似但不同的概念。他们是:
- 内部课程
由JLS 8.1.3定义。
内部类是一个非显式或隐式的嵌套类 声明静态。
现在我们可以看到,
内部类可以是非静态成员类(第8.5节),本地类 (§14.3),或匿名类(§15.9.5)。
考虑到JLS 15.9.5不会阻止在静态上下文中声明匿名类,我们可以说class Foo
是inner class
,但是netiher {{1} } direct inner class of a class Main
- 类或接口O的内部类
由JLS 8.1.3定义。
内部类C是类或接口O的直接内部类,如果 O是C的直接封闭类型声明 C的声明不会发生在静态上下文中。
如果类是C,则类C是类或接口O的内部类 直接O的内部类或O的内部类的内部类。
属于这种类的任何类都应该出现在非静态上下文中。它可能是一个匿名类,也可能是一个本地类等等,它们并没有出现在staic环境中。
答案 3 :(得分:1)
Inner Class是其他类中的类嵌套。普通类是包的直接成员,是顶级类。 java有四种类型的内部类,即
Static member classes
Member classes
Local classes
Anonymous classes
本地类在代码块中声明,并且只在该块中可见,就像任何其他方法变量一样。