一篇文章帶你瞭解Java基礎-抽象
Java基礎知識(抽象)
抽象
抽象是從眾多的事物中抽取出共同的、本質性的特征,而舍棄其非本質的特征的過程。具體地說,抽象就是人們在實踐的基礎上,對於豐富的感性材料通過去粗取精、去偽存真、由此及彼、由表及裡的加工制作,形成概念、判斷、推理等思維形式,以反映事物的本質和規律的方法。
抽象定義
在繼承過程中,我們知道父類的方法可以子類進行重寫,而每個子類各自的實現都不盡相同。就好比動物都有吃的方法行為吧,而每個動物的子類對於吃的東西都可能不是相同滴,可是這導致瞭什麼呢?
我們定義父類的方法主體是不是就沒有任何意義瞭,因為在子類調用方法過程中,是調用瞭自己重寫的方法,而不是父類的方法。
也就是說,父類聲明瞭方法,子類去各自實現該方法即可。代表著父類可以不知道具體實現是什麼,但是清楚的有什麼方法是需要的。所以方法父類完全隻需要提供一個沒有方法體的方法簽名即可,具體實現交給子類自己去實現。
而我們對於這種沒有方法體的方法稱為抽象方法。在Java語法規定,包含抽象方法的類就是抽象類。
- 抽象方法 : 沒有方法體的方法。
- 抽象類:包含抽象方法的類。
定義抽象的關鍵字:abstract
,接下來看看如何使用吧!
abstract的使用
abstract是抽象的意思,用於修飾方法方法和類,修飾的方法是抽象方法,修飾的類是抽象類。
抽象方法:
使用abstract 關鍵字修飾方法,該方法就成瞭抽象方法,抽象方法隻包含一個方法名,而沒有方法體。
定義格式:
權限修飾符 abstract 返回值類型 方法名 (參數列表);
代碼如下:
public abstract void eat();
抽象類:
如果一個類包含抽象方法,那麼該類必須是抽象類。
註意:抽象類不一定有抽象方法,但是有抽象方法的類必須定義成抽象類。
定義格式:
abstract class 類名字 { }
代碼如下:
public abstract class Animal { public abstract void eat(); }
定義抽象類
我們將之前的動物類改造成抽象類,然後吃的方法也改造成抽象方法。
註意:一旦定義為抽象類後,子類繼承父類時,是必須重寫裡面的抽象方法。
定義抽象父類:
package com.na.pojo; /** * 先定義一個抽象父類 --> 動物類 * 動物都有一個吃的抽象方法 */ public abstract class Animal { // 定義為抽象方法後,無需去做方法實體的實現! public abstract void eat(); }
定義子類:
貓咪:
package com.na.pojo; /** * 定義貓類繼承抽象動物類, * 隨之重寫裡面的吃行為,因為貓也有吃的行為,但是貓喜歡吃罐頭 */ public class Cat extends Animal{ // 抽象類的方法必須重寫,不然編譯會不通過。 public void eat() { System.out.println("小喵咪都喜歡吃魚罐頭!"); } /** * 增加一哥貓咪特有的玩球方法() */ public void playBall() { System.out.println("小喵咪都喜歡小球!"); } }
小狗:
package com.na.pojo; /** * 定義狗類繼承抽象動物類, * 隨之重寫裡面的吃行為,因為狗也有吃的行為,但是狗喜歡啃骨頭 */ public class Dog extends Animal{ // 抽象類的方法必須重寫,不然編譯會不通過。 public void eat() { System.out.println("小狗狗都愛啃骨頭!"); } public void walk() { System.out.println("小狗在被我溜著!"); } }
定義測試類:
package com.na; import com.na.pojo.Animal; import com.na.pojo.Cat; import com.na.pojo.Dog; public class Demo { public static void main(String[] args) { // 創建抽象類,抽象類不能創建對象 // Animal animal = new Animal(); // animal.eat(); // 創建小貓咪 Cat cat = new Cat(); cat.eat(); cat.playBall(); Dog dog = new Dog(); dog.eat(); dog.walk(); } }
得到結果:
小喵咪都喜歡吃魚罐頭!
小喵咪都喜歡小球!
小狗狗都愛啃骨頭!
小狗在被我溜著!
類的大致結構:
註意:假設抽象類可以創建對象,但是呢,裡面的抽象方法是沒有方法體給我們去實現,從而程序也是無法執行,所以不讓我們創建對象。
抽象類的一些註意點
對於抽象類的使用,以下為抽象類的使用上要註意的細節:
1.抽象類不能創建對象,如果創建,編譯無法通過而報錯。隻能創建其非抽象子類的對象。
假設創建瞭抽象類的對象,調用抽象的方法,而抽象方法沒有具體的方法體,沒有意義。
2.抽象類中,可以有構造器,是供子類創建對象時,初始化父類成員使用的。
子類的構造方法中,有默認的super(),需要訪問父類構造方法。
package com.na.pojo; /** * 先定義一個抽象父類 --> 動物類 * 動物都有一個吃的抽象方法 */ public abstract class Animal { private String name; private int age; // 可以有構造器 public Animal(){ } // 甚至可以有參構造器 public Animal(String name, int age){ this.name = name; this.age = age; } // 定義為抽象方法後,無需去做方法實體的實現! public abstract void eat(); }
3.抽象類中,不一定包含抽象方法,但是有抽象方法的類必定是抽象類。
未包含抽象方法的抽象類,目的就是不想讓調用者創建該類對象,通常用於某些特殊的類結構設計。
4.抽象類的子類,必須重寫抽象父類中所有的抽象方法,否則子類也必須定義成抽象類,編譯無法通過而報錯。
如果子類不重寫所有抽象方法,則類中可能會包含抽象方法。那麼在創建對象後,調用抽象的方法,沒有意義。
5.抽象類存在的意義是為瞭被子類繼承,抽象類體現的是模板思想。
抽象類中已經實現的是模板中確定的成員,抽象類不確定如何實現的定義成抽象方法,交給具體的子類去實現。
總結
相信各位看官都對Java基礎中的抽象的知識和使用有瞭一定瞭解,等待下一次更多Java基礎的學習吧!
本篇文章就到這裡瞭,希望能給你帶來幫助,也希望您能夠多多關註WalkonNet的更多內容!