为什么静态方法不允许重写父类?

时间:2018-02-13 22:05:00

标签: java inheritance static

这是我正在处理的代码:

class Animal {

    public void hide() {
        System.out.println("The hide method in Animal.");
    }

    public void override() {
        System.out.println("The override method in Animal.");
    }

    public static void clank()
    {
        System.out.println("Clank in Animal");
    }
}

public class Cat extends Animal {

    public void hide() {
        System.out.println("The hide method in Cat.");
    }

    public void override() {
        System.out.println("The override method in Cat.");
    }

    public static void clank()
    {
        System.out.println("Clank in Cat");
    }

    public static void main(String[] args) {
        Cat myCat = new Cat();
        Animal myAnimal = new Cat();
        myAnimal.hide();
        myAnimal.override();
        myAnimal.clank();
    }
}

此代码的输出为:

The hide method in Cat.
The override method in Cat.
Clank in Animal

为什么将两个clank方法声明为静态不允许覆盖Animal中的clank?输出应该是“Clank in Cat”吗?谢谢!

1 个答案:

答案 0 :(得分:0)

静态方法是类方法,它们不需要调用任何实例。在编译期间始终解决对它们的访问。因此,在这种情况下,由于myAnimal的编译时类型为Animal,因此调用myAnimal.clank()等于Animal.clank()。但是,如果您撰写Cat myAnimal = new Cat();然后致电myAnimal.clank(),您将获得Clank in Cat

Java documentation

  

静态方法,在声明中包含static修饰符,   应该使用类名调用,而无需创建   类的实例

     

注意:您还可以使用对象引用来引用静态方法   像instanceName.methodName(args)一样,但这是不鼓励的,因为它   并不清楚他们是阶级方法。