相信大家都有這種感覺:抽象類與接口這兩者有太多相似的地方,又有太多不同的地方。往往這二者可以讓初學(xué)者摸不著頭腦,無論是在實(shí)際編程的時(shí)候,還是在面試的時(shí)候,抽象類與接口都顯得格外重要!希望看完這篇文章各位都能從容地明了二者...
我所理解的抽象類
1、抽象類和類的相樣韻味
1)、抽象類和類一樣,都是可以用來繼承的
2)、類可以有的成分,抽象類都可以擁有【包括構(gòu)造方法、static靜態(tài)修飾成分等】
抽象類正如這個(gè)名字定義一樣,它也是一個(gè)類
2、抽象方法
講不同樣韻味之前很有必要要先深知的抽象方法:
1)、抽象方法沒有方法體
2)、抽象方法必須用abstract
關(guān)鍵字修飾
3)、有抽象方法的類必然是抽象類
4)、抽象方法必須為public
或者protected
,缺省情況下默認(rèn)為public
抽象類不一定有抽象方法
3、抽象類和類的異樣韻味
1)、抽象類必須用abstract關(guān)鍵字進(jìn)行修飾,有abstract修飾的類就是抽象類!
2)、抽象類可有可無抽象方法
3)、抽象類雖然有構(gòu)造方法但不能用來直接創(chuàng)建對(duì)象實(shí)例
4)、抽象類不能用final
、private
修飾
5)、外部抽象類不能用Static修飾,但內(nèi)部的抽象類可以使用static聲明。這句話理解代碼如下:
//定義一個(gè)抽象類A abstract class A{ //定義一個(gè)內(nèi)部抽象類B static abstract class B{ //static定義的內(nèi)部類屬于外部類 public abstract void saoMethod(); } } class C extends A.B{ public void saoMethod(){ System.out.println("======saoMethod方法執(zhí)行了======"); } } public class StaticDemo { public static void main(String[] args) { A.B ab = new C();//向上轉(zhuǎn)型 ab.saoMethod(); } } 運(yùn)行結(jié)果: ======saoMethod方法執(zhí)行了======
有的童鞋就看懵逼了, C extends A.B
是啥騷操作啊,還能這樣玩?是的,當(dāng)使用static
聲明的內(nèi)部抽象類相當(dāng)于一個(gè)外部抽象類,繼承的時(shí)候使用“外部類.內(nèi)部類”的形式表示類名稱。這種騷操作屬實(shí)是穩(wěn)中帶皮。
抽象類是一個(gè)特殊的類,抽象類和普通類有著本質(zhì)區(qū)別
4、掌握抽象類
抽象類就是為了繼承而存在的,定義了一個(gè)抽象類,卻不去繼承它,創(chuàng)建的這個(gè)抽象類就毫無意義!
抽象類雖然有構(gòu)造方法但不能直接被實(shí)例化,要?jiǎng)?chuàng)建對(duì)象涉及向上轉(zhuǎn)型,主要是用于被其子類調(diào)用
還有對(duì)于抽象類可以沒有抽象方法這句話,這只是一個(gè)要記住的重要概念,一定要記住!實(shí)際開發(fā)中抽象類一般都有抽象方法,不然該抽象類就失去存在意義,和普通類沒啥兩樣!
一個(gè)普通類A繼承一個(gè)抽象類B,則子類A必須實(shí)現(xiàn)父類B的所有抽象方法。如果子類A沒有實(shí)現(xiàn)父類B的抽象方法,則必須將子類A也定義為為abstract類,也就是抽象類。
我所理解的接口
接口(interface)可以說成是抽象類的一種特例,抽象類與接口這兩者有太多相似的地方,又有太多不同的地方。相對(duì)的,接口更像是一種行為的抽象!
1、接口特性
1)、接口中的方法默認(rèn)為public abstract類型,接口中的成員變量類型不寫默認(rèn)為public static final。
2)、接口沒有構(gòu)造方法
3)、接口可以實(shí)現(xiàn)“多繼承”,一個(gè)類可以實(shí)現(xiàn)多個(gè)接口,實(shí)現(xiàn)寫法格式為直接用逗號(hào)隔開即可。
2、接口必知
接口中只能含有public static final
變量,不寫默認(rèn)是public static final
,用private
修飾會(huì)編譯失敗。
接口中所以的方法會(huì)被隱式地指定為public abstract
方法且只能是public abstract
方法,用其他關(guān)鍵字,比如private、protected、static、 final等修飾會(huì)編譯失敗。
3、接口誤區(qū)
網(wǎng)上很多文章說接口中的所有方法都是抽象方法,博主回去研究了一下發(fā)現(xiàn),實(shí)際上這樣說是不夠嚴(yán)謹(jǐn)?shù)?,直接看個(gè)簡(jiǎn)單程序吧
package InterfaceDemo; interface AA{ //接口AA default void hh(){ System.out.println("123"); }; } class BB implements AA{ //實(shí)現(xiàn)接口 } public class InterfaceDesign { public static void main(String[] args) { AA a=new BB(); //通過實(shí)現(xiàn)類創(chuàng)建實(shí)例 a.hh(); } } 運(yùn)行結(jié)果: 123
顯然hh
方法并不是抽象方法,但是這樣設(shè)計(jì)就失去接口的意義了,實(shí)際開發(fā)中不會(huì)出現(xiàn)這樣的代碼,確實(shí)有點(diǎn)專牛角尖的韻味,所以我也不否認(rèn)網(wǎng)上的言論,只是覺得不夠嚴(yán)謹(jǐn),我覺得大家還是注意一下比較好...如果面試官聽到你這樣的回答,可能對(duì)你刮目相看,會(huì)認(rèn)為你是一個(gè)對(duì)知識(shí)極度向往、探索以及有個(gè)人思維想法的學(xué)習(xí)者 ~說白了,就是杠精,這里杠精是褒義詞~
抽象類和接口本質(zhì)區(qū)別
抽象類和接口本質(zhì)區(qū)別主要從語法區(qū)別和設(shè)計(jì)思想兩方面下手
1、語法區(qū)別
1.抽象類可以有構(gòu)造方法,接口中不能有構(gòu)造方法。
2.抽象類中可以有任何類型成員變量,接口中只能有
public static final
變量3.抽象類中可以包含非抽象的普通方法,接口中的可以有非抽象方法,比如
deaflut
方法4.抽象類中的抽象方法的訪問類型可以是
public
,protected
和(默認(rèn)類型,雖然eclipse
下不報(bào)錯(cuò),但應(yīng)該也不行),但接口中的抽象方法只能是public
類型的,并且默認(rèn)即為public abstract
類型。5.抽象類中可以包含靜態(tài)方法,接口中不能包含靜態(tài)方法
6.抽象類和接口中都可以包含靜態(tài)成員變量,抽象類中的靜態(tài)成員變量的訪問類型可以任意,但接口中定義的變量只能是
public static final
類型,并且默認(rèn)即為public static final
類型。7.一個(gè)類可以實(shí)現(xiàn)多個(gè)接口,但只能繼承一個(gè)抽象類。
2、設(shè)計(jì)思想?yún)^(qū)別
對(duì)于抽象類,如果需要添加新的方法,可以直接在抽象類中添加具體的實(shí)現(xiàn)(相當(dāng)于寫普通類的普通方法并添加方法體的實(shí)現(xiàn)代碼),子類可以不進(jìn)行變更;而對(duì)于接口則不行,如果接口進(jìn)行了變更,則所有實(shí)現(xiàn)這個(gè)接口的類都必須進(jìn)行相應(yīng)的改動(dòng)。這一點(diǎn)應(yīng)該很好理解。
從設(shè)計(jì)角度來講抽象類是對(duì)一種對(duì)類抽象,抽象類是對(duì)整個(gè)類整體進(jìn)行抽象,包括屬性、行為。而接口是對(duì)行為的抽象,接口是對(duì)類局部(行為)進(jìn)行抽象。從某一角度來講,接口更像是抽象的抽象!
怎么理解上面這段話呢?
理解二者設(shè)計(jì)思想的區(qū)別從程序員宜春和花姑娘(一頭可愛的小母豬)的故事開始,程序員宜春每天過著三點(diǎn)一線的生活,不是吃就是睡覺,閑暇之余還會(huì)敲敲代碼,而花姑娘就厲害了,每天都是一點(diǎn)一線的生活,不是吃就是睡覺,閑暇之余不是吃就是睡覺。程序員宜春和花姑娘都過著幸福安逸的生活,突然有一天,風(fēng)起云涌,天射大便~天色大變~,萬惡的產(chǎn)品經(jīng)理來需求了,要設(shè)計(jì)一個(gè)程序員宜春和花姑娘的一個(gè)程序,要求使用抽象類或者接口去設(shè)計(jì),這個(gè)時(shí)候你會(huì)怎么去設(shè)計(jì),下面給出兩個(gè)設(shè)計(jì)方案...
方案一:使用抽象類設(shè)計(jì),分別設(shè)計(jì)eat、sleep、qiaoDaiMa
方法,具體代碼如下:
abstract class Myclass{ public abstract void eat(); public abstract void sleep(); public abstract void qiaoDaiMa(); }
方案二:使用接口設(shè)計(jì),分別設(shè)計(jì)eat、sleep、qiaoDaiMa
方法,具體代碼如下:
interface Myclass{ public abstract void eat(); public abstract void sleep(); public abstract void qiaoDaiMa(); }
顯然,不管是哪個(gè)類繼承抽象類或者實(shí)現(xiàn)上面的接口,都會(huì)出現(xiàn)同樣的狀況:重寫它們的抽象方法。
如果有一百個(gè)程序員宜春,上面的設(shè)計(jì)都是很好地得到解決。但是到花姑娘身上就不管用了,花姑娘不會(huì)敲代碼這種高端操作啊!一百個(gè)花姑娘都重寫的qiaoDaiMa
方法都沒有意義啊,顯然這樣設(shè)計(jì)有問題。
從上面可以看出,eat、sleep
對(duì)于qiaoDaiMa
方法不是同一范疇內(nèi)的行為(方法)。實(shí)際上我們可以這樣設(shè)計(jì):定義一個(gè)抽象類,包含eat、sleep
方法,再定義一個(gè)接口包含qiaoDaiMa
方法,具體代碼如下:
abstract class Myclass{ public abstract void eat(); public abstract void sleep(); } interface MyclassTwo{ public abstract void qiaoDaiMa(); } class YiChun extends Myclass implements MyclassTwo{ @Override public void eat() { } @Override public void sleep() { } @Override public void qiaoDaiMa() { } }
我們只要讓一百個(gè)程序員宜春繼承抽象類并實(shí)現(xiàn)接口就好了,而花姑娘就直接繼承抽象類就好了。這樣一設(shè)計(jì),堪稱完美...
同樣的,這樣講述是很不負(fù)責(zé)的,為啥捏?因?yàn)槟銜?huì)發(fā)現(xiàn),這樣設(shè)計(jì)不管是抽象類還是接口好像沒有什么區(qū)別,剛才的抽象類換成接口,接口換成抽象類,實(shí)現(xiàn)效果也一致,代碼如下:
interface Myclass{ public abstract void eat(); public abstract void sleep(); } abstract class MyclassTwo{ public abstract void qiaoDaiMa(); }
所以,為了講解清晰設(shè)計(jì)思想?yún)^(qū)別,程序員宜春和花姑娘的故事不得不繼續(xù)講下去...
我們都知道,可愛的小母豬一般都是粉色的對(duì)吧,這個(gè)時(shí)候我們的產(chǎn)品經(jīng)理又改需求了。啥?產(chǎn)品經(jīng)理家中一百只小豬有一只是黑白sai的,額...
萬惡的產(chǎn)品經(jīng)理只會(huì)無理改需求,可是產(chǎn)品經(jīng)理永遠(yuǎn)不會(huì)知道他一味逼程序員,程序員自己都不知道自己有多優(yōu)秀!
我們都知道,可愛的小母豬一般都是粉色的對(duì)吧,這個(gè)時(shí)候我們的產(chǎn)品經(jīng)理又改需求了。啥?產(chǎn)品經(jīng)理家中一百只小豬有一只是黑白sai的,額...
萬惡的產(chǎn)品經(jīng)理只會(huì)無理改需求,可是產(chǎn)品經(jīng)理永遠(yuǎn)不會(huì)知道他一味逼程序員,程序員自己都不知道自己有多優(yōu)秀!
那么這個(gè)時(shí)候,我們都知道,抽象類和接口都是可以有成員變量的,只不過接口比較苛刻只能是public static final
正是因?yàn)檫@一點(diǎn)!抽象類和接口的設(shè)計(jì)精髓就在這里了,這個(gè)時(shí)候我們這樣設(shè)計(jì):
interface Myclass{ public abstract void eat(); public abstract void sleep(); } abstract class MyclassTwo{ String color="red"; public abstract void qiaoDaiMa(); }
讓宜春類這樣設(shè)計(jì)
package AbstractTest; interface Myclass { public abstract void eat(); public abstract void sleep(); } abstract class MyclassTwo { String color = "red"; public abstract void qiaoDaiMa(); } class YiChun extends MyclassTwo implements Myclass { @Override public void eat() { } @Override public void sleep() { } @Override public void qiaoDaiMa() { } } public class AbstractDemo { public static void main(String[] args) { YiChun yc = new YiChun(); } }
然而宜春對(duì)于color
這個(gè)屬性可以是不理睬的,可以當(dāng)做不存在,除非宜春不嫌棄自己也是一只紅sai佩奇哈哈哈....
而花姑娘類就要注意了!然后讓產(chǎn)品經(jīng)理家中的100只小豬設(shè)計(jì)代碼如下;
package AbstractTest; interface Myclass { public abstract void qiaoDaiMa(); } abstract class MyclassTwo { String color = "red"; public abstract void eat(); public abstract void sleep(); } class Pig extends MyclassTwo { @Override public void eat() { } @Override public void sleep() { } } public class AbstractDemo { public static void main(String[] args) { Pig p = new Pig (); String color = "blackWhite"; System.out.println(color); } }
其余的99只花姑娘就直接不用動(dòng)了也就是不需要String color = "blackWhite"
;這一句代碼,它的color
屬性默認(rèn)是red
了...
這個(gè)時(shí)候抽象類和接口就不能更換了,從而抽象類和接口的設(shè)計(jì)思想就很清晰了,你何識(shí)著咩啊~
本文來自?java入門?欄目,歡迎學(xué)習(xí)!
Atas ialah kandungan terperinci 深入理解java中抽象類和接口. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

Alat AI Hot

Undress AI Tool
Gambar buka pakaian secara percuma

Undresser.AI Undress
Apl berkuasa AI untuk mencipta foto bogel yang realistik

AI Clothes Remover
Alat AI dalam talian untuk mengeluarkan pakaian daripada foto.

Clothoff.io
Penyingkiran pakaian AI

Video Face Swap
Tukar muka dalam mana-mana video dengan mudah menggunakan alat tukar muka AI percuma kami!

Artikel Panas

Alat panas

Notepad++7.3.1
Editor kod yang mudah digunakan dan percuma

SublimeText3 versi Cina
Versi Cina, sangat mudah digunakan

Hantar Studio 13.0.1
Persekitaran pembangunan bersepadu PHP yang berkuasa

Dreamweaver CS6
Alat pembangunan web visual

SublimeText3 versi Mac
Perisian penyuntingan kod peringkat Tuhan (SublimeText3)

Untuk mengendalikan transaksi JDBC dengan betul, anda mesti terlebih dahulu mematikan mod komit automatik, kemudian melakukan pelbagai operasi, dan akhirnya melakukan atau mengembalikan semula hasilnya; 1. Panggil Conn.SetAutOcommit (palsu) untuk memulakan transaksi; 2. Melaksanakan pelbagai operasi SQL, seperti memasukkan dan mengemaskini; 3. Panggil Conn.Commit () jika semua operasi berjaya, dan hubungi conn.rollback () jika pengecualian berlaku untuk memastikan konsistensi data; Pada masa yang sama, cuba-dengan-sumber harus digunakan untuk menguruskan sumber, mengendalikan pengecualian dengan betul dan menutup sambungan untuk mengelakkan kebocoran sambungan; Di samping itu, adalah disyorkan untuk menggunakan kolam sambungan dan menetapkan mata simpan untuk mencapai rollback separa, dan menyimpan urus niaga sesingkat mungkin untuk meningkatkan prestasi.

Gunakan kelas dalam pakej Java.Time untuk menggantikan kelas lama dan kelas kalendar; 2. Dapatkan tarikh dan masa semasa melalui LocalDate, LocalDateTime dan Tempatan Tempatan; 3. Buat tarikh dan masa tertentu menggunakan kaedah (); 4. Gunakan kaedah tambah/tolak untuk meningkatkan dan mengurangkan masa; 5. Gunakan zoneddatetime dan zonid untuk memproses zon waktu; 6. Format dan parse date string melalui DateTimeFormatter; 7. Gunakan segera untuk bersesuaian dengan jenis tarikh lama apabila perlu; pemprosesan tarikh di java moden harus memberi keutamaan untuk menggunakan java.timeapi, yang memberikan jelas, tidak berubah dan linear

Pra-formancetartuptimemoryusage, quarkusandmicronautleadduetocompile-timeprocessingandgraalvsupport, withquarkusoftenperforminglightbetterine serverless scenarios.tyvelopecosyste,

NetworkPortsandFireWallSworkTogethertoenableCommunicationWileensuringsecurity.1.networkportsarevirtualendpointsNumbered0-655 35, Withwell-KnownportsLike80 (http), 443 (https), 22 (ssh), dan25 (smtp) identitispecificservices.2.portsoperateovertcp (boleh dipercayai, c

Koleksi Sampah Java (GC) adalah mekanisme yang secara automatik menguruskan ingatan, yang mengurangkan risiko kebocoran ingatan dengan menuntut semula objek yang tidak dapat dicapai. 1.GC menghakimi kebolehcapaian objek dari objek akar (seperti pembolehubah stack, benang aktif, medan statik, dan lain -lain), dan objek yang tidak dapat dicapai ditandakan sebagai sampah. 2. Berdasarkan algoritma penandaan tanda, tandakan semua objek yang dapat dicapai dan objek yang tidak ditandai. 3. Mengamalkan strategi pengumpulan generasi: Generasi Baru (Eden, S0, S1) sering melaksanakan MinorGC; Orang tua melakukan kurang tetapi mengambil masa lebih lama untuk melakukan MajorGC; Metaspace Stores Metadata kelas. 4. JVM menyediakan pelbagai peranti GC: SerialGC sesuai untuk aplikasi kecil; ParallelGC meningkatkan throughput; CMS mengurangkan

Memilih jenis htmlinput yang betul dapat meningkatkan ketepatan data, meningkatkan pengalaman pengguna, dan meningkatkan kebolehgunaan. 1. Pilih jenis input yang sepadan mengikut jenis data, seperti teks, e -mel, tel, nombor dan tarikh, yang secara automatik boleh menyemak dan menyesuaikan diri dengan papan kekunci; 2. Gunakan HTML5 untuk menambah jenis baru seperti URL, Warna, Julat dan Carian, yang dapat memberikan kaedah interaksi yang lebih intuitif; 3. Gunakan pemegang tempat dan sifat -sifat yang diperlukan untuk meningkatkan kecekapan dan ketepatan pengisian bentuk, tetapi harus diperhatikan bahawa pemegang tempat tidak dapat menggantikan label.

GradleisthebetterChoiceFormostNewProjectSduetoitSsuperiorflexibility, Prestasi, danModernToolingSupport.1.Gradle'sGroovy/KOT lindslismoreconciseandexpressivethanmaven'sverbosexml.2.GradleOutPerformsMaveninBuildSpeedWithIncrementalcompilation, BuildCac

Defer digunakan untuk melaksanakan operasi tertentu sebelum fungsi pulangan, seperti sumber pembersihan; Parameter dinilai dengan serta-merta apabila menangguhkan, dan fungsi-fungsi dilaksanakan mengikut urutan terakhir (LIFO); 1. Pelbagai penahanan dilaksanakan dalam urutan terbalik pengisytiharan; 2. Biasanya digunakan untuk pembersihan yang selamat seperti penutupan fail; 3. Nilai pulangan yang dinamakan boleh diubah suai; 4. Ia akan dilaksanakan walaupun panik berlaku, sesuai untuk pemulihan; 5. Elakkan penyalahgunaan menangguhkan gelung untuk mengelakkan kebocoran sumber; Penggunaan yang betul boleh meningkatkan keselamatan kod dan kebolehbacaan.
