当前位置: 首页 > 知识库问答 >
问题:

理解Java中的本地类

萧业
2023-03-14

众所周知,局部类是内部类。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
}

演示

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

共有3个答案

公西俊能
2023-03-14

我想我混淆了两个相似但不同的概念。他们是:

--内部阶级

由JLS 8.1.3定义。

内部类是不是显式或隐式声明为静态的嵌套类。

现在我们可以看到

内部类可以是非静态成员类(§8.5)、本地类(§14.3)或匿名类(§15.9.5)。

考虑到JLS 15.9.5不阻止在静态上下文中声明匿名类,我们可以说类Foo是一个内部类,但是netiher类Main的直接内部类也不是类的内部类Main

--类或接口O的内部类

由JLS 8.1.3定义。

如果O是C的直接封闭类型声明,并且C的声明不在静态上下文中出现,则内部类C是类或接口O的直接内部类。

类C是类或接口O的内部类,如果它是O的直接内部类或O的内部类的内部类。

属于此类类的任何类都应该出现在非静态上下文中。它可以是一个匿名类,也可以是一个本地类,等等,这在staic上下文中没有出现。

王炜
2023-03-14

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

请参阅此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();  
 }  
}
顾超
2023-03-14

在称为本地类的块中定义的类,它们可以出现在方法块的任何地方。阅读更多官方文档-本地课程:

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

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

您还可以看到JLS-14.3。本地类声明:

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

 类似资料:
  • 示例: [1,“Desc”,...,...,1] [1,“Desc”,...,...,2] 稍后,我想对的这个执行一些操作: [[1,“Desc”,...,...,1],[1,“Desc”,...,...,2],...] 并且我正在尝试以以下方式使用Stream.Map: 我如何打印,然后开始对列表中的每个项执行操作?

  • 我无法理解为什么这个命令不起作用: 注意:我已经用把上面的链接本地地址弄错了,但我有一些有效的链接本地ipv6地址是端口号。 我得到了一个错误: 我也试着放单引号/双引号,但结果是同样的错误: 我使用的是OpenSSL 1.1.0f版本,它应该支持IPv6。 使用IPv4地址,它可以工作。

  • 问题内容: 为什么花括号没有在Java中定义单独的本地范围?我期望这是主要花括号语言(C,C ++,Java,C#)所共有的功能。 问题答案: 它们确实定义了单独的局部作用域,但是您仍然不能从父作用域中屏蔽局部变量(但是您当然可以屏蔽实例变量)。 但是您可以定义新变量(使用不同的名称),并且它们的范围将限于括号内。

  • 我在服务器上执行如下命令: netstat -anp | grep 6379 查看redis的6379端口情况,结果如下所示: 上面的192.168.0.11是内网地址,41.92.250.40是公网地址(当然为了安全我这边是随便改了不是真实的地址) 阿某云买的服务器,上面有两个ip 41.92.250.40(公) 192.168.0.11(私有) 现在我对Local Address 本地地址还有

  • 问题内容: 使用Java或使用该功能的任何其他语言的本地类的优点是什么? 问题答案: 它们使您可以从父类中提取逻辑并对其进行对象化。这会将功能从不属于它的地方删除,并将其放入自己的类中。但是,如果仅在很短的时间内(仅在单个代码块的持续时间内)需要此新对象,该怎么办?好吧,这就是地方课程适合的地方。

  • 当我们在spring中使用@autowire注释对对象进行克里特化时,是否必须在configuration类中指定bean?那么@Autowired在Springboot中是如何工作的呢?