做题的时候遇到的一个JAVA子类假重写父类静态方法的问题。
————————————————————————————————————————————————————————————————————————
//父类代码。在父类中定义一个静态方法TSa1,一个非静态方法TSa2
public class TestExtendStatic {
public static void TSa1(){
System.out.println("Super Static");
}
public void TSa2(){
System.out.println("Super void");
}
}
————————————————————————————————————————————————————————————————————————
/*子类代码。在子类中,按照方法重写的格式分别重写静态方法TSa1与非静态方法TSa2
*运行结果证明,TSa2确实被重写了,但是TSa1是一个假重写。
* 从测试结果看出,父类的静态方法不会被重写,子类就算以重写的格式“重写”父类的静态方法,也只是得到了一个假*重写。
*/
public class TestExtendStaticSub extends TestExtendStatic {
public static void TSa1(){System.out.println("Sub Static");
}
public void TSa2(){
System.out.println("Sub void");
}
public static void main(String[] args) {
TestExtendStatic a = new TestExtendStaticSub();
TestExtendStaticSub b = new TestExtendStaticSub();
a.TSa1();//Super Static
b.TSa1();//Sub Static
a.TSa2();Sub void
b.TSa2();Sub void
}
————————————————————————————————————————————————
/*进一步测试。从父类继承下来的静态方法TSa1()去哪了
*将子类中的TSa1()注释掉之后再执行,发现a.TSa1();的执行结果又变回了Super Static。说明父类的TSa1();又出现
*了
*所以说,父类的静态方法还是成功被子类继承了,只不过当子类中出现同签名方法时,继承的静态方法会隐藏掉。
*/
public class TestExtendStaticSub extends TestExtendStatic {
/*public static void TSa1(){
System.out.println("Sub Static");
}*/
public void TSa2(){
System.out.println("Sub void");
}
public static void main(String[] args) {
TestExtendStatic a = new TestExtendStaticSub();
a.TSa1();//执行结果Super Static
TestExtendStaticSub b = new TestExtendStaticSub();
b.TSa1();
a.TSa2();
b.TSa2();
}