Java 为什么编译时常量可以在非静态内部类中设置为静态?

Java 为什么编译时常量可以在非静态内部类中设置为静态?,java,static,inner-classes,Java,Static,Inner Classes,假设我们有如下代码 public class Outer{ class Inner{ public static final String s = "abc"; } static class Nested{ public static final SomeOtherClass instance = new SomeOtherClass(); } } 我知道要实例化非静态内部类的对象,需要外部类的对象静态表示与类相关,访问它不需要

假设我们有如下代码

public class Outer{
    class Inner{
        public static final String s = "abc";
    }
    static class Nested{
        public static final SomeOtherClass instance = new SomeOtherClass();
    }
} 
我知道要实例化非静态内部类的对象,需要外部类的对象<代码>静态表示与类相关,访问它不需要实例化对象。非静态内部类只能在外部类的对象实例化后使用。在其中包含任何静态引用可能没有意义

我的问题是:

  • 非静态内部类是否可以在没有外部类的任何显式对象的情况下加载

  • 为什么编译时常量(字符串文本,因为它们在字符串池和基元类型中以特殊方式处理)允许在非静态内部类中设置为静态


  • 编辑:为什么不能将非编译时常量设置为静态,我知道它是根据JLS设置的,但我只想知道会出什么问题,制定此规则的意图是什么。问题1-在没有外部类的任何显式对象的情况下是否可以加载非静态内部类

    是的,您可以通过这种方式加载非静态内部类,请参见下面的示例:

    class MyObject {
        class InnerObject {
            static final String prop = "SOME INNER VALUE";
        }
    
        static void doLoad() {
            System.out.println(InnerObject.prop);
        }
    }
    
    问题是这样做的原因不多,因为非静态内部类不允许有任何静态块、方法、字段(如果这些不是最终的,如下面的问题所示)

    问题2-为什么编译时常量(字符串文本,因为它们在字符串池和基元类型中以特殊方式处理)可以在非静态内部类中设置为静态

    Java
    的设计目的是让您可以在非静态内部类中使用
    static
    final
    字段

  • 非静态内部类是否可以在没有外部类的任何显式对象的情况下加载
  • 对。创建内部类的实例需要外部类的实例。但这两个类都可以在创建任何实例之前加载

  • 为什么我们可以让编译时常量(字符串文本,因为它们在字符串池和基元类型中以特殊方式处理)在非静态内部类中成为静态的
  • 语言规范允许常量变量出现此异常。从:

    如果内部类声明的成员是显式或隐式静态的,则这是编译时错误,除非该成员是常量变量(§4.12.4)

    和字符串变量可以是常量,因为第节:

    常量变量是使用常量表达式(§15.28)初始化的基元类型或字符串类型的最终变量


    我认为你在第一季度回答了错误的问题。OP询问的是非静态内部类,而不是静态内部类。相关:感谢Andy的回答,我已经编辑了我的问题:为什么不能将非常量设置为静态,我知道这是根据JLS,但我只想知道会出现什么问题,制定此规则的意图是什么。@nits.kk-对于你的第三个问题,我没有一个明确的答案。以前在这个网站和其他地方都有人问过这个问题。我所看到的只是猜测或误解。例如,请参阅。您在sentense中所说的“加载”是什么意思“但在创建任何实例之前都可以加载这两个类。”。它与“创造”不同吗?根据=,我们只能从外部类实例创建内部类实例:
    OuterClass.InnerClass innerObject=outerObject.new InnerClass()@anir-在使用类之前,必须先将其删除。加载后,可以创建多个实例。