- Java面向對象軟件開發
- 姚駿屏 汪衛星主編
- 1151字
- 2018-12-29 19:04:19
3.1.1 抽象類
如果一個類中沒有包含足夠的信息來描繪一個具體的對象,這樣的類就是抽象類,既然沒有足夠的信息描述一個具體的對象,因此這是一種不能實例化的類。抽象類往往用來描述我們在對具體問題進行分析、設計中得出的抽象概念。比如,如果進行一個圖形編輯軟件的開發,在進行具體問題分析時,存在著圓、三角形這樣一些具體概念,它們是不同的,但是它們又都屬于“形狀”這樣一個概念,即分類的標準就是具有形狀,但形狀是一個非常抽象概念,它并不能生成特定的對象,這個“形狀類”就是一個抽象類。那么在Java語言中如何定義一個抽象類呢?
在Java語言中,用abstract關鍵字來修飾一個類時,這個類就是抽象類。一個抽象類只規定了其子類具有某種功能,并不規定子類中該功能是如何實現的,該功能的具體行為由子類負責實現。抽象類的抽象性是靠其中存在的抽象方法來體現的。當用abstract關鍵字來修飾一個方法時,該方法就是抽象方法。一個抽象方法只是聲明一個方法,沒有方法體(沒有方法的具體實現),抽象方法的聲明以分號結束。
定義一個抽象類的格式如下:
abstract class AbstractClassName{ … }
例如:
public abstract class Shape{ public abstract double area();//抽象方法 public abstract double volume();//抽象方法 }
上面的代碼完成了對Shape抽象類的定義,可見定義抽象類和普通類差別不大,只是必須用abstract來修飾類名。它可以擁有一個或多個抽象方法,也可以沒有定義抽象方法,但只要類中有一個方法被聲明為抽象方法,則該類必須為抽象類。
當一個類被定義成abstract類時,表示一個抽象的概念,它不能用new關鍵字實例化對象,例如,上面定義的Shape類就是一個抽象類,只有被繼承并在子類中重寫其抽象方法,它才有意義。除抽象方法外,抽象類可以擁有和普通類一樣的類成員。
特別提示:
不能用abstract修飾類的構造方法、靜態方法和私有(private)方法。
【例3-1】 定義一個代表形狀的抽象類,并派生出圓柱體類和長方體類,計算底面半徑為“2”,高為“3”的圓柱體體積和長、寬、高分別為“3”,“2”,“4”的長方體體積。
//定義一個形狀抽象類 abstract class Shape{ double radius,length,width,height; abstract double vol(); //求體積的抽象方法 Shape(double r,double h){ //對半徑和高進行初始化的構造方法 radius = r; height = h; } Shape(double l,double w,double h){ //對長寬高進行初始化的構造方法 length = l; width = w; height = h; } } /** * 圓柱體類 */ class Circle extends Shape{ Circle(double r,double h){ super(r,h); } double vol(){ //重寫父類抽象方法 return (3.1416*radius*radius*height); } } /** * 長方體類 */ class Rectangle extends Shape{ Rectangle(double l,double w,double h){ super(l,w,h); } double vol(){ //重寫父類抽象方法 return (length*width*height); } } /** * 體類 */ public class AbstractClassDemo{ public static void main(String[] args) { Circle c = new Circle(2,3); Rectangle r = new Rectangle(3,2,4); System.out.println("圓柱體體積 ="+c.vol()); System.out.println("長方體體積 ="+r.vol()); } }
程序的運行結果如下:
圓柱體體積=37.6992 長方體體積=24.0
在【例3-1】中,定義了一個Shape抽象類,通過對各種具體的形狀(如長方體和圓柱體等)分析,發現它們都可以求體積,而它們都是形狀中的一種,從而將求體積的方法定義在形狀類中,而不具體實現它。該抽象類實際上提供了一個規范,每一個繼承它的子類都必須要遵守這個規范,而如何去完成這個規范是子類自己的事情。
【思考】abstract修飾的類一定有abstract修飾的方法嗎?
- JMeter 性能測試實戰(第2版)
- Full-Stack React Projects
- 區塊鏈技術與應用
- Microsoft 365 Certified Fundamentals MS-900 Exam Guide
- 持續集成與持續交付實戰:用Jenkins、Travis CI和CircleCI構建和發布大規模高質量軟件
- 小程序從0到1:微信全棧工程師一本通
- Unity 2017 Game AI Programming(Third Edition)
- Yii2 By Example
- Manage Your SAP Projects with SAP Activate
- Docker on Windows
- C語言從入門到精通(微視頻精編版)
- Opa Application Development
- 網頁設計理論與實踐
- Swift 5從零到精通iOS開發訓練營
- 換個姿勢學C語言