Atea - Hero's Grave

          面向對象,開源,框架,敏捷,云計算,NoSQL,商業智能,編程思想。

            BlogJava :: 首頁 :: 新隨筆 :: 聯系 :: 聚合  :: 管理 ::
            40 隨筆 :: 0 文章 :: 28 評論 :: 0 Trackbacks
          以下幾段代碼,運行結果分別是什么?

          code1:
          class Sub extends Super{
              
          public void f() {System.out.println("Sub's public f()");}    
          }
          public class Super{
              
          public void f() {System.out.println("Super's public f()");}    
              
          public static void main(String[] args){
                  Super po 
          = new Sub();
                  po.f();
              }
          }

          code2:
          class Sub extends Super{
              
          private void f() {System.out.println("Sub's private f()");}    
          }
          public class Super{
              
          public void f() {System.out.println("Super's public f()");}    
              
          public static void main(String[] args){
                  Super po 
          = new Sub();
                  po.f();
              }
          }

          code3:
          class Sub extends Super{
              
          public void f() {System.out.println("Sub's public f()");}    
          }
          public class Super{
              
          private void f() {System.out.println("Super's private f()");}    
              
          public static void main(String[] args){
                  Super po 
          = new Sub();
                  po.f();
              }
          }

          code4:
          class Sub extends Super{
              
          private void f() {System.out.println("Sub's private f()");}    
          }
          public class Super{
              
          private void f() {System.out.println("Super's public f()");}    
              
          public static void main(String[] args){
                  Super po 
          = new Sub();
                  po.f();
              }
          }

          答案:
          code1: Sub's public f()
          code2: Compiled error
          code3: Super's private f()
          code4: Super's public f()

          說明:
          這個問題困擾了我很久。
          通過以往的學習我知道Super po = new Sub()的時候"Method is Sub's,Field is Super's"。但碰上域限定符時就又糊涂了。顯然是知其然不知其所以然。
          而當我用"javap -verbose"調試并分析日志的時候,我終于明白了:>

          javap -verbose Super
            Constant pool:
          const #5 = class        #27;    //  Sub
          const #6 = Method       #5.#21//  Sub."<init>":()V
          const #7 = Method       #10.#28;        //  Super.f:()V
          public static void main(java.lang.String[]);
            Code:
             Stack
          =2, Locals=2, Args_size=1
             
          0:   new     #5//class Sub
             3:   dup
             
          4:   invokespecial   #6//Method Sub."<init>":()V
             7:   astore_1
             
          8:   aload_1
             
          9:   invokevirtual   #7//Method f:()V

          由此可見,不管是哪種情況(code1,3-4),po.f()都會無條件先調用Super.f()。
          此時據我估計,JVM會去Sub中尋找可訪問的相同修飾符的函數。如果找到則用其替代Super.f()運行。
          而成員變量不存在這種機制。
          posted on 2008-07-22 17:32 Atea 閱讀(358) 評論(0)  編輯  收藏 所屬分類: Java language
          主站蜘蛛池模板: 濮阳市| 普格县| 岳普湖县| 和硕县| 香港 | 贵南县| 海宁市| 韩城市| 拜城县| 班戈县| 新宾| 大竹县| 称多县| 敦煌市| 新邵县| 青阳县| 浦东新区| 伊宁市| 马山县| 辉县市| 二手房| 平塘县| 福州市| 广元市| 泾源县| 历史| 闵行区| 兰坪| 睢宁县| 图们市| 监利县| 罗田县| 萨迦县| 新晃| 县级市| 威远县| 宜春市| 松阳县| 通河县| 都兰县| 绵竹市|