为什么当我们在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();
}
}
答案 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()
来明确该方法是静态方法。当您隐藏方法而不是覆盖方法时,这对您的情况特别有用。