1. 程式人生 > >抽象類與介面詳解與對比

抽象類與介面詳解與對比

前言:記錄自己在工作中遇到的小問題,積少成多!因為是新手,有什麼寫的不好的地方還希望大家指出來。有什麼更好的方法也希望大家能夠提出來,一起交流學習。(小弟先在這裡謝謝大家)

正文:

一、介面介紹:

1、介面概述

介面是抽象方法的集合。如果一個類實現了某個介面,那麼它就繼承了這個介面的抽象方法!這就像契約模式,如果實現了這個介面,那麼就必須確保使用這些方法。介面只是一種形式,介面自身不能做任何事情!

2、介面的定義:

[修飾符] interface 介面名稱 extends 介面1,介面2...... {

    方法1(){};

    方法2(){};

}

修飾符:可選,用於指定介面的訪問許可權;

介面名稱:必選,用於指定介面的名稱,介面名稱必須符合Java標識規範,一般首字元要求大寫;

extends:可選,用於指定繼承的父介面名稱(介面可多和繼承);

方法:介面中的只有定義而沒有實現;

下面為一個介面的定義例子:

public interface CalInterface{  
     public final float PI=3.14159f;//定義用於表示圓周率的常量PI  
     public float getArea(float r);//定義一個用於計算面積的方法getArea()  
     float getCircumference(float r);//定義一個用於計算周長的方法getCircumference()  
}

3、介面的實現:

[修飾符] class 類名稱 [繼承 父類名稱] [implements 介面列表]{

    方法1(){};

    方法2(){};

}

修飾符:可選,用於指定類的訪問許可權;

類名:必選,用於指定類的名稱,類名稱必須符合Java標識規範,一般首字元要求大寫;

extends:可選,用於指定繼承的父類(超類)名稱(類只能單繼承);

implements:可選,用於指定該類實現的介面名稱(可多實現,介面與介面之間用“,”分割);

下面為一個介面實現的例子:

public class Cire implements CalInterface{  
     public float getArea(float r){  
         float area=PI*r*r;//計算圓面積並賦值給變數area  
          return area;//返回計算後的圓面積  
     }  
     public float getCircumference(float r){  
         float circumference=2*PI*r;      //計算圓周長並賦值給變數circumference  
         return circumference;           //返回計算後的圓周長  
     }  
     public static void main(String[] args){  
         Cire c = new Cire();  
         float f = c.getArea(2.0f);  
         System.out.println(Float.toString(f));  
     }  
 }

4、介面注意事項;

①、一個介面可以繼承多個介面:

interface C extends A,B{} 這樣寫是可以的

(注意:一個類只能繼承一個類,類是單繼承!但是可以寫成A繼承B,B繼承C,這樣A就同時可以用B和C裡面的方法)

②、一個類可以實現多個介面:

class C implements A,B{} 這樣寫是可以的


③、類在繼承類的同時,也可以實現介面


二、抽象類介紹

1、抽象類概述:

抽象類是用來捕捉子類通用特性的。它不能被例項化,只能被用作子類的超類。抽象類是用來建立繼承層級裡子類的模板!

2、抽象類的定義:

[修飾符] abstract [類名] [extends 抽象類]{

    方法1(){};

    方法2(){};

}

修飾符:可選,用於指定抽象類的訪問許可權;

類名:必選,用於指定抽象類的名稱,類名必須符合Java標識規範,一般要求首字母大寫;

extends:可選,用於指定該類繼承的抽象類名稱(單繼承);

下面為一個抽象類的兩個例子:

abstract class A { // 定義抽象類a
    public static final String FLAG = "CHINA";
    private String name = "張三";
 
    public String getName() {// 取得name的值
        return name;
    }
 
    public void setName(String name) { // 設定name值
        this.name = name;
    }
 
    public abstract void print(); // 宣告抽象方法
}
 
class B extends A { // B繼承A
    public void print() { // 覆寫A類的print方法
        System.out.println("FLAG=" + FLAG);
        System.out.println("姓名=" + super.getName());
    }
}
 
public class AbstractDemo02 {
    public static void main(String args[]) {
        B b = new B(); // 初始化B類
        b.print(); // 呼叫B類的orint()方法
    }
}
結果:
FLAG=CHINA
姓名=張三
//抽象類的宣告
abstract class Animal {
    String type;
    String name;
    int age;
    int weight;
    void eat() {
        System.out.println("動物愛吃飯");
    }
    //抽象方法在抽象類中只能宣告,不能具體實現
    abstract void breath();
    void sleep() {
        System.out.println("動物在睡覺");
    }
}
//由子類去繼承父類抽象類
class tiger extends Animal{
 
    @Override
    //在此處實現抽象方法
    void breath() {
        // TODO Auto-generated method stub
        System.out.println("老虎在呼吸");
    }
}
public class first_for {
    public static void main(String [] args){
        // 錯誤,程式會報錯
        //報錯原因:抽象類不能進行例項化操作
        //Animal Tiger = new Animal();
         
        //只能用子類進行例項化
        Animal Tiger = new tiger();
        Tiger.breath();
    }
}
結果:老虎在呼吸

3、抽象類注意事項:

①抽象類裡面的方法不一定是抽象方法,但是含有抽象方法的類,一定是抽象類;

②抽象方法在抽象類中只能宣告,不能具體實現;

③由子類去繼承父類的抽象類;

④子類繼承父類以後,必須實現其父類(超類)抽象方法

⑤抽象方法不能進行例項化操作;

⑥只能用子類進行例項化;

三、介面與抽象類比較

四、如何正確選擇使用抽象類還是介面