在 Java 中抽象類的語法格式如下:
<abstract>class<class_name> {
<abstract><type><method_name>(parameter-iist);
}
其中,abstract 表示該類或該方法是抽象的;class_name 表示抽象類的名稱;method_name 表示抽象方法名稱,parameter-list 表示方法參數列表。
抽象方法沒有方法體
抽象方法必須存在於抽象類中
子類重寫父類時,必須重寫父類所有的抽象方法。
抽象類和抽象方法都要使用 abstract 關鍵字聲明。
抽象類不能實例化,也就是不能使用 new 關鍵字創建對象。(其實是可以的,只不過沒意義,例子裏就是這樣寫的)
例子:使用長方形類繼承了形狀類,又用菱形繼承了長方形類,尋思寫複雜點,多練幾遍
package test;
public class Abstract {
//定義形狀抽象類
public abstract class Shape {
public int width; // 長度
public int height; // 高度,不是寬度。
public Shape(int width, int height) {
this.width = width;
this.height = height;
}
// 定義抽象方法,計算面積area,定義抽象類周長length
public abstract double area();
}
//又定義抽象長方形類,繼承形狀類
public abstract class Square extends Shape{
public Square (int width,int height){
super(width, height );
}
@Override
public double area() { //重寫父類抽象方法
return width*height;
}
public abstract double length();
}
//定義菱形類,繼承長方形類
public class Diamond extends Square{
public Diamond(int width,int height){
super(width, height );
}
@Override
public double area() {
return width*height*0.5;
}
@Override
public double length() {
return width*2+height*2; //公式貌似不對,但不要在意這些細節哈哈
}
}
public static void main(String args[]){
Abstract.Diamond d =new Abstract ().new Diamond (1,3);//長方形的
System.out.println ( d.area () );
System.out.println ( d.length () );
Abstract.Square s =new Abstract ().new Square (2,4) { //菱形的
@Override
public double length() {
return width*2+height*2;
}
};
System.out.println ( s.area() );
System.out.println ( s.length () );
}
}
輸出如下:
1.5
8.0
12.0
之前main方法我是這麼寫的:
public static void main(String args[]){
Diamond d =new Diamond (1,3);//長方形的
System.out.println ( d.area () );
System.out.println ( d.length () );
}
然後報錯:
Error:(49, 20) java: /D:/Abstract.java:49: 無法從靜態上下文中引用非靜態變量 this
問題在於我把 class Diamond 放到了 public class Abstract 內部,導致Diamond 成了Abstract 的非靜態內部類,屬於Abstract 的一個成員,在靜態方法main中不能訪問非靜態的成員,也就不能直接new Diamond(),只能通過外部類的對象訪問,like this:
Abstract.Diamond d =new Abstract ().new Diamond (1,3);
注意:在使用 abstract 關鍵字修飾抽象方法時不能使用 private 修飾,因爲抽象方法必須被子類重寫,而如果使用了 private 聲明,則子類是無法重寫的。