Abstract class、method


1 建立抽象類別方法

什麼時候會使用到抽象類別和方法呢?當我們只希望這個類別先定義出他大概有哪些方法跟屬性,但是我們不會先將這些方法內容撰寫好,這時候我們就會使用抽象類別和方法。

舉日常生活中的例子來說,圓形、三角形和正方形都屬於形狀,然而形狀是什麼呢?這個概念很抽象,而且我們也無法實作形狀這個東西,因為你也不會在路上看到一個物品就說他是一個"形狀"吧。

但是確實圓形、三角形和正方形都屬於形狀,一個形狀一定有它的面積、周長、邊的個數,所以我們可以定義形狀這個抽象類別,他有抽象方法可以計算算面積和周長。

public abstract class Shape {
    private String name;
    public abstract doubleGetArea();
    public abstract doubleGetPerimeter();
}

基本上只要有一個抽象方法,那他就會被稱為是抽象類別,一定要標上abstract

一個含有抽象方法的類別稱為抽象類別

2 繼承抽象類別

圓形和正方形都屬於形狀,也都有各自不同的計算面積的方式。所以我們將圓形跟正方形類別建立好,讓他們都繼承自形狀,並且詳細定義好如何求面積跟周長。

於是圓形跟正方形這時候都是一個繼承了抽象類別的一般類別,他們完整了抽象function的內容,所以當然都可以產生出object。

public abstract class Shape {
    private String name;
    public abstract double GetArea();
    public abstract double GetPerimeter();
}

class Circle extends Shape{
    private final double pi=3.1415926;
    private double radius;
    Circle(double r){
        radius=r;
    }
    public double GetArea(){
        return radius*radius*pi;
    }
    public double GetPerimeter(){
        return radius*2*pi;
    }
}

class Square extends Shape{
    private double edge;
    Square(double e){
        edge=e;
    }
    public double GetArea(){
        return edge*edge;
    }
    public double GetPerimeter(){
        return edge*4;
    }
}

要記得在繼承抽象類別時,一個良好的習慣是將所有的抽象類別宣告式(如下)都直接複製下來,刪除abstract跟; ,才可以避免漏了一些抽象方法,當然如果你漏了,編譯器還是會很好心的提醒你。

public abstract double GetArea();
public abstract double GetPerimeter();

繼承抽象類別的子類別必須要實作此類別裡所有的抽象方法

下面使用這些類別產生物件,可以看到抽象類別並不能產生物件,而繼承自抽象類別的一般類別就可以

public class MainClass {
    public static void main(String[] args){

        //錯誤使用:抽象類別並不能產生出object
        //Shape myShape=new Shape();

        //正確使用:一般類別可以產生出object
        Circle myCircle=new Circle(1);
        Square mySquare=new Square(3);
        System.out.println("半徑=1的圓形面積="+myCircle.GetArea());
        System.out.println("邊長=3的正方形面積="+mySquare.GetArea());
    }
}
---------------------------------
半徑=1的圓形面積=3.1415926
邊長=3的正方形面積=9.0

屬於abstract的class你可以看到他的abstract方法都還沒有被定義完整,所以它理所當然地不能被new一個object實體

抽象類別不能使用new來產生一個object實體,他只能夠被繼承

results matching ""

    No results matching ""