Java中比較抽象類與接口的異同
一.抽象類
(一)概念
? ? ? 在繼承的層次結(jié)構(gòu)中,每個(gè)新的子類都使類變得更加明確和具體。如果從一個(gè)子類向父類追溯,類就會(huì)變得更通用、更加不明確。類的設(shè)計(jì)應(yīng)該確保父類包含它的子類的共同特征。有時(shí)候,一個(gè)父類設(shè)計(jì)得非常抽象,以至于它都沒有任何具體的實(shí)例。這樣的類稱為抽象類(abstract class)。在類的頭部使用?abstract?修飾符表示該類為抽象類。
(二)抽象類和抽象方法
? ? ? ?同樣用?abstract?聲明抽象方法。抽象方法(abstract method)只定義成員方法的接口形式,而沒有具體操作。只有派生類對(duì)抽象成員方法的重定義才能真正實(shí)現(xiàn)與該派生類相關(guān)的操作。在各子類繼承了父類的抽象方法之后,再分別用不同的語句和方法體來重新定義它,形成若干個(gè)名字相同、返回值相同、參數(shù)列表相同、目的一致但是具體實(shí)現(xiàn)有一定差別的方法。抽象類中定義抽象方法的目的是實(shí)現(xiàn)一個(gè)接口,即所有的子類對(duì)外都呈現(xiàn)一個(gè)相同名字的方法。
1.一個(gè)包含抽象方法的類必須聲明為抽象類
? ? 幾點(diǎn)說明:
? ?1.抽象類不一定有抽象方法,但有抽象方法的類一定是抽象類。
? ?2.即使子類的父類是具體的,這個(gè)子類也可以是抽象的。
? ?3.當(dāng)父類的方法實(shí)現(xiàn)在子類中變得無效時(shí),子類可以重寫父類的方法并將它定義為抽象的。
2.抽象方法只有定義而沒有實(shí)現(xiàn),它的實(shí)現(xiàn)由子類提供
? 下面定義了一個(gè)抽象類Object類:
public abstract class Object { public abstract double getArea(); public abstract double getPerimeter(); }
Object類是多個(gè)子類的父類,由于在多個(gè)子類中都要用到getArea()方法和getPermeter()方法,所以在父類中定義比較好;由于計(jì)算面積和周長的getArea()方法和getPermeter()方法在不同子類里的實(shí)現(xiàn)方式不同,所以O(shè)bject類中定義的這兩個(gè)方法的實(shí)現(xiàn)只能由子類提供。
3.抽象類無法被直接實(shí)例化,可以讓子類繼承然后實(shí)例化子類
? 通過一個(gè)例子來說明:
public abstract class Person { //定義一個(gè)抽象方法 public abstract void isSmoke(); } //學(xué)生類 class Students extends Person{ //繼承抽象類后抽象類中的抽象方法必須在子類中實(shí)現(xiàn) public void isSmoke() { System.out.print("Students can't smoke."); } } //教師類 class Teachers extends Person{ public void isSmoke() { System.out.print("Teachers can smoke."); } }
(三)使用抽象類的意義
? ? ? ?因?yàn)槌橄箢惒荒軐?shí)例化對(duì)象,必須要有子類來實(shí)現(xiàn)它之后才能使用。這樣就可以把一些具有相同屬性和方法的組件進(jìn)行抽象,更有利于代碼和程序的維護(hù)。同時(shí),抽象類也是Java面向?qū)ο蟮囊粋€(gè)重要體現(xiàn)。
二.接口
(一)概念
? ? ? ? ?接口(Interface),在Java編程語言中是一個(gè)抽象類型,是象方法的集合。
? ? ? ? ?接口通常以? ?interface??來聲明。一個(gè)類通過繼承接口的方式,從而來繼承接口的抽象方法。
? ? 接口有以下特性:
接口是隱式抽象的,當(dāng)聲明一個(gè)接口的時(shí)候,不必使用abstract關(guān)鍵字。接口中每一個(gè)方法也是隱式抽象的,聲明時(shí)同樣不需要abstract關(guān)鍵字。接口中的方法都是公有的。
(二)語法
?1. 定義:一個(gè)簡單的接口擁有全局變量和抽象方法。在接口中的所有方法都必須只聲明方法標(biāo)識(shí),而不要去聲明具體的方法體,因?yàn)榫唧w的方法體的實(shí)現(xiàn)是由繼承該接口的類來去實(shí)現(xiàn)的。
?接口定義的一般形式為:
?[訪問控制符]interface <接口名> {
? ? ? ? ?類型標(biāo)識(shí)符final 符號(hào)常量名n = 常數(shù);
? ? ? ? ?返回值類型? 方法名([參數(shù)列表]);
? ? ? ? ?…
?}????????
? 定義接口實(shí)例:
interface Human { //定義一個(gè)全局變量 final String txt="吸煙有害健康"; //定義一個(gè)抽象方法 public void isSmoke(); }
?2.實(shí)現(xiàn):要實(shí)現(xiàn)接口,就必須去實(shí)現(xiàn)接口規(guī)定的方法,只有把接口規(guī)定的抽象方法都給實(shí)現(xiàn)了,才承認(rèn)這個(gè)類實(shí)現(xiàn)了這個(gè)接口,實(shí)現(xiàn)了這個(gè)接口代表的某種功能。使用 implements 關(guān)鍵字實(shí)現(xiàn)接口。
? 實(shí)現(xiàn)接口實(shí)例:
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.接口的繼承
??子接口可以對(duì)父接口的方法和常量進(jìn)行重寫。例如:
// 接口 Student 繼承 Human public interface Student extends Human { // 重寫父接口中的txt String txt = "未成年禁止吸煙"; // 重寫父接口中的isSmoke()方法 void isSmoke(); }
?注意: 在Java中,類的多繼承是不合法的,但接口允許多繼承。
public interface C extends A, B
三.比較抽象類與接口
Q: 為什么有了抽象類還要接口?
看起來抽象類除了多繼承以外,完全可以完成接口所作的事情,為什么還需要定義接口呢?
1、避免java單繼承的局限
2、避免多繼承帶來的復(fù)雜性和低效性
3、面向接口編程帶來的優(yōu)勢。降低程序間的耦合,易擴(kuò)展,易維護(hù)
?Q: 如何確定在什么情況下應(yīng)該使用接口,什么情況下應(yīng)該使用類呢?
? ? ? ? 抽象類和接口都是用來指定多個(gè)對(duì)象的共同特征的。那么如何確定在什么情況下應(yīng)該使用接口,什么情況下應(yīng)該使用類呢?一般來說,清晰描述父子關(guān)系的強(qiáng)的“是......的一種”關(guān)系應(yīng)該用類建模。弱的“是..的一種”關(guān)系也稱為類屬關(guān)系,它表明對(duì)象擁有某種屬性,可以用接口來建模。
類型抽象類接口定義abstract關(guān)鍵字interface關(guān)鍵字繼承可以繼承一個(gè)類和實(shí)現(xiàn)多個(gè)接口;子類只可以繼承一個(gè)抽象類接口只可以繼承接口(一或多);子類可以實(shí)現(xiàn)多個(gè)接口方法實(shí)現(xiàn)可定義構(gòu)造方法,可以有抽象方法和具體方法無構(gòu)造方法,且方法都是抽象的,也沒有方法的實(shí)現(xiàn)實(shí)現(xiàn)方式子類使用extend關(guān)鍵字來繼承抽象類。如果子類不是抽象類,需要提供抽象類中所有聲明的方法的實(shí)現(xiàn)子類使用關(guān)鍵字implements來實(shí)現(xiàn)接口。需要提供接口中所有聲明的方法的實(shí)現(xiàn)作用把相同的東西提取出來,即重用把程序模塊進(jìn)行固化的契約,降低耦合
到此這篇關(guān)于Java中比較抽象類與接口的異同的文章就介紹到這了,更多相關(guān)Java抽象類與接口內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
java發(fā)起http請(qǐng)求調(diào)用post與get接口的方法實(shí)例
在實(shí)際開發(fā)過程中,我們經(jīng)常需要調(diào)用對(duì)方提供的接口或測試自己寫的接口是否合適,下面這篇文章主要給大家介紹了關(guān)于java發(fā)起http請(qǐng)求調(diào)用post與get接口的相關(guān)資料,需要的朋友可以參考下2022-08-08淺析JAVA常用JDBC連接數(shù)據(jù)庫的方法總結(jié)
本篇文章是對(duì)在JAVA中常用JDBC連接數(shù)據(jù)庫的方法進(jìn)行了詳細(xì)的總結(jié)分析,需要的朋友參考下2013-07-07Spring boot實(shí)現(xiàn)文件上傳實(shí)例(多文件上傳)
本篇文章主要介紹了Spring boot實(shí)現(xiàn)文件上傳實(shí)例(多文件上傳),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2017-05-05Spring中的@Scheduled定時(shí)任務(wù)注解詳解
這篇文章主要介紹了Spring中的@Scheduled定時(shí)任務(wù)注解詳解,要使用@Scheduled注解,首先需要在啟動(dòng)類添加@EnableScheduling,啟用Spring的計(jì)劃任務(wù)執(zhí)行功能,這樣可以在容器中的任何Spring管理的bean上檢測@Scheduled注解,執(zhí)行計(jì)劃任務(wù),需要的朋友可以參考下2023-09-09Java中的this、super、final關(guān)鍵字詳解
這篇文章主要介紹了Java中的this、super、final關(guān)鍵字詳解,它在方法內(nèi)部使用,表示這個(gè)方法所屬對(duì)象的引用,它在構(gòu)造器內(nèi)部使用,表示該構(gòu)造器正在初始化的對(duì)象,this 可以調(diào)用類的屬性、方法和構(gòu)造器,需要的朋友可以參考下2023-09-09Java中BigDecimal除法使用不當(dāng)導(dǎo)致精度問題
本文主要介紹了Java中BigDecimal除法使用不當(dāng)導(dǎo)致精度問題,文中通過示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2021-11-11Java?Hutool工具包中HttpUtil的日志統(tǒng)一打印及統(tǒng)一超時(shí)時(shí)間配置
Hutool是一個(gè)Java基礎(chǔ)工具類,對(duì)文件、流、加密解密、轉(zhuǎn)碼、正則、線程、XML等JDK方法進(jìn)行封裝,組成各種Util工具類,這篇文章主要給大家介紹了關(guān)于Java?Hutool工具包中HttpUtil的日志統(tǒng)一打印及統(tǒng)一超時(shí)時(shí)間配置的相關(guān)資料,需要的朋友可以參考下2024-01-01spring中bean id相同引發(fā)故障的分析與解決
最近在工作中遇到了關(guān)于bean id相同引發(fā)故障的問題,通過查找相關(guān)資料終于解決了,下面這篇文章主要給大家介紹了因?yàn)閟pring中bean id相同引發(fā)故障的分析與解決方法,需要的朋友可以參考借鑒,下面來一起看看吧。2017-09-09