我一直在刷掉我的java并且我对本地类(我最终从未使用过)有一些误解,我很清楚静态的概念,但不是本地类的情况.
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();
}
}
Run Code Online (Sandbox Code Playgroud)
这是不可能做到的:它有点含糊不清但我认为这里的静态与非静态具有相同的含义,因为静态类与静态方法相关联.我糊涂了.
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中有两种类:顶级和嵌套.
嵌套类有两种:静态嵌套和内部.
还有两种特殊的内部类:本地类和匿名类.
根据定义,本地类和匿名类是内部类,即非静态类.
本地类是非静态的,因为它们可以访问封闭块的实例成员.因此,它们不能包含大多数类型的静态声明.
但是,你已经看到了,所以让我引用JLS§14.3本地类声明:
所有本地类都是内部类(第8.1.3节).
推理(我的意见)
第一个例子有什么意义?
Run Code Online (Sandbox Code Playgroud)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");
}
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)
第二个例子也是如此.有什么意义?
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(); }
只需将类作为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类型系统作为层次结构(不要与继承/子类型混淆):