看代码
public class Bark {
public static void main(String[] args){
Dog woofer=new Dog();
Dog nipper=new Basenji();
woofer.bark();
nipper.bark();
}
}
class Dog{
public static void bark(){
System.out.println("woof");
}
}
class Basenji extends Dog{
public static void bark(){}
}
最后的打印结果是woof woof
解释
如果方法不是静态的,子类中进行重写,预示着要根据进行动态的分派;如果方法是静态的,子类与父类有相同的方法签名,方法只能被隐藏。(千万不要隐藏静态方法)
当一个静态方法被调用时,被调用的方法都是在编译时被选定的,这种选定是基于修饰符的编译器类型作出的,修饰符的编译器类型是方法表用表达式中圆点左边部分的名字。
在本例中,方法调用的修饰符分别是woofer和nipper,他们都被声明为Dog类型。所以编译器使它们调用的是相同的方法:Dog.bark。
教训
静态方法,用类来标示;表达式被用作实例方法的修饰符。调用一个静态方法时,通常都是用一个类而不是表达式来标示它。
网友评论