为什么java中的本地类不能声明静态初始化器和成员接口

时间:2015-01-15 03:18:20

标签: java

在Java中,我们不能在本地类中声明静态初始化器或成员接口(只要有final,就可以声明静态成员,并且可以在编译时初始化)。我的问题是为什么?这个设计决定背后的理由是什么?

由于

4 个答案:

答案 0 :(得分:1)

只能从定义它们的方法或范围块内部访问本地类。

静态初始化器或接口在该上下文中没有意义

答案 1 :(得分:1)

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

这意味着任何"静态方法"这个类本质上是非静态的,因为它们可能根据它们包含在哪个对象而不同。

例如:

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(假设这一行可以编译),这是没有意义的,因为两者都应该是static

答案 2 :(得分:1)

实际上,本地类(如果non-static)是包含它的类的成员。如果一个类本身是non-static,它的实例包含在包含它的类的实例中(从技术上讲,它们使用包含它的主类的实例引用)。因此,在本地课程中使用静态初始化器是没有意义的。由于n本地类的实例数量不能共享,因为它们总是离散的。

答案 3 :(得分:0)

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