詳解Java中的抽象類和抽象方法
阿新 • • 發佈:2022-03-15
引言
如上圖,二維圖形類有三個子類,分別是正方形類,三角形類,圓形類;
我們都知道要求正方形的面積,直接使用面積公式邊長的平方即可,同理三角形的是底乘高除以2,圓的面積是$\pi$乘以半徑的平方。那麼二維圖形的面積該怎麼算呢?我們無法給出一個通用的方式。那麼二維圖形就不能計算面積了嗎?不是的。只要是二維平面的圖形,就可以計算面積,只是沒有一個通用的公式而已。由此可見正方形,三角形,圓形的面積可以很具體的給出,但是二維圖形不能,因為它很抽象。
由此可得二維圖形類的面積計算應該是抽象的,是抽象方法。
如果類中的某個方法,無法具體的給出,它就該是個抽象方法。
抽象方法的定義
Java中普通方法的定義方式是
訪問許可權 返回型別 方法名(有引數填寫引數,沒引數為空){
方法內部程式碼;
}
因為抽象方法我們無法給出具體的實現,所以抽象方法的定義與普通方法有所不同。定義方式如下:
訪問許可權 abstract 返回型別 方法名(有引數填寫引數,沒引數為空);
注意:因為不知如何實現,所以沒有大括號了。
抽象方法的使用
抽象方法必須宣告在抽象類中。
抽象類的定義方式如下:
訪問許可權 abstract class 類名{
}
子類在繼承抽象類時,必須覆蓋重寫全部的抽象方法。(也叫實現方法)
我們可以寫一下引言中的例子:
二維圖形類定義如下:
package com.sjdwz; /** * @Description 二維圖形類,抽象類,有計算面積的抽象方法 * @Date 2022/3/15 * @Created by 隨機的未知 sjdwz.com */ public abstract class Graphics2D { public abstract double getArea(); }
正方形類的定義如下:
package com.sjdwz;
/**
* @Description 正方形類
* @Date 2022/3/15
* @Created by 隨機的未知 sjdwz.com
*/
public class Square extends Graphics2D{
//邊長
private int length = 6;
//重寫父類計算面積的方法
@Override
public double getArea() {
return this.length * this.length;
}
}
圓形類的定義如下:
package com.sjdwz;
/**
* @Description 圓形類
* @Date 2022/3/15
* @Created by 隨機的未知 sjdwz.com
*/
public class Circle extends Graphics2D{
//半徑長
private int radius = 6;
//重寫父類計算面積的方法
@Override
public double getArea() {
return 3.14 * this.radius * this.radius;
}
}
測試類的定義如下:
package com.sjdwz;
/**
* @Description 測試類
* @Date 2022/3/15
* @Created by 隨機的未知 sjdwz.com
*/
public class Test {
public static void main(String[] args) {
Square square = new Square();
Triangle triangle = new Triangle();
Circle circle = new Circle();
System.out.println("正方形的面積時"+square.getArea());
System.out.println("三角形的面積時"+triangle.getArea());
System.out.println("圓形的面積時"+circle.getArea());
}
}
注意事項
關於抽象類和抽象方法有如下注意事項:
- 抽象類不能建立物件
抽象類的物件,呼叫該抽象物件抽象方法,但是抽象方法沒有具體實現,呼叫起來沒有任何意義; - 抽象類中可以有構造方法,可供子類建立物件時,初始化父類成員使用
子類的構造方法之中,是有預設的super()方法的,所以需要訪問父類的構造方法,那麼父類的構造方法需要存在; - 抽象類中,並不一定要包含抽象方法,但是抽象方法所在的類必須時抽象類
沒有包含抽象方法的抽象類,目的是不想讓呼叫者建立該物件,通常用於某些特殊的類結構設計; - 抽象類的子類,必須重寫抽象父類的所有抽象方法,除非子類也是抽象類
如果子類不重寫所有抽象方法,那麼子類中還包含抽象方法,還應該是抽象類。