为什么java中的本地类可以';t声明静态初始值设定项和成员接口

为什么java中的本地类可以';t声明静态初始值设定项和成员接口,java,Java,在Java中,我们不能在本地类中声明静态初始值设定项或成员接口(可以声明静态成员,前提是存在final,并且可以在编译时初始化)。我的问题是为什么?此设计决策背后的基本原理是什么 感谢本地类只能从定义它们的方法或作用域块内部访问 静态初始值设定项或接口在上下文中没有意义只能从定义它们的方法或作用域块内部访问本地类 静态初始值设定项或接口在上下文中没有意义只能从定义它们的方法或作用域块内部访问本地类 静态初始值设定项或接口在上下文中没有意义只能从定义它们的方法或作用域块内部访问本地类 静态初始值设

在Java中,我们不能在本地类中声明静态初始值设定项或成员接口(可以声明静态成员,前提是存在final,并且可以在编译时初始化)。我的问题是为什么?此设计决策背后的基本原理是什么


感谢

本地类只能从定义它们的方法或作用域块内部访问


静态初始值设定项或接口在上下文中没有意义

只能从定义它们的方法或作用域块内部访问本地类


静态初始值设定项或接口在上下文中没有意义

只能从定义它们的方法或作用域块内部访问本地类


静态初始值设定项或接口在上下文中没有意义

只能从定义它们的方法或作用域块内部访问本地类


静态初始值设定项或接口在该上下文中毫无意义

我认为内部类从定义上讲是非静态的,因为它们可以访问它们所包含的类的非静态成员

这意味着该类的任何“静态方法”本质上都是非静态的,因为它们可能根据包含它们的对象而有所不同

例如:

public class Container {
    public int x;
    public class Contained {
        static int x = Container.this.x;
    }
}
如果已编译此文件,则可以执行以下操作:

Container a = new Container();
a.x = 1;
Container b = new Container();
b.x = 2;

然后
a.Contained.x!=b、 Contained.x(假设这一行可以编译),这没有意义,因为这两个类都应该是
静态的
我认为内部类在定义上是非静态的,因为它们可以访问它们所包含的类的非静态成员

这意味着该类的任何“静态方法”本质上都是非静态的,因为它们可能根据包含它们的对象而有所不同

例如:

public class Container {
    public int x;
    public class Contained {
        static int x = Container.this.x;
    }
}
如果已编译此文件,则可以执行以下操作:

Container a = new Container();
a.x = 1;
Container b = new Container();
b.x = 2;

然后
a.Contained.x!=b、 Contained.x(假设这一行可以编译),这没有意义,因为这两个类都应该是
静态的
我认为内部类在定义上是非静态的,因为它们可以访问它们所包含的类的非静态成员

这意味着该类的任何“静态方法”本质上都是非静态的,因为它们可能根据包含它们的对象而有所不同

例如:

public class Container {
    public int x;
    public class Contained {
        static int x = Container.this.x;
    }
}
如果已编译此文件,则可以执行以下操作:

Container a = new Container();
a.x = 1;
Container b = new Container();
b.x = 2;

然后
a.Contained.x!=b、 Contained.x(假设这一行可以编译),这没有意义,因为这两个类都应该是
静态的
我认为内部类在定义上是非静态的,因为它们可以访问它们所包含的类的非静态成员

这意味着该类的任何“静态方法”本质上都是非静态的,因为它们可能根据包含它们的对象而有所不同

例如:

public class Container {
    public int x;
    public class Contained {
        static int x = Container.this.x;
    }
}
如果已编译此文件,则可以执行以下操作:

Container a = new Container();
a.x = 1;
Container b = new Container();
b.x = 2;

然后
a.Contained.x!=b、 包含.x(假设这一行可以编译),这没有意义,因为它们都应该是
静态的
,我不确定,但我最好的猜测是,他们选择不这样做,因为时间会有问题。在普通类中,静态初始值设定项在任何其他代码运行之前运行。它们在任何类型的成员之前运行。本地类中的静态初始值设定项需要访问本地变量,但显然,在运行封闭代码之前,这些变量不存在。它们可能会选择让本地类在封闭块执行时运行其初始值设定项,但他们可能担心,由于这与普通类的计时完全不同,这可能会导致程序员对何时运行本地类的静态初始值设定项产生混淆,或者可能会导致虚拟机出现技术问题,因为在运行这些类的静态成员时,必须使用特殊情况运行。

我不确定,但我最好的猜测是他们选择不运行,因为时间安排会有问题。在普通类中,静态初始值设定项在任何其他代码运行之前运行。它们在任何类型的成员之前运行。本地类中的静态初始值设定项需要访问本地变量,但显然,在运行封闭代码之前,这些变量不存在。它们可能会选择让本地类在封闭块执行时运行其初始值设定项,但他们可能担心,由于这与普通类的计时完全不同,这可能会导致程序员对何时运行本地类的静态初始值设定项产生混淆,或者可能会导致虚拟机出现技术问题,因为在运行这些类的静态成员时,必须使用特殊情况运行。

我不确定,但我最好的猜测是他们选择不运行,因为时间安排会有问题。在普通类中,静态初始值设定项在任何其他代码运行之前运行。它们在任何类型的成员之前运行。本地类中的静态初始值设定项需要访问本地变量,但显然,在运行封闭代码之前,这些变量不存在。它们可能会选择让本地类在封闭块执行时运行其初始值设定项,但他们可能担心,由于这与普通类的计时完全不同,这可能会导致程序员对何时运行本地类的静态初始值设定项产生混淆,或者可能会导致虚拟机出现技术问题,因为在运行这些类的静态成员时,必须使用特殊情况运行。

我不确定,但我最好的猜测是他们选择不运行,因为时间安排会有问题。在普通类中,静态初始值设定项在任何其他代码运行之前运行。