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。
答案 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的static标记中看到的那样:
静态 是在某些编程语言中用来定义 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
换句话说,如果你试图覆盖静态方法,那么将调用超类的方法。