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
          主站蜘蛛池模板: 通渭县| 探索| 四子王旗| 山东省| 亳州市| 胶南市| 平塘县| 鄂州市| 吉安县| 宁都县| 加查县| 锦屏县| 德庆县| 闸北区| 体育| 镇平县| 泸定县| 辉南县| 云安县| 姜堰市| 开江县| 扬中市| 辰溪县| 沭阳县| 泰和县| 婺源县| 沙田区| 前郭尔| 如东县| 鹤峰县| 丽江市| 宁明县| 平果县| 南丰县| 繁峙县| 长治县| 南京市| 屏边| 佛冈县| 钦州市| 肇州县|