標籤:rri int abs blog 規則 native main get nbsp
抽象方法和抽象類別必須使用 abstract 修飾符來定義,有抽象方法的類只能被定義成抽象類別,抽象類別可以沒有抽象方法。
》抽象方法和抽象類別的規則如下:
》抽象類別必須使用 abstract 修飾符來定義,抽象方法也必須使用 abstract 修飾符來修飾,抽象方法不能有方法體。
》抽象方法不能被執行個體化,執行個體化的工作應該交由它的子類來完成,它只需要一個引用即可。
》抽象類別可以包含成員變數、方法(普通方法和抽象方法都可以)、構造器、初識化塊、內部類(介面、枚舉)5種成分。抽象類別的構造器不能用於建立執行個體,主要是用於被其子類調用。
》含有抽象方法的類(包含直接定義了一個抽象方法;或繼承了一個抽象父類,但沒有完全實現父類包含的抽象方法;或實現了一個介面,但沒有完全實現介面包含的抽象方法三種情況)只能被定義成抽象類別。
》abstract 不能與 private、static 、 final 或 native 並列修飾同一個方法
》abstract 不能與 final 並列修飾一個類
》子類中的抽象方法不能與父類的抽象方法同名。
》抽象方法必須由子類來進行重寫,否則沒有存在的意義。
》父類
public abstract class Shape { private String color; //定義一個計算周長的抽象方法 public abstract double calPerimeter(); //抽象方法,不能有方法體 //定義一個返回形狀的抽象方法 public abstract String getType(); //定一個Shape 的構造器,該構造武器並不是用於建立Shape 對象 //而是用於被子類調用 public Shape() { } public Shape(String color) { System.out.println("執行 Shape 的構造器"); this.color=color; } public String getColor() { return color; } public void setColor(String color) { this.color = color; } }
》子類
public class Triangle extends Shape { private double a; private double b; private double c; public Triangle(String color, double a, double b, double c) { super(color); this.setSides(a, b, c); } public void setSides(double a,double b,double c){ if(a>=b+c || b>=a+c || c>= a+b){ System.out.println("三角形兩邊之和必須大於第三邊"); return; } this.a=a; this.b=b; this.c=c; } //重寫父類方法 @Override public double calPerimeter() { return a+b+c; } @Override public String getType() { return "三角形"; }}
public class Circle extends Shape { private double radius; public Circle(String color, double radius) { super(color); this.radius = radius; } public void setRadius(double radius){ this.radius=radius; } //重寫父類的計算周長方法 @Override public double calPerimeter() { return 2* Math.PI * radius; } @Override public String getType() { return getColor() +"圓形"; } public double getRadius() { return radius; }}
》測試類別
public static void main(String[] args) { Shape s1= new Triangle("黑色",3,4,5); Shape s2=new Circle("黃色",3); System.out.println(s1.getType()); System.out.println(s1.calPerimeter()); System.out.println(s2.getType()); System.out.println(s2.calPerimeter()); }
注意:abstract 不能用於修飾成員變數,不能用於修飾局部變數,即沒有抽象變數、沒有抽象成員變數等說法;abstract 也不能用於修飾構造器,沒有抽象構造器,抽象類別裡面定義的構造器只能是普通構造器。
Java——抽象類別和抽象方法