和風細雨

          世上本無難事,心以為難,斯乃真難。茍不存一難之見于心,則運用之術自出。

          接口與抽象類概述

          類,抽象類與接口

          類,抽象類與接口都是Java中實現繼承和多態的手段.
          類強調的是繼承
          接口強調的是規范
          抽象類兼而有之

          什么是接口

          接口是一種特殊的類,它只有方法定義而沒有實現,實現的任務完全交給子類完成.
          接口以interface標志.
          繼承接口用implements關鍵字實現.
          接口可以繼承接口.
          接口可以有成員,但成員全是public static final類型的.
          接口沒有構造函數.
          接口給Java提供了多繼承機制

          接口例子—Knockable

          public interface Knockable{
                  public static final String Sound="Bang!";
                  public void knock();
          }

          接口例子-實現接口

          public class Hammer implements Knockable{
              public void knock(){
                     System.out.println(Sound);
              }
          }

          接口例子-實現多個接口

          public interface Knockable{
              public static final String Sound="Bang!";
              public void knock();
          }

          public interface Clampable {
              public void clamp();
          }

          public class Pliers implements Knockable,Clampable{
             public void clamp(){
                   // do sth
             }

             public void knock(){
                  System.out.println(Sound);
             }
          }

          接口繼承接口例子

          public interface Knockable{
                public static final String Sound="Bang!";
                public void knock();
          }

          public interface Hitable extends Knockable{
                public void hit();
          }

          public class Stick implements Hitable{
                public void knock(){
                    //  do sth
                }

                public void hit(){
                    // do sth
                }
          }

          什么叫抽象類

          類中具有抽象方法的類為抽象類.抽象方法以abstract在函數前修飾,只有定義沒有實現,這一點和接口一致.
          抽象類在類名前需加上abstract修飾符以標識.
          抽象類不能生成實例.
          抽象類的繼承性和類一致.

          抽象類的實現

          public abstract class Gun{
            protected String cannon;
            protected List<Bullet> bullets;
             
            public abstract void shoot();
           
            public void addBullet(Bullet bullet){
              if(bullets==null){
                bullets=new LinkedList<Bullet>();
              }
             
              bullets.add(bullet);
            }
          }

          繼承抽象類

          public class Rifle extends Gun{
            public void shoot(){
              // Shoot Sth
            }
           
            public void reload(){
              if(bullets!=null){
                bullets.clear();
              }
             
              addBullet(new Bullet());
              addBullet(new Bullet());
              addBullet(new Bullet());
              addBullet(new Bullet());
              addBullet(new Bullet());
              addBullet(new Bullet());
            }
          }

          繼承抽象類并實現接口

          public abstract class Gun{
            protected String cannon;
            protected List<Bullet> bullets;
             
            public abstract void shoot();
           
            public void addBullet(Bullet bullet){
              if(bullets==null){
                bullets=new LinkedList<Bullet>();
              }
             
              bullets.add(bullet);
            }
          }

          public interface Thornable{
            public void thorn();
          }

          public class SpringFieldRifle extends Gun implements Thornable{
            public void thorn(){
              // thorn sth
            }
           
            public void shoot(){
              // shoot sth
            }
          }

          抽象類繼承抽象類實現接口的例子

          public abstract class Gun{
            protected String cannon;
            protected List<Bullet> bullets;
             
            public abstract void shoot();
           
            public void addBullet(Bullet bullet){
              if(bullets==null){
                bullets=new LinkedList<Bullet>();
              }
             
              bullets.add(bullet);
            }
          }

          public interface Handable{
            public void hold();
          }

          public abstract class HandGun extends Gun implements Handable{

          }

          public class BlackStar extends HandGun{
            public void hold(){
              // Hold the gun
            }
           
            public void shoot(){
              // Shoot Sth
            }
          }

          抽象類,接口,類的區別

          繼承好比家學淵源,所謂"忠厚傳家久,詩書繼世長",家長總會潛移默化的影響下一代,下一代也會在不經意中學習前輩的特點,但因為年少分辨能力不高加上世易時移有些優點已經不再是有點甚至會變成缺點,下一代會把前輩的優缺點不分良莠的繼承下來.這也是日后出現問題的根源.

          接口好比拜師學藝,"入了這個門,就得說這行話",比如相聲界說學逗唱四門是必須要學的,但是"師傅領進門,修行在個人",學得怎么樣還全看自己,指望不費力的繼承什么是不可能的,具體功夫還得個人來過. 因為是自己來,具體實現成什么樣自由度也很大,比如四門功課中的"唱",原指唱太平歌詞,但因為愛聽的少,現在相聲演員已經不要求這個了,改為唱歌唱戲的唱,其實嚴格界定的話是"學"的一種.這也無所謂對錯,郭德剛堅持唱太平歌詞也行,笑林唱流行歌曲也不錯,總之實現了就可以,實現得怎么樣則留給實踐來檢驗.一個類可以同時實現多個接口,就和藝人拜幾個師傅是沒有問題的,郭德剛就同時實現了大鼓和相聲兩個接口.

          抽象類則介于繼承和接口之間,既可不費力的從上一代繼承,也可強制實現某接口,有如某大師收自己的孩子為徒,當然相聲界不讓這么干,其它曲藝行業還是可以的,比如京劇界的梅蘭芳和其子梅葆玖,既有言傳身教,也有強制實現,綜合了繼承和接口的特點.

          抽象類,接口,類的詳細區別

          接口 抽象類
          可以繼承自 接口 抽象類,類 抽象類,類
          可以實現自 一個或多個接口 一個或多個接口
          有否成員 只有static final成員 均可 均可
          是否有構造函數
          可否實例化 不可 不可
          意圖 規范行為 繼承成員+規范行為 繼承成員


          抽象類,接口和類在繼承體系中的位置

          抽象類,接口一般來說都是從一般類總結歸納出來的抽象共性的東西,類則是實際具體的東西.
          一般來說,應該把合理抽象出的抽象類,接口放在類繼承體系的上層,子類依靠類來實現.

          posted on 2008-02-21 19:09 和風細雨 閱讀(459) 評論(0)  編輯  收藏 所屬分類: J2SE

          主站蜘蛛池模板: 张家界市| 波密县| 通道| 南靖县| 阿克苏市| 乐东| 新邵县| 甘德县| 社旗县| 江安县| 屯留县| 灵丘县| 凤凰县| 普格县| 工布江达县| 汝阳县| 韶关市| 河南省| 长子县| 康乐县| 广宗县| 秀山| 美姑县| 隆安县| 如东县| 陈巴尔虎旗| 青冈县| 扎囊县| 南乐县| 滦南县| 宁化县| 哈巴河县| 四川省| 昌黎县| 蒙城县| 容城县| 四平市| 长泰县| 义乌市| 邵阳市| 十堰市|