首先看一个JAVA文件:Test.java
大家都知道非静态方法的继承覆盖的原则,即向上转型时从他的实例中可而已看出来,但是静态方法却不是像非静态方法那样工作,虽然静态方法可以被继承但是为什么不能覆盖呢?
原因是这样的,静态方法跟其他非静态方法不一样的区别在于静态方法不用NEW一个实例就可以调用的,即它的调用是根据他的类型来判断的,所以我总结一句话就是:静态方法的继承和覆盖是跟着引用类型的,而非静态方法是跟着实例本身的。
class
A{
public static void testP(){
System.out.println( " A " );
}
public void testM(){
System.out.println( " X " );
}
}
class B extends A{
public static void testP(){
System.out.println( " B " );
}
public void testM(){
System.out.println( " Y " );
}
}
public class Test{
public static void main(String[] args){
A a = new A();
B b = new B();
a.testP(); // 结果是 A
b.testP(); // 结果是 B
a.testM(); // 结果是 X
b.testM(); // 结果是 Y
a = b;
a.testP(); // 结果是 A
b.testP(); // 结果是 B
a.testM(); // 结果是 Y
b.testM(); // 结果是 Y
}
}
大家可以看到结果,但是为什么会这个样子呢?下面我就试着来解释一下这个问题:
public static void testP(){
System.out.println( " A " );
}
public void testM(){
System.out.println( " X " );
}
}
class B extends A{
public static void testP(){
System.out.println( " B " );
}
public void testM(){
System.out.println( " Y " );
}
}
public class Test{
public static void main(String[] args){
A a = new A();
B b = new B();
a.testP(); // 结果是 A
b.testP(); // 结果是 B
a.testM(); // 结果是 X
b.testM(); // 结果是 Y
a = b;
a.testP(); // 结果是 A
b.testP(); // 结果是 B
a.testM(); // 结果是 Y
b.testM(); // 结果是 Y
}
}
大家都知道非静态方法的继承覆盖的原则,即向上转型时从他的实例中可而已看出来,但是静态方法却不是像非静态方法那样工作,虽然静态方法可以被继承但是为什么不能覆盖呢?
原因是这样的,静态方法跟其他非静态方法不一样的区别在于静态方法不用NEW一个实例就可以调用的,即它的调用是根据他的类型来判断的,所以我总结一句话就是:静态方法的继承和覆盖是跟着引用类型的,而非静态方法是跟着实例本身的。