Java 为什么静态块允许调用父类静态方法而不使用父类引用?
据我所知,通常应该使用类的引用来调用静态方法,或者如果它位于静态方法或静态块中,则可以直接调用它而无需引用 但当从子类静态块调用静态方法时,这是否适用 为什么它允许这样的事情,因为静态方法不是继承的,应该只允许使用父类名称对吗Java 为什么静态块允许调用父类静态方法而不使用父类引用?,java,static-methods,static-block,Java,Static Methods,Static Block,据我所知,通常应该使用类的引用来调用静态方法,或者如果它位于静态方法或静态块中,则可以直接调用它而无需引用 但当从子类静态块调用静态方法时,这是否适用 为什么它允许这样的事情,因为静态方法不是继承的,应该只允许使用父类名称对吗 public abstract class abs { /** * @param args */ abstract void m(); static void n(){ System.out.println("
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();
}
}
为什么我的子类静态块可以在没有引用或类名的情况下调用父类静态方法?静态方法
n()
由子类myclass
继承,因此您可以在myclass
的静态块中直接调用它,因为您继承了父类,您可以直接访问该类的所有非私有成员,就像它属于子类一样
通常,静态方法应该使用类的引用或
如果它位于静态方法中,则可以直接调用它而无需引用
或静态块
不是真的。例如,一个实例方法可以调用一个静态方法,而不必给类加前缀
更一般地说,静态
成员(字段作为方法)只能通过在其类前面加前缀来调用,因为编译器无法推断它们所属的类。当您从子类调用父类中定义的静态方法时(静态方法在子类中继承),您不需要在方法调用的类前面加前缀,因为编译器推断。超类的所有成员都由子类继承,子类也包括静态方法
class SuperClassA {
static void superclassmethod() {
System.out.println("superclassmethod in Superclass ");
}
}
public class SubClassA extends SuperClassA {
static {
superclassmethod();
}
public static void main(String[] args) {
}
}
但是当超类的静态方法被重写时,它隐藏了超类静态方法,而不是重写它
为什么允许这样的事情
通过继承
因为静态方法不会被继承
你一直这么说。你错了。发件人:
类C从其直接超类继承了超类的所有具体方法m(包括static
和instance),对于这些方法,以下所有条件均为真:
继续请参见。静态方法是继承的。看看Java中的静态方法继承,它是否违反了“静态属于类,因此无法继承”的整个概念?@Amarnatharish,特别是“与继承的静态(类)方法和继承的非静态(实例)唯一的区别”方法是,当您使用相同的签名编写新的静态方法时,旧的静态方法只是隐藏,而不是重写sense@amarnathharish没有这样的概念。你错了。好吧,我有一个问题,如果静态方法被继承了,那么如果我的子类中还有另一个具有相同方法签名的静态方法呢?编译器将如何解决这个问题?在这种情况下,子类中定义的方法将隐藏(而不是覆盖)父类中定义的方法。请注意,这通常是一种不好的做法。没有任何前缀,在类上下文中,编译器将选择当前类的方法。不存在重写静态方法的情况。@EJP我的意思是,如果在子类中编写一个静态方法,该方法的名称与中存在的静态方法的名称相同超类,则在这种情况下,子类方法不会重写超类静态方法,但它隐藏了超类静态方法。当运行时多态性是静态方法时,它也不会被应用。