抽象類和介面

沐雨、發表於2020-11-13

一、抽象類

定義

由於並不是所有物件都可以通過類去描述。如果一個類中沒有包含足夠的資訊去描述一個物件,這樣的類就是抽象類。用關鍵字abstract修飾,抽象類是一種沒有完全實現的類。不能用它來例項化物件,它的主要用途是用來描述一些概念性的內容,然後在子類中去具體實現這些概念,一般抽象類都是作為其他類的父類。

  • abstract修飾的類就叫做抽象類
  • abstart修飾的方法就叫做抽象方法
  • 如何去定義一個抽象類:
     	public void fun(){//普通方法
     	System.out.println("存在方法體的方法");
     }
     
     public abstract void print();//抽象方法,沒有方法體,有abstract關鍵字做修飾
     }
    

特點

1)抽象類不能例項化物件 不能使用new操作符建立物件。
2)抽象類的其他功能都與普通類一樣。
3)抽象類中可以定義構造器,但是不可以用來例項化物件,只能
在子類中使用,所以該構造器一般定義為protected。
4)一個抽象類可以定義普通方法,但是含有普通方法+抽象方法的類必須定義為抽象類。

二、介面

定義

Java介面是一系列方法的宣告,是一些方法特徵的集合,一個介面只有方法的特徵沒有方法的實現,因此這些方法可以在不同的地方被不同的類實現,而這些實現可以具有不同的行為(功能)。
介面的定義:

interface interfaceName{
      int index; //public static final  (final(常量 編譯時期就能夠確定它的值))
     void func(); //只能有方法的宣告而不能存在方法的實現 public
  }

特點

java介面中的成員變數預設都是public,static,final(都可省略)型別的,必須被顯示的初始化。成員方法預設都是public ,abstract 型別的,不能含有static方法。沒有方法體,java中沒有建構函式,不能例項化。
一個介面不能實現(implement)另一個介面,但可以繼承多個其他介面。
java介面必須通過類來實現它的抽象方法。
當類實現了某個java介面時,必須實現介面中的所有抽象方法,否則這個類必須宣告為抽象的。

使用介面時的注意事項

1)不能夠new建立物件
2)如果要去建立一個介面對應的物件,則需要通過它的具體實現類,
使用implements關鍵字去實現介面
3) 介面被編譯之後也會產生對應的位元組碼檔案
4)介面之間也是可以相互繼承 extends
5) 介面對應是多實現 eg.class C implements A,B
6) 抽象類中設定的都是通用的方法,功能與實體都是一種"是"的關係,
介面中功能與實體都是一種"有"的關係
7)介面中定義的屬性為什麼是static final的?
static 原因主要是介面的實現是多實現,為了區分不同介面當中的相同變數
final 原因是因為如果是變數,介面的存在就失去其意義,同時介面來說指的
*是統一的協議,Java設計者直接規定介面中的屬性只能是public static
final的
8)Jdk1.8引入的新特性:
a.引入了default關鍵字提供預設介面方法,一個預設介面方法可以有預設的
實現
作用如下:
幫助擴充套件介面,而不需要破壞實現類
介面和抽象類之間差異更小一點
實現類可以自己決定覆蓋哪個預設方法實現
為了支援lambda表示式
b.允許介面中存在靜態的公有方法
作用:
可以用於提供一些合法性檢查的邏輯
靜態方法不允許類重寫,重寫就會被覆蓋,更加安全

比較器介面

如果需要讓一個類中物件可比較,則當前的類必須要實現
Comparable介面,重寫compareTo方法,使得當前類對
象按照compareTo方法中邏輯進行比較
缺點:如果要更換比較邏輯,則需要修改原類
jdk1.8 比較器介面 Comparator 不用修改原類,用來實現單獨的比較器

抽象類和介面的區別

抽象類和介面的區別
1)外觀 抽象類用到abstract關鍵字修飾一個class類,表示抽象類;
介面使用interface關鍵字;抽象類中可以定義抽象方法也可以定義普通的
成員方法,介面中的方法jdk1.8之前只有方法的宣告沒有方法的實現,而
jdk1.8之後可以定義default預設實現的方法,也可以定義static靜態方法;
抽象類中可以定義任意變數、常量,介面中只能定義public static final
常量;抽象類使用extends關鍵字去繼承,繼承只能是單繼承,介面使用
implements關鍵字去實現,實現可以是多個實現
2)使用 抽象類和介面本身不能使用new操作符建立一個物件,抽象類中可以定義
構造方法的,介面中不能定義構造方法,抽象類中可以定義構造方法,構造方法一般
是protected修飾的,因為其構造方法的定義是為了方便子類所使用;抽象類和
介面中的抽象方法不能夠是private,如果是private子類則無法實現該方法
3)個人見解 抽象類是一種"是"的關係,介面是一種"含有"的關係,實現這個介面
就會含有這個功能,抽象類則是一種高度的概括,其中會定義一些通用的方法;
介面可以有多個實現, 所以靈活性和擴充套件性方面,介面會更強一些

課後練習

使用介面作為引數,實現一個計算器,包含+,-,*,/

interface Compute{
        int  calculate(int num1, int num2);
    }
    class Addition implements Compute{
        public int calculate(int num1, int num2){
            return num1+num2;
        }
    }
    class subTraction implements Compute{
        public int calculate(int num1,int num2){
            return num1-num2;
        }
    }
    class multiplication implements Compute{
        public int calculate(int num1,int num2){
            return num1*num2;
        }
    }
    class divisionMethod implements Compute{
        public int calculate(int num1,int num2){
            if(num2==0){
                System.out.println("分母不能為空");
                return 0;
            }else {
                return num1/num2;
            }
        }
    }
    class Use{
        public void Calculate(Compute cal,int num1,int num2){
            System.out.println(cal.calculate(num1,num2));
        }
    }
    public class Calculator {
    public static void main(String[] args) {
       Use  c=new Use();
        c.Calculate(new Addition(),2,2);
        c.Calculate(new subTraction(),2,2);
        c.Calculate(new multiplication(),2,2);
        c.Calculate(new divisionMethod(),2,2);
    }
}

相關文章