了解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 Maindirect 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

上一篇: Understanding local classes in Java

下一篇: Anonymous classes enclosing instances