为什么静态方法不会在Java中被覆盖?

时间:2014-08-06 00:43:08

标签: java oop static override static-methods

class A{

    public static void staticMethod(){
     System.out.println("Static method of A");
    }
}

class B extends A{

    public static void staticMethod(){
     System.out.println("Static method of B");
    }
}

class TestStaticOverride{

    public static void main(String args[]){
     B b=new B();
     A a=b;
     a.staticMethod();
    }
}

输出是"静态方法A" 。因此,不会覆盖静态方法,否则输出将是" B"的静态方法。如何在运行时JVM决定调用类A的静态方法而不是B。

5 个答案:

答案 0 :(得分:2)

修改 当您调用静态方法时,无论是通过实例还是在类级别,编译器都会将其识别为静态,因此将其视为类级别而非对象级别。这意味着该方法将不知道调用该方法的对象的状态。如果使用对象来调用方法(例如在您的示例中),则编译器将只能根据声明的对象知道要调用的方法A或B.如果它被实例化为一个不同的子类,它就不重要了,因为它是一个静态方法,它没有对象的概念。所以,在你的例子中,这就是为什么它会调用A的静态方法而不是B' s。

希望这是我之前所拥有的更明确的解释

答案 1 :(得分:2)

静态方法在编译时解析,这就是为什么它们被绑定到定义它们的类,而不是实例。所以它们属于一个类,而不是一个实例,这就是为什么另一个名称是一个"类方法"。您可以根据Java语法从实例调用静态方法,但它始终被视为您从类中调用它,例如

A a;
a = [no matter what];
a.static_method();

完全相同:

A.static_method()

无论您分配给' a'。

的价值

答案 2 :(得分:1)

虽然有可能,但不建议从实例调用静态方法。

A a = new B();
a.staticMethod();

一个好的实践是直接从它所在的位置调用它:

A.staticMethod();

注意:我认为您可以在IDE上配置警告消息。


正如您在StackOverflow的标记中看到的那样:

  

静态 在某些编程语言中用来定义 a的术语   功能或数据存储区域(字段)未绑定到任何   特定对象实例

答案 3 :(得分:1)

这是不好的做法,因为JVM不会理解你试图给出的指示,而且想象你的OO会是多么糟糕?

例如:

class A{

public static void met(){
System.out.println("Class A");
}
}

class B extends A{

//Override
public static void met(){
System.out.println("Class B");
}

}

let's make a Polymorphism:

A a=new A();
A b=new B();

a.meth();//Class A
b.meth();//Class A !!! <===(Was Expected to be Class B)

答案 4 :(得分:-1)

您无法覆盖静态方法。如果在staticMethod()中删除 static ,则在调用a.staticMethod()时,将调用B类中的staticMethod()。

class A {
public void staticMethod() {
    System.out.println("Static method of A");
}
}

class B extends A {
    public void staticMethod() {
        System.out.println("Static method of B");
    }
}

class Main {
    public static void main(String args[]) {
        B b = new B();
        A a = b;
        a.staticMethod();
    }
}

// Result: Static method of B

换句话说,如果你试图覆盖静态方法,那么将调用超类的方法。