1、抽象類定義:在面向對象的概念中,所有的對象都是通過類來描繪的,但是反過來,並不是所有的類都是用來描繪對象的,如果一個類中沒有包含足夠的信息來描繪一個具體的對象,這樣的類就是抽象類。
定義真抽象,一遍愣是沒讀懂。。。
舉個例子:
有兩個人,一個是亞洲人,一個是非洲人,他們都有鼻子眼睛嘴,但是不僅僅只有鼻子眼睛嘴,這些共同的點就可以提取出來做一個抽象類,這個抽象類只描繪了鼻子眼睛嘴巴。
Java實例,把亞洲人和非洲人的共同點抽取出來,定義一個Person類:
public abstract class Person { private String eyes; private String mouth; private String nose; private void look(){ System.out.println(">>>abstract>>>>看世界"); } }
2、接口定義:在JAVA編程語言中是一個抽象類型,是抽象方法的集合,接口通常以interface來聲明。一個類通過繼承接口的方式,從而來繼承接口的抽象方法。
步驟1中用抽象類定義出兩種人的共同點,接下用兩個不同的接口定義不同的行為,例如亞洲人會跳遠,非洲人會搖滾。
public interface AsiaPersonActive { //亞洲人會跳遠 void jump(); }
public interface AfricPersonActive { //非洲人會搖滾。 void rock(); }
如果不使用抽象類,那么步驟1中look()方法就要在步驟2中兩個接口里分別定義,因為亞洲人和非洲人都有look()這個行為,這樣會導致代碼冗余。
ps:①一個類可以實現多個接口,普通類必須實現接口所有方法,但是只能單繼承。②抽象類和接口都不能實例化,抽象類中可以有普通方法和抽象方法,但是普通方法必須有方法體,抽象方法沒有方法體,子類繼承的時候要實現父類抽象方法,普通方法不用實現,直接調用。
3、創建子類,繼承抽象類,並實現對應的行為接口:
public class AsiaPerson extends Person implements AsiaPersonActive{ @Override public void jump() { //調用父類的方法 super.look(); System.out.println(">>>>>亞洲人會跳高>>>>"); } }
public class AfricPerson extends Person implements AfricPersonActive { @Override public void rock() { super.look(); System.out.println(">>>非洲人會搖滾>>>>"); } }
4、寫一個測試類:
public class Test { public static void main(String[] args) { AsiaPerson asiaPerson=new AsiaPerson(); asiaPerson.jump(); AfricPerson africPerson=new AfricPerson(); africPerson.rock(); } }
輸出結果:
>>>abstract>>>>看世界
>>>>>亞洲人會跳高>>>>
>>>abstract>>>>看世界
>>>非洲人會搖滾>>>>
結論:
抽象類的應用場景一般用於抽取不同事物的共有特性,然后可以用接口實現不同事物的不同行為。遇到需求,先分析不同的對象是否有共同點,比如門,都可以開和關,這個就可以抽取出來定義一個抽象類,而有的門有門鈴可以摁,有的門沒有,那就將有門鈴的對象實現摁門鈴這個動作的接口。