Java中的抽象類和接口你了解嗎
抽象類
什么是抽象類?

類和類之間有共同特征,將這些共同特征提取出來進(jìn)一步抽象,就形成了抽象類。由于類是不存在的,所以抽象類無法創(chuàng)建對(duì)象。
抽象類屬于什么類型?
抽象類也屬于引用數(shù)據(jù)類型。
抽象類怎么定義?
[修飾符列表] abstract class 類名{
類體;
}
抽象類是干什么的?
抽象類無法實(shí)例化,無法創(chuàng)建對(duì)象,所以抽象類是用來被子類繼承的,抽象類中構(gòu)造方法可以供子類使用。
final與abstract是對(duì)立的兩個(gè)關(guān)鍵字,不能聯(lián)合使用。
什么是抽象方法?
抽象方法表示沒有實(shí)現(xiàn)的方法,沒有方法體的方法。
例如:
public abstract void doSome();
特點(diǎn)一:抽象方法沒有方法體,以分號(hào)結(jié)尾。
特點(diǎn)二:抽象方法前面的修飾符列表必須有abstract關(guān)鍵字。
特點(diǎn)三:抽象類中可以沒有抽象方法,但抽象方法只能出現(xiàn)在抽象類中和接口中。
易錯(cuò):并不是所有沒有方法體的方法都叫做抽象方法!
非抽象類繼承抽象類
以下面代碼為例:
代碼
//抽象類
public abstract class Animal {
//抽象方法
public abstract void move();
}
//非抽象類繼承抽象類
class Bird extends Animal{
}
這樣寫有問題嗎?有問題!
編譯器會(huì)給出以下結(jié)果:

抽象方法只能出現(xiàn)在抽象類中,當(dāng)Bird類繼承Animal類之后,會(huì)將抽象方法也繼承過去,所以我們需要在Bird類中通過重寫的方式將抽象方法實(shí)現(xiàn)了。
代碼
//抽象類
public abstract class Animal {
}
//非抽象類繼承抽象類
class Bird extends Animal{
//向上轉(zhuǎn)型
Animal a = new Bird();
}
這樣寫有問題嗎?沒有問題!
a的類型是Animal,是抽象的,所以這就是面向抽象編程,降低程序的耦合度,提高程序的擴(kuò)展性。
抽象類總結(jié)
- 抽象類通過在class前面加abstract來定義。
- 抽象類是無法實(shí)例化的,無法創(chuàng)建對(duì)象的,所以抽象類是用來被子類繼承的。
- final與abstract是對(duì)立的,不能聯(lián)和使用。
- 抽象類子類可以是抽象類,也可以是非抽象類。
- 抽象類雖然無法實(shí)例化,但是抽象類有構(gòu)造方法,可以供子類使用。
- 抽象類中不一定有抽象方法,但是抽象方法只能出現(xiàn)在抽象類和接口中。
- 抽象方法的定義:public abstract void doSome();
- 一個(gè)非抽象類繼承抽象類,必須將抽象類中的抽象方法進(jìn)行覆蓋。
接口
接口的基礎(chǔ)語法
- 接口也是一個(gè)"引用數(shù)據(jù)類型",編譯之后也會(huì)形成一個(gè)class字節(jié)碼文件。
- 接口是完全抽象的(抽象類是半抽象的)。
- 接口的語法如下:
[修飾符列表] interface 接口名{......}//修飾符列表可以不寫
- 接口支持多繼承,一個(gè)接口可以繼承多個(gè)接口。
- 接口中只包含兩部分內(nèi)容:常量和抽象方法。
- 接口中所有元素都是public修飾的,都是公開的。
- 接口中定義抽象方法時(shí):public abstract修飾符可以省略。
- 接口中定義常量時(shí):public static final修飾符可以省略。
接口的實(shí)現(xiàn)
類和類之間存在繼承,接口和類之間存在類似的關(guān)系,叫做實(shí)現(xiàn)。
接口實(shí)現(xiàn)的關(guān)鍵字:implements
語法如下:
class A implements B{......}
我們也可以把實(shí)現(xiàn)看成一種特殊的繼承(接口和類之間的關(guān)系),但是要注意關(guān)鍵字的不同。
注意點(diǎn):
一:實(shí)現(xiàn)的關(guān)鍵字與繼承不同,是implements。
二:當(dāng)非抽象類實(shí)現(xiàn)接口時(shí),一定要將接口中的抽象方法重寫。
三:在類中實(shí)現(xiàn)接口中抽象方法時(shí),修飾符列表不能省略。
四:一個(gè)類可以實(shí)現(xiàn)多個(gè)接口,這樣彌補(bǔ)了類和類之間只存在單繼承的缺陷。
接口和多態(tài)聯(lián)合使用
接口是完全抽象的,無法實(shí)例化,但是接口可以通過實(shí)現(xiàn)與多態(tài)聯(lián)合使用。
如下:
//接口
interface A{
//抽象方法
int add(int a , int b);
}
//一個(gè)類實(shí)現(xiàn)了接口B
class B implements A{
//重寫了接口中的抽象方法
public int add(int a , int b){
return a+b;
}
public static void main(String[] args) {
//A接口的引用指向了B類的對(duì)象
//面向接口編程
A a = new B();
}
}
繼承和實(shí)現(xiàn)同時(shí)出現(xiàn)
extends 和 implements可以同時(shí)出現(xiàn),同時(shí)出現(xiàn)時(shí),要將extends寫在前面,inplements寫在后面。
class Animal{
}
interface Flyable{
void fly();
}
//當(dāng)繼承和實(shí)現(xiàn)同時(shí)出現(xiàn)時(shí),繼承寫前面,實(shí)現(xiàn)寫后面
class Bird extends Animal implements Flyable{
public void fly(){
System.out.println("Bird學(xué)會(huì)了飛翔!");
}
public static void main(String[] args) {
Flyable b = new Bird();
b.fly();
}
}
接口在開發(fā)中的作用
面向接口編程,可以降低程序耦合度,提高程序擴(kuò)展力,符合ocp開發(fā)原則。
任何一個(gè)接口都有調(diào)用者和實(shí)現(xiàn)者,調(diào)用者面向接口調(diào)用,實(shí)現(xiàn)者面向接口編寫實(shí)現(xiàn),接口和多態(tài)一起使用可以將調(diào)用者和實(shí)現(xiàn)者解耦合(切斷二者的關(guān)系)。
類型和類型之間的關(guān)系
is a:
Cat is a Animal
凡是能滿足 is a 的表示繼承關(guān)系,可以讓Cat類繼承Animal類。
has a
Bird has a Wing
凡是能滿足 has a 的表示關(guān)聯(lián)關(guān)系。
管理關(guān)系通常以屬性的修飾存在,可以將Wing定義為Bird類中的一個(gè)實(shí)例變量。
like a
Cook like a Menu(比較抽象)
凡是能滿足 like a 的表示實(shí)現(xiàn)關(guān)系,可以用Cook這個(gè)類來實(shí)現(xiàn)Menu這個(gè)接口。
總結(jié)
本篇文章就到這里了,希望能夠給你帶來幫助,也希望您能夠多多關(guān)注腳本之家的更多內(nèi)容!
相關(guān)文章
Java中的非對(duì)稱加密算法原理與實(shí)現(xiàn)方式
在當(dāng)今的信息時(shí)代,數(shù)據(jù)安全已經(jīng)成為了一個(gè)至關(guān)重要的問題,加密技術(shù)作為保障信息安全的重要手段,受到了廣泛的應(yīng)用和關(guān)注,本篇文章將詳細(xì)介紹Java中的非對(duì)稱加密算法原理及其實(shí)現(xiàn)方式,需要的朋友可以參考下2023-12-12
Springboot集成RabbitMQ死信隊(duì)列的實(shí)現(xiàn)
在大多數(shù)的MQ中間件中,都有死信隊(duì)列的概念。本文主要介紹了Springboot集成RabbitMQ死信隊(duì)列的實(shí)現(xiàn),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2021-09-09
Mybatis中collection和association的使用區(qū)別詳解
這篇文章主要介紹了Mybatis中collection和association的使用區(qū)別詳解,小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧2018-11-11
Java concurrency集合之 CopyOnWriteArrayList_動(dòng)力節(jié)點(diǎn)Java學(xué)院整理
這篇文章主要介紹了Java concurrency集合之 CopyOnWriteArrayList的相關(guān)資料,需要的朋友可以參考下2017-06-06
SpringBoot整合easyExcel實(shí)現(xiàn)CSV格式文件的導(dǎo)入導(dǎo)出
這篇文章主要為大家詳細(xì)介紹了SpringBoot整合easyExcel實(shí)現(xiàn)CSV格式文件的導(dǎo)入導(dǎo)出,文中的示例代碼講解詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴可以參考下2024-02-02
詳細(xì)講述Java中的對(duì)象轉(zhuǎn)型
在本篇文章里我們給大家詳細(xì)分享了關(guān)于Java中的對(duì)象轉(zhuǎn)型的知識(shí)點(diǎn)內(nèi)容,有興趣的朋友們學(xué)習(xí)下。2018-10-10

