Java中比較抽象類與接口的異同

一.抽象類

(一)概念

      在繼承的層次結構中,每個新的子類都使類變得更加明確和具體。如果從一個子類向父類追溯,類就會變得更通用、更加不明確。類的設計應該確保父類包含它的子類的共同特征。有時候,一個父類設計得非常抽象,以至於它都沒有任何具體的實例。這樣的類稱為抽象類(abstract class)。在類的頭部使用 abstract 修飾符表示該類為抽象類。

(二)抽象類和抽象方法

       同樣用 abstract 聲明抽象方法。抽象方法(abstract method)隻定義成員方法的接口形式,而沒有具體操作。隻有派生類對抽象成員方法的重定義才能真正實現與該派生類相關的操作。在各子類繼承瞭父類的抽象方法之後,再分別用不同的語句和方法體來重新定義它,形成若幹個名字相同、返回值相同、參數列表相同、目的一致但是具體實現有一定差別的方法。抽象類中定義抽象方法的目的是實現一個接口,即所有的子類對外都呈現一個相同名字的方法。

1.一個包含抽象方法的類必須聲明為抽象類

    幾點說明:

   1.抽象類不一定有抽象方法,但有抽象方法的類一定是抽象類。

   2.即使子類的父類是具體的,這個子類也可以是抽象的。

   3.當父類的方法實現在子類中變得無效時,子類可以重寫父類的方法並將它定義為抽象的。

2.抽象方法隻有定義而沒有實現,它的實現由子類提供

  下面定義瞭一個抽象類Object類:

public abstract class Object {
	public abstract double getArea();
	public abstract double getPerimeter();
}

Object類是多個子類的父類,由於在多個子類中都要用到getArea()方法和getPermeter()方法,所以在父類中定義比較好;由於計算面積和周長的getArea()方法和getPermeter()方法在不同子類裡的實現方式不同,所以Object類中定義的這兩個方法的實現隻能由子類提供。

3.抽象類無法被直接實例化,可以讓子類繼承然後實例化子類

  通過一個例子來說明:

public abstract class Person {
	//定義一個抽象方法
	public abstract void isSmoke();
}
 
//學生類
class Students extends Person{
	//繼承抽象類後抽象類中的抽象方法必須在子類中實現
	public void isSmoke() {
		System.out.print("Students can't smoke.");
	}
}
 
//教師類
class Teachers extends Person{
	public void isSmoke() {
		System.out.print("Teachers can smoke.");
	}
}

(三)使用抽象類的意義

       因為抽象類不能實例化對象,必須要有子類來實現它之後才能使用。這樣就可以把一些具有相同屬性和方法的組件進行抽象,更有利於代碼和程序的維護。同時,抽象類也是Java面向對象的一個重要體現。

二.接口

(一)概念

         接口(Interface),在Java編程語言中是一個抽象類型,是象方法的集合。

         接口通常以   interface  來聲明。一個類通過繼承接口的方式,從而來繼承接口的抽象方法。

    接口有以下特性:

接口是隱式抽象的,當聲明一個接口的時候,不必使用abstract關鍵字。接口中每一個方法也是隱式抽象的,聲明時同樣不需要abstract關鍵字。接口中的方法都是公有的。

(二)語法

 1. 定義:一個簡單的接口擁有全局變量和抽象方法。在接口中的所有方法都必須隻聲明方法標識,而不要去聲明具體的方法體,因為具體的方法體的實現是由繼承該接口的類來去實現的。

 接口定義的一般形式為:

 [訪問控制符]interface <接口名> {

         類型標識符final 符號常量名n = 常數;

         返回值類型  方法名([參數列表]);

         …

 }        

  定義接口實例:

interface Human {
	
	//定義一個全局變量
	final String txt="吸煙有害健康";
	
	//定義一個抽象方法
	public void isSmoke();
}

 2.實現:要實現接口,就必須去實現接口規定的方法,隻有把接口規定的抽象方法都給實現瞭,才承認這個類實現瞭這個接口,實現瞭這個接口代表的某種功能。使用 implements 關鍵字實現接口。

  實現接口實例:

class Student implements Human{
	 
	public void isSmoke() {
		System.out.println("Students can't smoke.");
	}
	
	public static void main(String[] args) {
		Student h=new Student();  
        h.isSmoke();  
        System.out.println(txt);
	}
}

3.接口的繼承

  子接口可以對父接口的方法和常量進行重寫。例如:

// 接口 Student 繼承 Human
public interface Student extends Human {
 
    // 重寫父接口中的txt
    String txt = "未成年禁止吸煙";  
    
    // 重寫父接口中的isSmoke()方法
    void isSmoke();  
}

 註意: 在Java中,類的多繼承是不合法的,但接口允許多繼承

public interface C extends A, B

三.比較抽象類與接口

Q: 為什麼有瞭抽象類還要接口?

看起來抽象類除瞭多繼承以外,完全可以完成接口所作的事情,為什麼還需要定義接口呢?

1、避免java單繼承的局限
2、避免多繼承帶來的復雜性和低效性
3、面向接口編程帶來的優勢。降低程序間的耦合,易擴展,易維護

 Q: 如何確定在什麼情況下應該使用接口,什麼情況下應該使用類呢?

        抽象類和接口都是用來指定多個對象的共同特征的。那麼如何確定在什麼情況下應該使用接口,什麼情況下應該使用類呢?一般來說,清晰描述父子關系的強的“是……的一種”關系應該用類建模。弱的“是..的一種”關系也稱為類屬關系,它表明對象擁有某種屬性,可以用接口來建模。

類型抽象類接口定義abstract關鍵字interface關鍵字繼承可以繼承一個類和實現多個接口;子類隻可以繼承一個抽象類接口隻可以繼承接口(一或多);子類可以實現多個接口方法實現可定義構造方法,可以有抽象方法和具體方法無構造方法,且方法都是抽象的,也沒有方法的實現實現方式子類使用extend關鍵字來繼承抽象類。如果子類不是抽象類,需要提供抽象類中所有聲明的方法的實現子類使用關鍵字implements來實現接口。需要提供接口中所有聲明的方法的實現作用把相同的東西提取出來,即重用把程序模塊進行固化的契約,降低耦合

到此這篇關於Java中比較抽象類與接口的異同的文章就介紹到這瞭,更多相關Java抽象類與接口內容請搜索WalkonNet以前的文章或繼續瀏覽下面的相關文章希望大傢以後多多支持WalkonNet!

推薦閱讀: