1. 程式人生 > 其它 >詳解Java中的抽象類和抽象方法

詳解Java中的抽象類和抽象方法

引言

如上圖,二維圖形類有三個子類,分別是正方形類三角形類圓形類

我們都知道要求正方形的面積,直接使用面積公式邊長的平方即可,同理三角形的是底乘高除以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());
    }
}

注意事項

關於抽象類和抽象方法有如下注意事項:

  1. 抽象類不能建立物件
    抽象類的物件,呼叫該抽象物件抽象方法,但是抽象方法沒有具體實現,呼叫起來沒有任何意義;
  2. 抽象類中可以有構造方法,可供子類建立物件時,初始化父類成員使用
    子類的構造方法之中,是有預設的super()方法的,所以需要訪問父類的構造方法,那麼父類的構造方法需要存在;
  3. 抽象類中,並不一定要包含抽象方法,但是抽象方法所在的類必須時抽象類
    沒有包含抽象方法的抽象類,目的是不想讓呼叫者建立該物件,通常用於某些特殊的類結構設計;
  4. 抽象類的子類,必須重寫抽象父類的所有抽象方法,除非子類也是抽象類
    如果子類不重寫所有抽象方法,那麼子類中還包含抽象方法,還應該是抽象類。

原文連結:https://sjdwz.com/11168.html