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

为什么在Java的内部类中限制了静态字段(不是最终的)?

邹杰
2023-03-14
问题内容

我正在浏览规范,并发现不可能在内部类中拥有不是最终编译时间常数的静态成员。

class HasStatic {
    static int j = 100;
}
class myInnerClassTest {
    class Inner extends HasStatic {
        static final int x = 3;  // OK: compile-time constant
        static int y = 4;  // Compile-time error: an inner class
    }
    static class NestedButNotInner{
        static int z = 5;    // OK: not an inner class
    }
    interface NeverInner {}   // Interfaces are never inner
}

而为什么呢?为什么我们可以在内部类中拥有静态的final成员,却不能拥有static方法?它可以从其所有者类继承静态成员。但是为什么不应该呢?OOP的主要原理是什么?


问题答案:

您的课程myInnerClassTest未声明为静态。那么,它具有静态场到底意味着什么呢?

可不可能是

  • 对于所有实例,无论封闭实例如何都一样?
  • 对于具有相同封闭实例的该内部类的所有实例,是否相同?

乍一看,大多数程序员可能会认为这是第一种情况,而(非静态)内部类的封装逻辑可能应该导致第二种选择。不管是哪种情况(或两者都有不同的修饰符),都需要一个新的定义static,可能没有必要。无论哪种情况,程序员都会对确切含义感到困惑。

从规格:

内部类是未显式或隐式声明为static的嵌套类。

内部类包括本地(第14.3节),匿名(第15.9.5节)和非静态成员类(第8.5节)。

内部类可能未声明静态初始化器(第8.7节)或成员接口,否则会发生编译时错误。

内部类不得声明静态成员,除非它们是常量变量(第4.12.4节),否则会发生编译时错误。



 类似资料:
  • 问题内容: 虽然无法使用来访问静态字段,但是如果我想记录一些应该是静态的内容(例如,创建的InnerClass对象的数量),则使该字段静态化将很有帮助。那么,为什么 Java禁止内部类中的静态字段/方法呢? 编辑:我知道如何使编译器对静态嵌套类(或静态内部类)感到满意,但是我想知道的是为什么Java禁止从语言设计和内部类(或普通内部类)内部的静态字段/方法实施方面,如果有人对此有更多了解。 问题答

  • 问题内容: 在Java中,外部类可以是public,final,default或abstract。为什么不像静态 问题答案: 外部类已经是隐式静态的。 非静态嵌套类(=内部类)意味着内部类隐式对其父类具有引用。 这就是为什么对于嵌套类,您可以区分静态和非静态。对于外部类来说,这是没有意义的。 这是一个了解静态/非静态嵌套类之间的区别的示例。您应该了解为什么在外部类中它没有意义。

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

  • 定义不可变类的策略表明 所有字段都应该是最终字段。 对于ex: 为什么一定要最终决定? 因为我没有给出setter方法吗?它不能改变。谢谢。

  • 我需要在我的应用程序中创建100个或更多的静态最终常数,我可以通过以下两种方式实现这一点: 创建一个简单的java并在该类中创建字段 创建接口时应将所有变量放入其中,因为接口中的所有字段都是隐式的 在上述方法中,我有以下问题: 哪种方法是实现这一目标的正确方法

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