public class Animal { public static void foo() { System.out.println("Animal"); }}public class Cat extends Animal { public static void foo() { // hides Animal.foo() System.out.println("Cat"); }}在这里,
Cat.foo()据说藏起来了
Animal.foo()。隐藏不像覆盖那样工作,因为静态方法不是多态的。因此,将发生以下情况:
Animal.foo(); // prints AnimalCat.foo(); // prints CatAnimal a = new Animal();Animal b = new Cat();Cat c = new Cat();Animal d = null;a.foo(); // should not be done. Prints Animal because the declared type of a is Animalb.foo(); // should not be done. Prints Animal because the declared type of b is Animalc.foo(); // should not be done. Prints Cat because the declared type of c is Catd.foo(); // should not be done. Prints Animal because the declared type of d is Animal
在实例而不是类上调用静态方法是一种非常糟糕的做法,绝不应该这样做。
将其与实例方法进行比较,实例方法是多态的,因此被覆盖。调用的方法取决于对象的具体运行时类型:
public class Animal { public void foo() { System.out.println("Animal"); }}public class Cat extends Animal { public void foo() { // overrides Animal.foo() System.out.println("Cat"); }}然后将发生以下情况:
Animal a = new Animal();Animal b = new Cat();Animal c = new Cat();Animal d = null;a.foo(); // prints Animalb.foo(); // prints Catc.foo(); // prints Catd.foo(): // throws NullPointerException



