理解Java中的本地类

时间:2015-01-04 07:41:13

标签: java class

众所周知,本地课程是内部课程。 JLS 14.3

  

所有本地类都是内部类(第8.1.3节)。

内在的是什么

JLS 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
}

DEMO

尽管在静态上下文中声明,但Foo类的声明很好。虽然在静态上下文中声明内部类是不可能的。

4 个答案:

答案 0 :(得分:2)

在名为 local 类的块中定义的类,它们可以出现在方法块的任何位置。详细了解official docs - Local Classes

  

本地类是在块中定义的类,它是一个   平衡括号之间的零个或多个语句的组。您   通常可以找到方法体中定义的本地类。

您的案例有一个非常相似的例子。

您还可以看到JLS - 14.3. Local Class Declarations

  

local 类是一个嵌套类(§8),它不是任何类的成员   并且有一个名称(§6.2§6.7)。

答案 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 Fooinner 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

本地类在代码块中声明,并且只在该块中可见,就像任何其他方法变量一样。