2022-08-07 Java抽象類與接口

1. 定義抽象類與抽象方法

抽象類相較普通類需要用到abstract關(guān)鍵字來定義,在其內(nèi)部可定義抽象方法,同樣采用abstract關(guān)鍵字,但是沒有抽象變量。
抽象方法只定義了方法名,不給出具體的方法實現(xiàn),即沒有后面花括號的內(nèi)容。定義抽象方法只需要在普通方法前面加上abstract關(guān)鍵字,并將后邊花括號及里面內(nèi)容(方法體)刪掉,最后在后邊加上分號即可:

//定義一個抽象test方法
abstract void test();

抽象類的類成員種類相較普通類多了抽象方法,且由于抽象類里面的抽象方法沒有方法體,故其構(gòu)造器無法創(chuàng)建抽象類的實例,主要用于被子類所調(diào)用。以下代碼創(chuàng)建了一個Shape抽象類,其具有calPerimeter()與type()兩個抽象方法。

/**
 * @author Liu XueZheng
 * @version 1.0
 * 這是一個抽象類
 */
public abstract class Shape {
    static{
        System.out.println("執(zhí)行Shape的初始化塊");
    }
    //定義一個成員變量
    private String color;
    //定義其setter方法
    public void setColor(String color){
        this.color = color;
    }
    //定義其getter方法
    public String getColor(){
        return color;
    }
    //定義一個計算周長的抽象方法
    public abstract double calPerimeter();
    //定義一個返回形狀類型的抽象方法
    public abstract String type();
    //定義構(gòu)造器
    public Shape(){
    }
    //重載構(gòu)造器
    public Shape(String color){
        System.out.println("執(zhí)行Shape的構(gòu)造器");
        this.color = color;
    }
  }
}

2. 抽象類的作用

抽象類實際上實現(xiàn)了模板模式的設(shè)計模式,即將抽象類作為多個子類的模板,子類對其抽象方法進行實現(xiàn),雖然具體方法可能不同,但都保留了父類的行為模式。例如下面兩個子類Triangle和Circle,都繼承自Shape類,對其兩個抽象方法進行了實現(xiàn):

/**
 * @author Liu XueZheng
 * @version 1.0
 * 這是一個三角形類,繼承自Shape抽象類
 */
public class Triangle extends Shape{
    //定義邊長變量a,b,c
    private double a;
    private double b;
    private double c;
    //定義構(gòu)造器對邊長和color進行初始化
    public Triangle(String color, double a, double b, double c){
        //繼承父類的有參構(gòu)造器
        super(color);
        this.setSides(a,b,c);
    }
    public void setSides(double a, double b, double c){
        //判斷三角形三邊是否滿足基本要求
        if((a+b)>c && (a+c)>b && (b+c)>a){
            this.a = a;
            this.b = b;
            this.c = c;
        }
        else{
            System.out.println("三角形兩邊之和必須大于第三邊");
            return;
        }
    }
    //重寫返回計算周長的方法
    public double calPerimeter(){
        return (a+b+c);
    }
    //重寫返回類型的方法
    public String type(){
        return "三角形";
    }
    public static void main(String[] args){
        //創(chuàng)建Triangle實例
        Shape t = new Triangle("red", 1.0, 1.0, 1.5);
        System.out.println("t的周長是:" + t.calPerimeter());
        System.out.println("t的形狀是:" + t.type());
    }
}
/**
 * @author Liu XueZheng
 * @version 1.0
 */
public class Circle extends Shape{
    //定義半徑成員變量
    private double radius;
    //定義其setter方法
    public void setRadius(double radius){
        this.radius = radius;
    }
    //定義其getter方法
    public double getRadius(){
        return this.radius;
    }
    //實現(xiàn)父類的calPerimeter方法
    public double calPerimeter(){
        return this.radius * 2 * Math.PI;
    }
    //重寫構(gòu)造器
    public Circle(double radius, String color){
        super(color);
        this.radius = radius;
    }
    //實現(xiàn)父類的type方法
    public String type(){
        return "圓形";
    }
    public static void main(String[] args){
        //定義Circle實例
        Shape c = new Circle(2.0, "green");
        c.type();
        System.out.println("c的周長是:" + c.calPerimeter());
    }
}

運行效果如下:

執(zhí)行Shape的初始化塊
執(zhí)行Shape的構(gòu)造器
t的周長是:3.5
t的形狀是:三角形
執(zhí)行Shape的初始化塊
執(zhí)行Shape的構(gòu)造器
c的形狀是:圓形
c的周長是:12.566370614359172

3. 接口

接口可以理解為一種更為“抽象”的抽象類。下次再更。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容