当前位置: 首页 > 面试题库 >

为什么Java禁止内部类中的静态字段?

丁兴德
2023-03-14
问题内容
class OuterClass {
 class InnerClass {
  static int i = 100; // compile error
  static void f() { } // compile error
 }
} 

虽然无法使用来访问静态字段OuterClass.InnerClass.i,但是如果我想记录一些应该是静态的内容(例如,创建的InnerClass对象的数量),则使该字段静态化将很有帮助。那么,为什么 Java禁止内部类中的静态字段/方法呢?

编辑:我知道如何使编译器对静态嵌套类(或静态内部类)感到满意,但是我想知道的是为什么Java禁止从语言设计和内部类(或普通内部类)内部的静态字段/方法实施方面,如果有人对此有更多了解。


问题答案:

内部类背后的想法是在封闭实例的上下文中进行操作。以某种方式允许静态变量和方法与这种动机相矛盾?

8.1.2内部类和封闭实例

内部类是未显式或隐式声明为static的嵌套类。内部类不得声明静态初始化器(第8.7节)或成员接口。内部类不得声明静态成员,除非它们是编译时常量字段(第15.28节)。



 类似资料:
  • Spring留档指出: “如果最后两段代码实际上存在于同一个应用程序中,那么可以删除两个RowMapper匿名内部类中存在的重复,并将其提取到单个类(通常是静态内部类)中,然后根据需要由DAO方法引用。” 本例中的“最后两个片段”是使用两个具有相同逻辑的行映射器映射其调用结果的数据库方法。 我的问题是为什么内部RowMapper类需要是静态的。。。还是一定要这样?我的DAO中有一个自动连接的服务方

  • 问题内容: 在java中内部类和静态内部类有什么不同? 问题答案: 从Java教程: 嵌套类分为两类:静态和非静态。声明为静态的嵌套类简称为静态嵌套类。非静态嵌套类称为内部类。 静态嵌套类使用封闭的类名称访问: 例如,要为静态嵌套类创建一个对象,请使用以下语法: 作为内部类实例的对象存在于外部类实例中。考虑以下类别: InnerClass的实例只能存在于OuterClass的实例中,并且可以直接访

  • 问题内容: 为什么我们不能在非静态内部类中使用静态方法? 如果我将内部类设为静态,则可以工作。为什么呢 问题答案: 因为内部类的实例与外部类的实例隐式关联,所以它本身不能定义任何静态方法。由于静态嵌套类无法直接引用其封闭类中定义的实例变量或方法,因此只能通过对象引用使用它们,因此在静态嵌套类中声明静态方法是安全的。

  • 运行以下代码时,k的值为0: Jdk 1.8_181 这是我的comlier错误还是jvm错误?我找不到答案

  • 静态内部类是指使用 static 修饰的内部类。示例代码如下: 上述示例中的 Inner 类就是静态内部类。静态内部类有如下特点。 1) 在创建静态内部类的实例时,不需要创建外部类的实例。 2) 静态内部类中可以定义静态成员和实例成员。外部类以外的其他类需要通过完整的类名访问静态内部类中的静态成员,如果要访问静态内部类中的实例成员,则需要通过静态内部类的实例。 3) 静态内部类可以直接访问外部类的

  • 问题内容: 我正在浏览规范,并发现不可能在内部类中拥有不是最终编译时间常数的静态成员。 而为什么呢?为什么我们可以在内部类中拥有静态的final成员,却不能拥有static方法?它可以从其所有者类继承静态成员。但是为什么不应该呢?OOP的主要原理是什么? 问题答案: 您的课程未声明为静态。那么,它具有静态场到底意味着什么呢? 可不可能是 对于所有实例,无论封闭实例如何都一样? 对于具有相同封闭实例