我一直在刷掉我的java并且我对本地类(我最终从未使用过)有一些误解,我很清楚静态的概念,但不是local classes的情况。
1。为什么本地类不允许使用静态方法?
2。为什么方法中不允许使用静态本地类?
我在这里得不到它。对我来说,本地类与静态方法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();
}
}
这是不可能做到的:它有点含糊不清但我认为这里的静态与非静态具有相同的含义,因为静态类与静态方法相关联。我糊涂了。
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();
}
}
修改 我得到的第一个答案是来自oracle的引用:
本地类是非静态的,因为它们可以访问实例 封闭区块的成员。因此,它们不能包含最多 各种静态声明。
和我的回复:
但这并没有真正解释一切。当你有一个内心 class你不能访问非静态字段,但你可以访问静态 领域。同样适用于本地课程,因为没有 静态变量那么它就没用了。但是方法呢,比如我的方法 示例
好的,我制作了一个模式来更好地解释我如何看待事物。虽然这可能完全是错误的,但我有点羞于表现出来。在此模式中以及可以访问静态本地类 的场景中,我在顶部内存块中有一个本地类。每当调用静态方法2时,它只会引用它。
答案 0 :(得分:11)
Java中有两种类:顶级和嵌套 嵌套类有两种:静态嵌套和内部 还有两种特殊的内部类:本地和匿名。
本地和匿名类按照定义是 内部类,即非静态类。
请参阅The Java™ Tutorials - Local Classes Are Similar To Inner Classes:
本地类是非静态的,因为它们可以访问封闭块的实例成员。因此,它们不能包含大多数静态声明。
但是,你已经看到了,所以让我引用JLS §14.3 Local Class Declarations:
所有本地类都是内部类(§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(); }
只需将方法设为主类的private static
:
public static void main(String... args) {
sayGoodbye();
}
public static void sayGoodbye() {
System.out.println("Bye bye");
}
哦,你想从方法中访问变量和参数吗?
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();
}
问题是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();
}
第二个例子也是如此。有什么意义?
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(); }
只需将课程设为主要课程的private static
:
public static void main(String... args) {
EnglishGoodbye.sayGoodbye();
}
private static class EnglishGoodbye {
public static void sayGoodbye() {
System.out.println("Bye bye");
}
}
与第一个示例相同的推理,如果您打算访问方法变量和参数。该类需要一个实例,以了解要访问的变量/参数的哪个实例。
并不是说它与答案直接相关,但我做了这个,所以不妨保留它。
这是Java类型系统作为层次结构(不要与继承/子类型混淆):