在Java中静态方法的使用也是再普遍不过的了,静态的对象与方法的优点不用我多说了,你一定也是知道。 你会问那笔者在这里要说什么呢?笔者反问:你知道静态方法能被重写么?
或许你知道静态方法不能被重写,那么你能确定下面这个例子能编译通过么?
能确定么?去试试吧,这段代码真的能够编译通过,我不骗你的。不是说静态方法不能被重写么?确实不能重写,其实method的这个方法根本就不是重写,在这种情况下他叫做重定义。
(上面的代码结果为 Animal Animal)
重新来编写一下main方法
修改之后,结果是什么呢?
结果是
Animal
Dog
他是重写么?Animal和Dog中存在两个不同的method方法的副本。在继承的时候静态方法也是会被继承的,如果在子类未对其重定义那么会调用超类的方法,如果重定义,超类的方法会被隐藏。最后观点:静态方法不能被重写,更确切的说静态方法不会被重写。
或许你知道静态方法不能被重写,那么你能确定下面这个例子能编译通过么?
class Animal{
static void method(){
System.out.println("Animal");
}
}
public class Dog extends Animal{
static void method(){
System.out.println("Dog");
}
public static void main(String[] args){
Animal[] animals = { new Animal() , new Dog };
for(int i=0;i<animals.length;i++){
animals[i].method();
}
}
}
能确定么?去试试吧,这段代码真的能够编译通过,我不骗你的。不是说静态方法不能被重写么?确实不能重写,其实method的这个方法根本就不是重写,在这种情况下他叫做重定义。
(上面的代码结果为 Animal Animal)
重新来编写一下main方法
public static void main(String[] args){
Animal a = new Animal();
Dog d = new Dog();
a.method();
b.method();
}
修改之后,结果是什么呢?
结果是
Animal
Dog
他是重写么?Animal和Dog中存在两个不同的method方法的副本。在继承的时候静态方法也是会被继承的,如果在子类未对其重定义那么会调用超类的方法,如果重定义,超类的方法会被隐藏。最后观点:静态方法不能被重写,更确切的说静态方法不会被重写。