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實體,他只能夠被繼承