1. 程式人生 > >廖雪峰Java2面向對象編程-4抽象類和接口-1抽象類

廖雪峰Java2面向對象編程-4抽象類和接口-1抽象類

無法執行 ava 否則 radi rri str rect new args

每個子類都可以覆寫父類的方法
如果父類的方法沒有實際意義,能否去掉方法的執行語句?子類會報編譯錯誤
如果去掉父類的方法,就失去了多態的特性
可以把父類的方法聲明為抽象方法。
如果一個class定義了方法,但沒有具體執行代碼,這個方法就是抽象方法:

  • 抽象方法用abstract修飾
  • 抽象方法沒有任何執行語句
  • 因為無法執行抽象方法,因此這個類也必須聲明為抽象類abstract class
  • 無法實例化一個抽象類。如果子類不是抽象類,依舊可以被實例化。

抽象類作用:

  • 抽象類用於被繼承
  • 抽象類可以強迫子類實現其定義的抽象方法,否則編譯錯誤
  • 抽象方法實際上相當於定義了規範。

面向抽象編程的本質:

  • 上層代碼只定義規範 abstract class Person
  • 不需要子類就可以實現業務邏輯(正常編譯)
  • 具體的業務邏輯由不同的子類實現,調用者並不關心
    Shape.java
public abstract class Shape {
    //抽象方法,用於計算面積
    public abstract double area();
}

Rect.java

public class Rect extends Shape{
    private final double width;
    private final double height;
    public Rect(double width, double height){
        this.height = height;
        this.width = width;
    }
    @Override
    public double area() {
        return width * height;
    }
}

Circle.java

public class Circle extends Shape{
    private double radius;
    public Circle(double radius){
        this.radius = radius;
    }
    @Override
    public double area() {
        return Math.PI * radius * radius;
    }
}

Hello.java

public class Hello {
    public static void main(String[] args){
        Shape s1 = new Rect(200,100);
        Shape s2 = new Circle(60);
        System.out.println(s1.area());
        System.out.println(s2.area());
    }
}

技術分享圖片

總結:

  • 抽象方法定義了子類必須實現的接口規範
  • 定義了抽象方法的類就是抽象類
  • 從抽象類繼承的子類必須實現抽象方法
  • 如果不實現抽象方法,該子類仍是一個抽象類

廖雪峰Java2面向對象編程-4抽象類和接口-1抽象類