Java解惑48

2017-06-29  本文已影响0人  猴猴猪027

看代码

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。

教训

静态方法,用类来标示;表达式被用作实例方法的修饰符。调用一个静态方法时,通常都是用一个类而不是表达式来标示它。

上一篇下一篇

猜你喜欢

热点阅读