JAVA中静态方法和非静态方法在继承层次中的重载和隐藏规则
1 class BaseStatic 2 { 3 public static void method1(){System.out.println("Static static void method1()");}; 4 public void method2(){System.out.println("no static void method2()");} 5 } 6 class DerivedStatic extends BaseStatic 7 { 8 //派生类中的静态方法可以隐藏基类中的相同的静态方法,这样做是合理的, 9 //原因这样可以保证静态成员函数随继承层次中的不同对象而改变, 10 public static void method1(){System.out.println("DerivedStatic static void method1()");}; 11 12 13 //测试静态成员函数重写非静态成员函数 :不能用静态成员函数来隐藏基础 14 // 类中的非静态方法原因在于由于静态类型不具有多态性,如派生类中用静 15 //态方法隐藏了基础类中的非静态方法,这样基础类中的该非静态方法代表的 16 //接口在继承层次中就会被关闭这是不合理的 17 //public static void method2(){System.out.println("DerivedStatic static void method1()");}; 18 19 //这是可以的,原因是这种定义并没有隐藏基础类中定义的接口 20 public static void method2(int i){System.out.println("DerivedStatic static void method2()");}; 21 22 23 //派生类中俄非静态成员函数不能隐藏基础类中的静态成员函数 24 //public void method1(){System.out.println("DerivedStatic static void method1()");}; 25 26 public void method1(int i){System.out.println("DerivedStatic no static void method1(int)");}; 27 28 29 30 //总结:非静态成员函数和静态成员函数在继承层次之间是不能相互隐藏的, 31 //原因就是本来两类函数就具有不同的绑定属性,但是可以在继承层次之间相互重载, 32 //原因是重载函数是具有不同的函数签名,本身编译器把他们当成当成不同的函数进行处理 33 } 34 public class OverrideStaticandNoStatic 35 { 36 public static void main(String args[]) 37 { 38 39 BaseStatic b = new DerivedStatic(); 40 b.method2(); 41 //b.method2(1); 42 //b.method1(2); 43 b.method1(); 44 45 DerivedStatic d = new DerivedStatic(); 46 d.method1(1); 47 d.method1(); 48 d.method2(); 49 d.method2(1); 50 } 51 }
测试结果如下
结果的第一行和第二行验证基类中定义的函数没有问题
结果的第三行解释了派生类中重载的静态方法确实遵从了函数的重载机制
结果第四行证明了静态函数在继承乘此间可以相互隐藏
结果第五行验证普通函数的动态绑定
结果第六行验证了继承层次中静态函数可以重载非静态函数(同理非静态函数也可以重载静态函数)
郑重声明:本站内容如果来自互联网及其他传播媒体,其版权均属原媒体及文章作者所有。转载目的在于传递更多信息及用于网络分享,并不代表本站赞同其观点和对其真实性负责,也不构成任何其他建议。