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. 接口
接口可以理解為一種更為“抽象”的抽象類。下次再更。