在静态上下文中定义的本地 类 中使用 this 和 super
Use of this and super within local classes defined in a static context
我在研究 Java 本地 classes 时正在研究以下代码 :-
class A {
protected int one;
}
class Outer {
static void staticMethod(){
class InnerLocal extends A {
double first = this.one;
double second = super.one;
}
}
}
我的疑问是,当我们将本地 classes 声明为静态方法或静态初始化程序块的内部时,它们隐式地作为静态成员 classes 工作,因为它们不需要外部 class 实例化它们。但是我清楚地知道静态成员 class 和静态本地 class 之间的区别(即在静态块中定义的内部 class ),问题是 Java 不允许对象引用 'this' 和 'super' 用于静态上下文,但上面的代码编译完美。
谁能告诉我为什么 Java 编译器在上述情况下不抱怨在静态上下文中使用 'this' 和 'super' 的原因?谢谢!:)
Java does not allows the object references this
and super
to be used in static context but the code above compiles perfectly.
static
与 "static class" 中的 不同 与 "static context" 中的 static
相同。
所有实例方法和构造函数都可以访问 this
和 super
。由于构造函数可以访问 this
和 super
,因此实例字段的初始化程序也可以访问 this
和 super
。静态内部 class 没有 outer 实例,但它有自己的实例。那就是this
所指的。
相比之下,静态方法无法访问this
和super
,无论在class中定义了这些静态方法(top-level,static inner , non-static 内部、匿名等)
My doubt is that when we declare the local classes inner to static method or static initializer block then they implicitly work as static member classes as they need no outer class to instantiate them
这是您困惑的根本原因。仅仅因为方法是 static
并不意味着方法中声明的任何内容也是 static
。如果在 static
方法中声明一个变量(例如 int a
),则称它为局部变量。说 a
是方法局部 static
变量是没有意义的。同样,说 InnerLocal
是局部方法 static
class 也是没有意义的。 (Java中没有static
局部变量)
InnerLocal
因此是从 A
扩展的常规 class 并从 A
继承 a
成员变量并且能够访问它通过 this
或通过 super
。了解 final
是唯一可以在 Java.
中的方法中使用的修饰符 non-access 也会有所帮助
我在研究 Java 本地 classes 时正在研究以下代码 :-
class A {
protected int one;
}
class Outer {
static void staticMethod(){
class InnerLocal extends A {
double first = this.one;
double second = super.one;
}
}
}
我的疑问是,当我们将本地 classes 声明为静态方法或静态初始化程序块的内部时,它们隐式地作为静态成员 classes 工作,因为它们不需要外部 class 实例化它们。但是我清楚地知道静态成员 class 和静态本地 class 之间的区别(即在静态块中定义的内部 class ),问题是 Java 不允许对象引用 'this' 和 'super' 用于静态上下文,但上面的代码编译完美。
谁能告诉我为什么 Java 编译器在上述情况下不抱怨在静态上下文中使用 'this' 和 'super' 的原因?谢谢!:)
Java does not allows the object references
this
andsuper
to be used in static context but the code above compiles perfectly.
static
与 "static class" 中的 不同 与 "static context" 中的 static
相同。
所有实例方法和构造函数都可以访问 this
和 super
。由于构造函数可以访问 this
和 super
,因此实例字段的初始化程序也可以访问 this
和 super
。静态内部 class 没有 outer 实例,但它有自己的实例。那就是this
所指的。
相比之下,静态方法无法访问this
和super
,无论在class中定义了这些静态方法(top-level,static inner , non-static 内部、匿名等)
My doubt is that when we declare the local classes inner to static method or static initializer block then they implicitly work as static member classes as they need no outer class to instantiate them
这是您困惑的根本原因。仅仅因为方法是 static
并不意味着方法中声明的任何内容也是 static
。如果在 static
方法中声明一个变量(例如 int a
),则称它为局部变量。说 a
是方法局部 static
变量是没有意义的。同样,说 InnerLocal
是局部方法 static
class 也是没有意义的。 (Java中没有static
局部变量)
InnerLocal
因此是从 A
扩展的常规 class 并从 A
继承 a
成员变量并且能够访问它通过 this
或通过 super
。了解 final
是唯一可以在 Java.