对静态方法进行Upcasting效果?

时间:2012-08-25 19:18:50

标签: java upcasting

为什么当我们在base和derive类中将方法声明为static并进行upcast时,它会调用基类方法。

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();           
    }
}

3 个答案:

答案 0 :(得分:6)

这里有几个问题需要提及:

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

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

答案 1 :(得分:2)

您正在呼叫Base.show,而不是Derive.show。方法隐藏不会覆盖。

§8.4.8.2. of the Java Language Specification给出了一个示例,详细说明了这里发生的事情:

  

隐藏的类(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,在运行时计算要调用的实例方法。

答案 2 :(得分:1)

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