您好,登錄后才能下訂單哦!
本篇內容主要講解“Java中怎么比較抽象類與接口的異同”,感興趣的朋友不妨來看看。本文介紹的方法操作簡單快捷,實用性強。下面就讓小編來帶大家學習“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
看起來抽象類除了多繼承以外,完全可以完成接口所作的事情,為什么還需要定義接口呢?
1、避免java單繼承的局限
2、避免多繼承帶來的復雜性和低效性
3、面向接口編程帶來的優勢。降低程序間的耦合,易擴展,易維護
抽象類和接口都是用來指定多個對象的共同特征的。那么如何確定在什么情況下應該使用接口,什么情況下應該使用類呢?一般來說,清晰描述父子關系的強的“是......的一種”關系應該用類建模。弱的“是..的一種”關系也稱為類屬關系,它表明對象擁有某種屬性,可以用接口來建模。
類型抽象類接口定義abstract關鍵字interface關鍵字繼承可以繼承一個類和實現多個接口;子類只可以繼承一個抽象類接口只可以繼承接口(一或多);子類可以實現多個接口方法實現可定義構造方法,可以有抽象方法和具體方法無構造方法,且方法都是抽象的,也沒有方法的實現實現方式子類使用extend關鍵字來繼承抽象類。如果子類不是抽象類,需要提供抽象類中所有聲明的方法的實現子類使用關鍵字implements來實現接口。需要提供接口中所有聲明的方法的實現作用把相同的東西提取出來,即重用把程序模塊進行固化的契約,降低耦合
到此,相信大家對“Java中怎么比較抽象類與接口的異同”有了更深的了解,不妨來實際操作一番吧!這里是億速云網站,更多相關內容可以進入相關頻道進行查詢,關注我們,繼續學習!
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。