<rt id="bn8ez"></rt>
<label id="bn8ez"></label>

  • <span id="bn8ez"></span>

    <label id="bn8ez"><meter id="bn8ez"></meter></label>

    隨筆 - 4  文章 - 10  trackbacks - 0
    <2025年5月>
    27282930123
    45678910
    11121314151617
    18192021222324
    25262728293031
    1234567

    常用鏈接

    留言簿(1)

    隨筆檔案

    文章分類

    文章檔案

    搜索

    •  

    最新評論

    閱讀排行榜

    評論排行榜

    出處:http://m.tkk7.com/crazycy/archive/2006/10/11/74622.html

    < 示例1>

     


     1 class  Base {
     2      int  x  =   2 ;
     3      int  method() {
     4          return  x;
     5     }

     6 }

     7
     8 class  SubClass  extends  Base {
     9      int  x  =   3 ;
    10      int  method() {
    11          return  x;
    12     }

    13 }

    14
    15 public   class  Main 
    16          public   static   void  main(String[] args)  {
    17         Base b  =   new  SubClass ();
    18         System.out.println(b.x);
    19         System.out.println(b.method());
    20     }

    21 }

     


    2 , 3

     

     

    <練習>

     


     1 class   s1    {   
     2        public   String  s = " s1 " ;   
     3        public   String  get()   {   
     4            return   s;   
     5       }
       
     6 }
       
     7 class   s2   extends   s1    {   
     8       public    String   s = " s2 " ;   
     9        public    String   get()    {   
    10            return    s;   
    11       }
       
    12  }
       
    13 public     class    s   {   
    14        public     static     void    main(String[]   args)   {   
    15           s1  a    =     new   s2();   
    16           System.out.println(a.s);   
    17           System.out.println(a.get());     
    18       }
       
    19  }
      

     


     1 這個地方就是多態的一個陷阱;   
     2 多態是對方法而言的,不是對變量;   
     3 s1 a  =   new  s2();這里生成的對象是s1類的實例,但是是由s2類構造的;   
     4     
     5   java中對變量的選擇是靜態的,對方法的選擇是動態的,是在運行時決定的。(static除外)   
     6   運行時實際上調用的是實例的方法,即s1的方法;但對于繼承(多態的一種方式),方法的定位是在動態執行時選擇的,選擇實際構造者,因此就出現了本題的現象了。   
     7
     8 另外:多態是對方法而言的,不是對變量;這樣說有些不嚴密,方法應該有個修飾,就是除了final修飾的方法外,java中對函數的調用都是后期綁定,所謂的后期綁定就是動態選擇
     9
    10 摘自 崔毅解答csdn疑問時給出的分析
    11
    12

     


    示例2>

     


     1 class  Base {
     2      private   final   void  f() {
     3         System.out.println( " Base.f() " );
     4     }

     5 }

     6
     7 class  Derived  extends  Base {
     8      public   final   void  f() {
     9         System.out.println( " Derived.f() " );
    10     }

    11 }

    12
    13 public   class  Main 
    14          public   static   void  main(String[] args)  {
    15         Derived op1  =   new  Derived();
    16         Base op2 = op1;
    17         op1.f();
    18         op2.f();
    19     }

    20 }

    21

     


    op2.f();

     


    <示例3>

     


     1 class    Parent {   
     2        private     void    method1() {   
     3           System.out.println( " Parent's   method1() " );   
     4       }
       
     5        public     void    method2() {   
     6           System.out.println( " Parent's   method2() " );   
     7           method1();   
     8       }
       
     9   }
       
    10    class    Child    extends    Parent {   
    11        public     void    method1() {   
    12          System.out.println( " Child's   method1() " );   
    13       }
       
    14        public     static     void    main(String   args[]) {   
    15           Parent   p    =     new    Child();   
    16           p.method2();   
    17       }
       
    18   }
       

     


    1 答案是:prints:   parent’s   method2()     parent’s   method1()   
    2 如果把父類中method1改成public,那么答案是
    3 prints:   parent’s   method2()     child’s   method1()

     


    分析

    多態:

    Java 中的函數,除了聲明外 final 的外,都是后期綁定。

    所謂綁定是建立“函數調用”和“函數本體”的關聯。、

    所謂的后期綁定是指執行時根據對象類別而進行

    多態僅僅對函數而言,不對變量而言

    變量的訪問依賴于編譯期引用指向的類型

    方法的訪問依賴于執行期對象的類型

    向上轉型后,調用某個函數,若 derived class overriding 了該函數,則會調用該 derived class 中的函數,否則會調用 base class 中的函數

    向上轉型后,只能調用 base class 中被 derived class overriding 的函數,不能調用 derived class extend 函數。

    向上轉型后,只能調用 base class 中的方法,不能調用 derived class 中的擴展方法 
     

     


     1 public   class  CalC  {
     2      void  amethod() {
     3         System.out.println( " CalC.amethod " );
     4     }

     5     CalC() {
     6         amethod();
     7         System.out.println( " Hu? " );
     8     }

     9      public   static   void  main(String[] args)  {
    10         CalC cc  =   new  CalChild();
    11         cc.amethod();
    12     }

    13 }

    14 class  CalChild  extends  CalC {
    15      void  amethod() {
    16         System.out.println( " CalChild.amethod " );
    17     }

    18 }

     


    1 output:
    2 CalChild.amethod
    3 Hu ?
    4 CalChild.amethod
    5 為什么CalC Constructor調用的不是自己的amethod()呢

     


    1 方法在內存中只有一個備份,所以的對象都共享這個備份,為了區分開到底是哪個對象在調用這個方法,關鍵的地方就是this的使用。this把調用方法的上下文對應到當前對象上。
    2
    3 第二,調用java中的所有成員變量或者成員函數都隱含了this。
    4
    5 所以這個地方就很明了了:構造子類,this指針代表的當前對象是子類實例,子類實例為啥不調用自己overriding的方法呢?!
    6
    posted on 2007-09-04 17:09 冬天出走的豬 閱讀(231) 評論(0)  編輯  收藏 所屬分類: j2se
    主站蜘蛛池模板: 在线91精品亚洲网站精品成人| 亚洲娇小性xxxx色| 成人免费乱码大片A毛片| 免费一级做a爰片性色毛片| 亚洲国产精品网站在线播放| 女人张腿给男人桶视频免费版| 亚洲一区二区三区播放在线 | 九九九国产精品成人免费视频| 美女被免费视频网站a国产| 亚洲精品宾馆在线精品酒店| 国产片免费福利片永久| 免费国产va视频永久在线观看| 国产成人精品亚洲精品| 东北美女野外bbwbbw免费| 亚洲Av无码专区国产乱码DVD| 精品一卡2卡三卡4卡免费视频| 亚洲Av永久无码精品三区在线| 8x成人永久免费视频| 久久乐国产综合亚洲精品| 国产成人精品123区免费视频| 特级毛片爽www免费版| 亚洲精品乱码久久久久久久久久久久 | 黄网站在线播放视频免费观看| 亚洲Av无码国产情品久久| a级在线观看免费| 亚洲视频免费在线看| 麻豆国产入口在线观看免费| 污污免费在线观看| 亚洲精品国产成人专区| 无码专区永久免费AV网站| 爱情岛论坛免费视频| 亚洲成人免费在线| 全免费一级毛片在线播放| 一本大道一卡二大卡三卡免费| 亚洲av无码av制服另类专区| 国产精品视频免费一区二区| 一本一道dvd在线观看免费视频 | 国产高清免费观看| 亚洲午夜免费视频| 老司机午夜在线视频免费观| 亚洲高清在线视频|