美文网首页
Java解惑48

Java解惑48

作者: 猴猴猪027 | 来源:发表于2017-06-29 14:25 被阅读0次

    看代码

    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。

    教训

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

    相关文章

      网友评论

          本文标题:Java解惑48

          本文链接:https://www.haomeiwen.com/subject/cbvmcxtx.html