業内經常說的一句話是不要重複造輪子,但是有時候,隻有自己造一個輪子了,才會深刻明白什麼樣的輪子适合山路,什麼樣的輪子适合平地! 我将會持續更新java基礎知識,歡迎關注。
往期章節: JAVA基礎第一章-初識java JAVA基礎第二章-java三大特性:封裝、繼承、多态
類與對象
什麼是類?
類是抽象的概念集合,表示的是一個共性的産物,類之中定義的是屬性和行為(方法)。
什麼是對象?
對象是一種個性的表示,表示一個獨立的個體,每個對象擁有自己獨立的屬性,依靠屬性來區分不同對象。
是以總結來說的話,類是對象的模闆,對象是類的執行個體。
舉個例子:
人類就是一個類(class),你,我,他就是每一個人類的執行個體。我們每一個個體的最基本的屬性有姓名、性别、體重、身高等。
具體的代碼表現如下:
從上面的代碼我們可以看到,在main函數中,我們通過 new 關鍵字建立了2個對象。一個是me,一個是he,我們都來自Human類,但是我們具有不同的屬性,我們除了性别相同,其他的屬性完全不同。
這裡特别再提到一點就是我們在 new 一個對象的時候後面的 Human() 函數,我們稱之為構造函數(方法)。
在建立一個對象的時候,至少要調用一個構造方法。構造方法的名稱必須與類同名,一個類可以有多個構造方法。
每個類都有構造函數。如果沒有顯式地為類定義構造方法,Java編譯器将會為該類提供一個預設構造方法。是以從上面代碼可以看到,我們并沒有指定構造函數,而是采用了預設的。
多個構造函數的寫法,代碼表現如下:
如果我們沒有聲明構造函數,那麼編譯器會為我們提供一個預設無參的構造函數;如果我們聲明了構造函數,不管幾個,那麼編譯器就不再為我們提供預設的構造函數。
抽象類
使用了關鍵詞 abstract 聲明的類叫作“抽象類”。如果一個類裡包含了一個或多個抽象方法,類就必須指定成abstract(抽象)。“抽象方法”,屬于一種不完整的方法,隻含有一個聲明,沒有方法主體。
具體代碼表現如下:
從上面的代碼中我們可以看到類名稱前面添加了abstract 關鍵字,抽象方法sayHello 前面也添加了關鍵字abstract, 同時這個方法不能寫方法體。
包含抽象方法的類稱為抽象類,但并不意味着抽象類中隻能有抽象方法,它和普通類一樣,同樣可以擁有成員變量和普通的成員方法。
抽象類和普通類的主要一些差別:
抽象方法權限必須為public或者protected,因為如果為private,則不能被子類繼承,子類便無法實作該方法,預設情況下預設為public。
抽象類不能建立對象,也就是不能通過new執行個體化;
如果一個類繼承于一個抽象類,則子類必須實作父類的抽象方法。
如果子類沒有實作父類的抽象方法,則必須将子類也定義為為abstract類。
在其他方面,抽象類和普通的類并沒有差別。
接口
說起接口,那麼很多時候我們就會和抽象類相比較,而且這個問題也是很多初級javaer,經常會被問到的面試問題。
接口(英文:Interface):在JAVA程式設計語言中是一個抽象類型,是抽象方法的集合,接口通常以 interface 來聲明。一個類通過繼承(實作)接口的方式,進而來繼承接口的抽象方法。
在上面我們已經制定了一個 Animals 接口,而人類作為進階動物,必然也是需要吃東西,下面我們就讓人類實作 Animals 接口,具體代碼如下:
看上面的代碼第39行~我們重新實作了接口中的 eatFood 方法,并且寫上了方法體。
另外在這裡要說明一下,在 Animals 接口中我們聲明了2個靜态的成員變量eyes和 leg,後者被 final 修飾,在上一章節中我們說過凡是被 final 修飾的一旦初始化,就不可以更改。
那麼 eyes 是不是就可以修改呢?

從上圖可以看出,答案是不行~即使你在聲明的時候沒有顯示的寫 final ,在接口中依然會把這個變量歸為常量,是以接口中的屬性必然是常量,隻能讀不能改,這樣才能為實作接口的對象提供一個統一的屬性。
抽象類與接口的差別:
接口是公開的,裡面不能有私有的方法或變量,是用于讓别人使用的,而抽象類是可以有私有方法或私有變量的,另外,實作接口的一定要實作接口裡定義的所有方法,而實作抽象類可以有選擇地重寫需要用到的方法;
一般的應用程式中,最頂級的是接口,然後是抽象類實作接口,最後才到具體類實作;
一個類隻能繼承一個父類,但可以通過繼承(實作)多個接口實作多重繼承,接口還有辨別(裡面沒有任何方法,如序列化 java.io.Serializable接口)和資料共享(裡面的變量全是常量)的作用;
抽象類和接口相同點:
都不能被執行個體化;
都可以定義靜态常量;
文中若有不正之處,歡迎批評指正!
give me the ball!