155个建议笔记--建议33:不要覆写静态方法
生活随笔
收集整理的這篇文章主要介紹了
155个建议笔记--建议33:不要覆写静态方法
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
我們知道在JAVA中可以通過overRide來增強或減弱父類的方法和行為,但覆寫是針對非靜態方法的,不能針對靜態方法(也叫類方法),為什么呢?看一下下面的例子:
View Code public class OverRideTepublic static void main(String[] args){ Father father=new Son(); father.print1(); father.print2(); } } class Father{ public static void print1(){ System.out.println("我是父類靜態方法"); } public void print2(){ System.out.println("我是父類非靜態方法"); } } class Son extends Father{ public static void print1(){ System.out.println("我是子類靜態方法"); } public void print2(){ System.out.println("我是子類非靜態方法"); } }1 public class OverRideTest {2 3 public static void main(String[] args){4 Father father=new Son();5 father.print1();6 father.print2();7 }8 9 } 10 class Father{ 11 public static void print1(){ 12 System.out.println("我是父類靜態方法"); 13 } 14 public void print2(){ 15 System.out.println("我是父類非靜態方法"); 16 } 17 } 18 class Son extends Father{ 19 public static void print1(){ 20 System.out.println("我是子類靜態方法"); 21 } 22 23 public void print2(){ 24 System.out.println("我是子類非靜態方法"); 25 } 26 }看程序子類son覆寫了父類father中的print1(),print2()方法,按道理來說應該都是執行覆寫后的方法,然而
運行之后結果:
我是父類靜態方法
我是子類非靜態方法
分析原因:
son的兩個覆寫區別僅僅在是否有static,每個實例對象都有兩個類型,一個是表面類型,一個是實際類型,表面類型是在聲明時得到的,實際類型是對象產生時的類型,例子中,Father是表面類型,Son是實際類型,對于非靜態方法而言,是根據對象的實際類型來執行;而對于靜態方法則比較特別,首先靜態方法不依賴于實例對象,通過類名來訪問,其次,可以通過對象訪問靜態方法,如果是通過對象訪問,JVM是通過對象的表面類型來找到靜態方法的入口,因而執行Father中的靜態方法。
?
轉載于:https://www.cnblogs.com/yuwenfeng/archive/2013/05/09/3069152.html
總結
以上是生活随笔為你收集整理的155个建议笔记--建议33:不要覆写静态方法的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 高通QCA9563详细资料全集-data
- 下一篇: 算法(第4版)Robert Sedgew