为什么我的静态块允许在不使用 parentclass 引用的情况下调用 parent class 静态方法?
Why does my static block allows to call parent class static method without using parentclass reference?
据我了解,通常应该使用class的引用来调用静态方法,或者如果它在静态方法或静态块中,则可以直接调用而无需引用。
但这是否适用于从 child class 静态块调用静态方法时?
为什么它允许这样的事情,因为静态方法不是继承的,它应该只允许使用 parent class 名称对吗?
public abstract class abs {
/**
* @param args
*/
abstract void m();
static void n(){
System.out.println("satic method");
}
public static void main(String[] args) {
// TODO Auto-generated method stub
}
}
class myclass extends abs{
@Override
void m() {
// TODO Auto-generated method stub
}
static{
n();
}
}
为什么我的 child class 静态块可以在没有引用或 class 名称的情况下调用 parent class 静态方法?
静态方法n()
被子类myclass
继承,所以可以在myclass
.
的静态块中直接调用
因为您继承了父 class,您可以直接访问该 class 的所有非私有成员,就好像它属于子 class。
Usually the static method should be called using class's reference or
it can be called directly without reference if its in a static method
or static block.
不是真的。例如,一个实例方法可以调用一个静态方法而无需前缀 class。
更一般地说,static
成员(字段作为方法)必须通过在它们的 class 前面加上前缀来调用,因为编译器无法推断出它们所属的 class。
当您从子 class 调用父 class 中定义的静态方法时(静态方法在子 class 中继承),您不需要在 class 作为编译器推断的方法调用。
超类的所有成员都被子类继承,其中也包括静态方法。
class SuperClassA {
static void superclassmethod() {
System.out.println("superclassmethod in Superclass ");
}
}
public class SubClassA extends SuperClassA {
static {
superclassmethod();
}
public static void main(String[] args) {
}
}
但是当超类的静态方法被覆盖时,它隐藏了超类的静态方法而不是覆盖它。
Why it allows such thing
通过继承。
as static methods are not inherited
你一直这么说。你错了。来自 JLS #8.4.8:
A class C inherits from its direct superclass all concrete methods m (both static
and instance) of the superclass for which all of the following are true: ...
继续阅读here。
据我了解,通常应该使用class的引用来调用静态方法,或者如果它在静态方法或静态块中,则可以直接调用而无需引用。
但这是否适用于从 child class 静态块调用静态方法时?
为什么它允许这样的事情,因为静态方法不是继承的,它应该只允许使用 parent class 名称对吗?
public abstract class abs {
/**
* @param args
*/
abstract void m();
static void n(){
System.out.println("satic method");
}
public static void main(String[] args) {
// TODO Auto-generated method stub
}
}
class myclass extends abs{
@Override
void m() {
// TODO Auto-generated method stub
}
static{
n();
}
}
为什么我的 child class 静态块可以在没有引用或 class 名称的情况下调用 parent class 静态方法?
静态方法n()
被子类myclass
继承,所以可以在myclass
.
因为您继承了父 class,您可以直接访问该 class 的所有非私有成员,就好像它属于子 class。
Usually the static method should be called using class's reference or it can be called directly without reference if its in a static method or static block.
不是真的。例如,一个实例方法可以调用一个静态方法而无需前缀 class。
更一般地说,static
成员(字段作为方法)必须通过在它们的 class 前面加上前缀来调用,因为编译器无法推断出它们所属的 class。
当您从子 class 调用父 class 中定义的静态方法时(静态方法在子 class 中继承),您不需要在 class 作为编译器推断的方法调用。
超类的所有成员都被子类继承,其中也包括静态方法。
class SuperClassA {
static void superclassmethod() {
System.out.println("superclassmethod in Superclass ");
}
}
public class SubClassA extends SuperClassA {
static {
superclassmethod();
}
public static void main(String[] args) {
}
}
但是当超类的静态方法被覆盖时,它隐藏了超类的静态方法而不是覆盖它。
Why it allows such thing
通过继承。
as static methods are not inherited
你一直这么说。你错了。来自 JLS #8.4.8:
A class C inherits from its direct superclass all concrete methods m (both
static
and instance) of the superclass for which all of the following are true: ...
继续阅读here。