淺談Java抽象類和接口的個人理解
今天來說一波自己對Java中抽象類和接口的理解,含參考內(nèi)容:
一、抽象類
1、定義:
public abstract class 類名{}
Java語言中所有的對象都是用類來進行描述,但是并不是所有的類都是用來描述對象的。我所理解的抽象類其實就是對同一類事物公共部分的高度提取,這個公共部分包括屬性和行為。比如牛、羊、豬它們的公共屬性是都有毛,公共行為是都哺乳,所以我們可以把公共部分抽象成一個哺乳類,含有屬性毛和行為哺乳,當牛、羊、豬繼承了哺乳類后也就有了哺乳的功能,至于怎么完成這個功能就需要自己去實現(xiàn)了。
2、特點
(1)被Abstract關(guān)鍵字修飾的類是抽象類;
(2)含有抽象方法的類一定是抽象類,但是抽象類不一定含有抽象方法;且抽象方法必須是public或protected,否則不能被子類繼承。默認為public。
(3)抽象方法中不能有實現(xiàn),否則編譯報錯;
(4)抽象類中可以定義自己的成員變量和成員方法;
(5)子類繼承抽象類時,必須實現(xiàn)抽象類中的所有抽象方法,否則該子類也要被定義為抽象類;
(6)抽象類不能被實例化。
3、驗證以上規(guī)定是否確實如其所述
這是我在word中編輯的一張驗證表,把它截成圖片放在這里:

從上圖的驗證結(jié)果來看,那些理論都是正確的
二、接口
1、定義:
public interface 接口名{}
接口是用來提供方法的。按我的理解,它是對多個類公共行為的高度提取,比如所有的動物它們的公共行為是吃和睡,那么我們就可以將這兩個行為提取出來封裝在一個接口中,當某個動物需要執(zhí)行這個行為的時候只要調(diào)用該接口,然后在自己的類里面完成具體實現(xiàn)就行。這樣理解好像跟抽象類沒什么區(qū)別,那再看下面的這個例子。如果把這兩個行為放在抽象類中,但是該抽象類中還有一個爬的行為,此時當一種爬行動物,比如蛇,當它繼承這個類的時候,會實現(xiàn)吃、睡、爬行這三個方法,于是它便有了吃、睡、爬的功能;但是如果一個飛行類的動物如鳥,當它繼承了這個方法的時候,同樣的也有了吃、睡、爬的功能,很明顯,爬不是它需要的功能,這就有點詞不達意了,但是當他們繼承了只有吃、睡的接口,就有了吃、睡的基本功能,至于爬和飛,可以抽象出來放在抽象類中,按需繼承,按需實現(xiàn)自己需要的功能就OK了。
2、特點:
(1)接口中可以有自己的成員變量,但會被隱式地指定為public staic final,而且也只能是public staic final的,接口中所有的方法都是抽象方法,都會被隱式地指定為public abstract的。
(2)接口中只定義抽象方法,沒有具體的實現(xiàn);
(3)實現(xiàn)接口的類必須實現(xiàn)接口中定義的所有方法;
3、驗證以上理論是否正確

同樣,驗證出上面的理論都是對的!
三、抽象類和接口的區(qū)別:
1、抽象類中可以有自己的成員方法及它們的具體實現(xiàn);接口中只能含有抽象方法;
2、抽象類中可以含有各種類型的成員變量;接口中的成員變量只能是public static final的;
3、一個類只能繼承一個抽象類,但可以實現(xiàn)多個接口;
4、抽象類中可以含有靜態(tài)代碼塊和靜態(tài)方法;接口中不能定義靜態(tài)代碼塊和靜態(tài)方法;
驗證一個類只能繼承一個抽象類,但能實現(xiàn)多個接口
首先,定義兩個抽象類:一個Mummals哺乳類,一個Crawler爬行類
/**
* @createtime 2017年3月17日 上午10:33:27
* @description 哺乳類
*/
public abstract class Mammals {
public String foods;
public abstract void nurse();
public void eat(String food){
this.foods = food;
System.out.println("吃"+foods);
}
}
/**
*
* @createtime 2017年3月17日 上午11:23:09
* @description 定義一個抽象類--爬行類
*/
public abstract class Crawler {
public abstract void crawl();
}
其次,定義兩個接口:一個是BaseAction基礎(chǔ)接口;一個是SpecialAction特殊接口
/**
*
* @createtime 2017年3月17日 上午11:03:42
* @description 定義一個名為基本行為的接口
*/
public interface BaseAction {
public String name = "";
public void eat();
public void sleep();
}
/**
* @createtime 2017年3月17日 上午11:24:56
* @description 定義一個接口用來實現(xiàn)特殊行為
*/
public interface SpecialAction {
public void study();
}
然后,定義一個基礎(chǔ)類People,繼承Mummals類,實現(xiàn)BaseAction接口和SpecialAction接口
/**
* @createtime 2017年3月17日 上午11:25:48
* @description 定義一個普通的類--人類,繼承哺乳類,實現(xiàn)基礎(chǔ)接口和特殊接口
*/
public class People extends Mammals implements BaseAction,SpecialAction{
@Override
public void study() {
// TODO Auto-generated method stub
}
@Override
public void eat() {
// TODO Auto-generated method stub
}
@Override
public void sleep() {
// TODO Auto-generated method stub
}
@Override
public void nurse() {
// TODO Auto-generated method stub
}
}
可以看出,一個子類是可以實現(xiàn)多個接口的
最后,讓基礎(chǔ)類People,同時繼承Mummals類和Crawler類
/**
* @createtime 2017年3月17日 上午11:25:48
* @description 定義一個普通的類--人類,繼承哺乳類,實現(xiàn)基礎(chǔ)接口和特殊接口
*/
public class People extends Mammals,Crawler{
@Override
public void nurse() {
// TODO Auto-generated method stub
}
}
總結(jié)
以上就是本文關(guān)于淺談Java抽象類和接口的個人理解的全部內(nèi)容,希望對大家有所幫助。感興趣的朋友可以繼續(xù)參閱本站:
如有不足之處,歡迎留言指出。感謝朋友們對本站的支持!
相關(guān)文章
Java中使用輾轉(zhuǎn)相除法求最大公約數(shù)
這篇文章主要介紹了Java中使用輾轉(zhuǎn)相除法求最大公約數(shù),本文直接給出代碼實例,需要的朋友可以參考下2015-05-05
Springboot中如何使用過濾器校驗PSOT類型請求參數(shù)內(nèi)容
在Springboot中創(chuàng)建過濾器,用來過濾所有POST類型請求并獲取body中的參數(shù)進行校驗內(nèi)容是否合法,該方法僅適用于POST類型請求,本文給大家介紹Springboot中如何使用過濾器校驗PSOT類型請求參數(shù)內(nèi)容,感興趣的朋友一起看看吧2023-08-08
Java中ScheduledExecutorService的使用方法詳解
ScheduledExecutorService是ExecutorService的一個子接口,它主要用于在給定的延遲之后或周期性地執(zhí)行任務(wù),本文主要介紹了ScheduledExecutorService的使用方法,感興趣的可以了解下2024-12-12
intellij idea 2021.2 打包并上傳運行spring boot項目的詳細過程(spring boot 2
這篇文章主要介紹了intellij idea 2021.2 打包并上傳運行一個spring boot項目(spring boot 2.5.4),本文通過圖文并茂的形式給大家介紹的非常詳細,需要的朋友可以參考下2021-09-09

