0

为什么当我们在基类和派生类中将方法声明为静态并进行向上转换时,它会调用基类方法。

class Base
{
    static void show(){
        System.out.println("Base class....");
    }
}
class Derive extends Base
{
    static void show(){
        System.out.println("Drive class....");
    }//method hidding.....

    public static void main(String[] args) 
    {
        Base b= new Derive();
            b.show();           
    }
}
4

3 回答 3

6

这里有几个问题需要提一下:

  • 静态方法不被子类继承和覆盖
  • 静态方法不需要调用实例,它们需要一个类

所以,基本上,调用b.show();实际上意味着调用Base.show();

于 2012-08-25T19:21:55.893 回答
2

你打电话Base.show,不是Derive.show。方法隐藏不是覆盖。

§8.4.8.2。Java 语言规范的 给出了一个示例,该示例准确地演示了此处发生的情况:

可以通过使用类型是实际包含该方法声明的类的引用来调用隐藏的 class ( static) 方法。在这方面,static方法的隐藏不同于实例方法的覆盖。这个例子:

class Super {
    static String greeting() { return "Goodnight"; }
    String name() { return "Richard"; }
}
class Sub extends Super {
    static String greeting() { return "Hello"; }
    String name() { return "Dick"; }
}
class Test {
    public static void main(String[] args) {
        Super s = new Sub();
        System.out.println(s.greeting() + ", " + s.name());
    }
}

产生输出:

Goodnight, Dick

因为 greeting 的调用使用 的类型s,即Super在编译时确定要调用哪个类方法,而 的调用name使用 的类s,即Sub在运行时确定要调用哪个实例方法调用。

于 2012-08-25T19:24:06.963 回答
1

只需完成以上答案即可。最好通过类而不是实例变量来调用类方法:Base.show() 不要b.show()明确该方法是静态方法。当您隐藏方法而不是覆盖它时,这在您的情况下特别有用。

于 2012-08-25T19:39:55.067 回答