为什么方法中不允许使用静态本地类?

Ced*_*Ced 11 java oop class

我一直在刷掉我的java并且我对本地类(我最终从未使用过)有一些误解,我很清楚静态的概念,但不是本地类的情况.

1.为什么本地类不允许使用静态方法?

2.为什么方法中不允许使用静态本地类?

  1. 本地类中不允许使用静态方法:

在这里,我不明白.对我来说,本地类与静态方法main相关联.我只是不明白为什么不能这样做.方法main通过Sequence类访问,然后因为sayGoodbye是静态的,所以应该通过它的类访问它.但不是.

public class Sequence {

    public static void main(String... args) {

        class EnglishGoodbye {
            public static void sayGoodbye() { // this cannot be done
                System.out.println("Bye bye");
            }
        }
        EnglishGoodbye.sayGoodbye();
    }
}
Run Code Online (Sandbox Code Playgroud)
  1. 方法中不允许使用静态本地类:

这是不可能做到的:它有点含糊不清但我认为这里的静态与非静态具有相同的含义,因为静态类与静态方法相关联.我糊涂了.

public class Sequence {

    public static void main(String... args) {

        static class EnglishGoodbye { //static local classes not allowed
            public static void sayGoodbye() {
                System.out.println("Bye bye");
            }
        }
        EnglishGoodbye.sayGoodbye();
    }
}
Run Code Online (Sandbox Code Playgroud)

编辑: 我得到的第一个答案是来自oracle的引用:

本地类是非静态的,因为它们可以访问封闭块的实例成员.因此,它们不能包含大多数类型的静态声明.

和我的回复:

但这并没有真正解释一切.如果您有内部类,则无法访问非静态字段,但可以访问静态字段.同样应该适用于本地类,因为没有静态变量,所以它是无用的.但是在我的例子中,方法呢.

好吧,我制作了一个模式来更好地解释我如何看待事物.虽然这可能完全是错误的,但我有点羞于表现出来.在这种模式中,并在场景中静态局部类可以访问我不得不在顶部内存块的局部类.每当调用静态方法2时,它只会引用它.

在此输入图像描述

And*_*eas 11

Java中有两种类:顶级和嵌套.
嵌套类有两种:静态嵌套和内部.
还有两种特殊的内部类:本地类和匿名类.

根据定义,本地类和匿名类是内部类,即非静态类.

请参阅Java™教程 - 本地类与内部类相似:

本地类是非静态的,因为它们可以访问封闭块的实例成员.因此,它们不能包含大多数类型的静态声明.

但是,你已经看到了,所以让我引用JLS§14.3本地类声明:

所有本地类都是内部类(第8.1.3节).


推理(我的意见)

第一个例子有什么意义?

public static void main(String... args) {
    class EnglishGoodbye {
        public static void sayGoodbye() { // this cannot be done
            System.out.println("Bye bye");
        }
    }
    EnglishGoodbye.sayGoodbye();
}
Run Code Online (Sandbox Code Playgroud)

只需将方法作为private static主类:

public static void main(String... args) {
    sayGoodbye();
}
public static void sayGoodbye() {
    System.out.println("Bye bye");
}
Run Code Online (Sandbox Code Playgroud)

哦,你想从方法中访问变量和参数吗?

public static void main(String... args) {
    final String message = "Bye bye";
    class EnglishGoodbye {
        public static void sayGoodbye() { // this cannot be done
            System.out.println(message);
        }
    }
    EnglishGoodbye.sayGoodbye();
}
Run Code Online (Sandbox Code Playgroud)

问题是一个static方法没有实例上下文,那么那个实例message会是什么?

要指定实例,new EnglishGoodbye()需要一个语句,编译器将添加隐藏的实例字段来EnglishGoodbye表示值message,这也是为什么message必须(有效)最终,因为它正在复制变量的值.请记住,与C不同,您不能通过指针引用变量.

public static void main(String... args) {
    final String message = "Bye bye";
    class EnglishGoodbye {
        public void sayGoodbye() {
            System.out.println(message);
        }
    }
    new EnglishGoodbye().sayGoodbye();
}
Run Code Online (Sandbox Code Playgroud)

第二个例子也是如此.有什么意义?

public static void main(String... args) {
    static class EnglishGoodbye { //static local classes not allowed
        public static void sayGoodbye() {
            System.out.println("Bye bye");
        }
    }
    EnglishGoodbye.sayGoodbye();
}
Run Code Online (Sandbox Code Playgroud)

只需将类作为private static主类:

public static void main(String... args) {
    EnglishGoodbye.sayGoodbye();
}
private static class EnglishGoodbye {
    public static void sayGoodbye() {
        System.out.println("Bye bye");
    }
}
Run Code Online (Sandbox Code Playgroud)

与第一个示例相同的推理,如果您打算访问方法变量和参数.该类需要一个实例,以了解要访问的变量/参数的哪个实例.


并不是说它与答案直接相关,但我做了这个,所以不妨保留它.

这是Java类型系统作为层次结构(不要与继承/子类型混淆):