天天看點

抽象類和接口

抽象類(abstract)

  • 包含一個抽象方法的類必須是抽象類
  • 抽象類和抽象方法都是用abstract關鍵字聲明
  • 抽象方法隻需要聲明而不需要實作
  • 抽象類必須被子類繼承
    • 子類不是抽象類時必須重寫父類中的所有抽象方法
    • 子類是抽象類時仍可以繼續聲明成抽象方法
      public abstract class Hero{
          public abstract boolean canFight(Hero hero);
          public abstract void fight(Hero hero);
      }
      
      /** 子類不是抽象類*/
      public class Worrior extends Hero{
          @Overrride
          public boolean canFight(Hero hero){
              return false;
          }
          @Override
          public void fight(Hero hero){}
      }
      
      /** 子類是抽象類*/
      public abstract class LongRangerHero extends Hero{
          //繼續作為抽象方法,也可以省略
          public abstract void fight(Hero hero);
          @Override
          public boolean canFight(Hero hero){
              return true;
          }
      }
      
      /** 子類不是抽象類*/
      public class Ranger extends LongRanger{
          @Override
          public void fight(Hero hero){}
      }
      
      /** 子類不是抽象類*/
      public class Magical extends LongRangerHero{
          @Override
          public void fight(Hero hero){}
      }
                 
  • 抽象類不可以用new執行個體化

接口(interface)

文法

修飾符 interface 接口名
    如:public interface Demo{}
類 implements 接口
           
  • 接口是一種與類相似的結構,隻包含常量和抽象方法
  • 目的是指明相關或不相關類的多個對象的共同行為(功能)
  • 在Java中,接口看做是一種特殊的類,與抽象類類似,不能使用new執行個體化
  • 接口必須由其他類實作,實作類不能實作的方法可以繼續辨別為abstract
  • 接口中所有的資料都是public static final,所有方法都是public abstract,預設情況下可以省略這些關鍵字
  • 在Java8中,接口中也可以有方法的實作

接口的優點

使設計和實作完全分離,能夠更自然使用多态,可以更容易搭建程式架構,可以更容易更換實作

接口和抽象類的比較

差別 接口 抽象類
定義關鍵字 interface abstract class
組成 全局常量,抽象方法 常量,變量,抽象方法,普通方法,構造方法
權限 隻能是public 可以使用各種權限
關系 接口不能夠繼承抽象類,但可以繼承多接口 一個抽象類可以實作多個接口
使用 子類使用implements實作接口 子類使用extends繼承抽象類
局限 一個子類可以實作多個接口 一個子類隻能繼承一個抽象類

抽象類的缺點:一個子類隻能繼承一個抽象類,存在單繼承的局限

實際開發中,抽象類和接口都可以用的情況下,優先使用接口,避免單繼承的局限