當定義一個類時,除了聲明類的存取權限之外,有時還需要聲明類的繼承特性。即聲明一個類是否為抽象類別或是最終類,使用abstract修飾符聲明抽象類別,使用final修飾符聲明最終類。
1。抽象類別:
1〉聲明抽象類別與抽象方法:
eg. publicabstractclass PlaneGraphcs1
{
publicabstractdouble area(); //分號必不可少
}
抽象方法是只有方法聲明而沒有方法體的成員方法。抽象類別中可以不包含抽象方法,但是包含抽象方法的類必須聲明為抽象類別。構造方法,類成員方法不能被聲明為抽象方法。
2〉抽象類別不能被執行個體化。
抽象類別不能被執行個體化,即使抽象類別中沒有包含抽象類別方法,也不能建立抽象類別的執行個體。下列語句產生語法錯誤:
PlaneGraphics1 g1 =new PlaneGraphics1(); //語法錯誤,抽象類別不能執行個體化
3〉抽象類別與抽象方法的作用:
抽象類別用於描述抽象的概念,抽象方法用於聲明方法的參數和傳回值,抽象方法的具體實現由抽象子類完成。子類必須覆蓋父類的抽象方法。
抽象類別聲明的抽象方法約定了多個子類共用的方法聲明,每個子類可以根據自身的實際情況,給出抽象方法具體的實現。顯然不同的子類可以有不同的方法實現。因此,一個抽象方法在多個子類中表現出多態性。抽象類別提供了方法聲明與方法實現分離的機制。使得多個不同的子類能夠表現出共同的行為能力。
4〉抽象方法必須被子類覆蓋:
由於抽象方法在抽象類別中沒有具體的方法實現,所以抽象方法必須被子類覆蓋。反之,如果一個子類不能覆蓋父類的抽象方法,則該類自己也必須聲明為抽象類別。
5〉抽象方法的必要性:
如果一個方法需要被子類覆蓋,則必須聲明為抽象方法。 例如PlaneGraphics1類也可以聲明area()方法不是抽象方法。則PlaneGraphics1類也不必聲明為抽象類別。聲明如下:
public class PlaneGraphics1 //平面圖形類,非抽象類別
{
public double area() / /非抽象方法,必須有方法體
{
return 0;
}
}
eg .
/*
* 本例示範抽象類別與抽象方法的作用。聲明抽象類別PlaneGraphics1及兩個子類,子類分別覆蓋area()抽象方法,
* 實現不同圖形的面積計算。
*/
public abstract class PlaneGraphics1 { //平面圖形類,抽象類別
private String shape; //形狀
public PlaneGraphics1(String shape)
{
this.shape=shape;
}
public PlaneGraphics1()
{
this("未知");
}
public abstract double area(); //計算面積,抽象方法,分號";"必不可少
public void print() //顯示面積,非抽象方法
{
System.out.println(this.shape+"面積為 "+this.area());
}
}
//===========================================================================
//設計長方形類Rectangle1,繼承平面圖形類
public class Rectangle1 extends PlaneGraphics1{
protected double length; //長度
protected double width; //寬度
public Rectangle1(double length,double width) //構造方法
{
super("長方形");
this.length=length;
this.width=width;
}
public Rectangle1(double width) // 正方形是長方形的特例
{
super("正方形");
this.length=width;
this.width=width;
}
public Rectangle1()
{
this(0,0);
}
public double area() //計算長方形面積,實現父類的抽象方法
{
return this.width*this.length;
}
}
//======================================================================
public class Elipse1 extends PlaneGraphics1 { //橢圓類
protected double radius_a; //a軸半徑
protected double radius_b; //b軸半徑
public Elipse1(double radius_a,double radius_b) //構造方法
{
super("橢圓");
this.radius_a=radius_a;
this.radius_b=radius_b;
}
public Elipse1(double radius_a) //圓是橢圓的特例
{
super("圓");
this.radius_a=radius_a;
this.radius_b=radius_a;
}
public Elipse1()
{
this(0,0);
}
public double area() //計算橢圓的面積,實現父類的抽象方法
{
return Math.PI*this.radius_a*this.radius_b;
}
}
//=========================================================================
class PlaneGraphics1_ex {
/**
* 使用平面圖形類及子類
*/
public static void main(String[] args) {
PlaneGraphics1 g1=new Rectangle1(10,20); //獲得子類長方形執行個體
g1.print(); //print()不時運行時多態性,其中調用的area()表現運行時多態性
g1=new Rectangle1(10); //正方形
g1.print();
g1=new Elipse1(10,20); //橢圓
g1.print();
g1=new Elipse1(10); //圓
g1.print();
}
}
運行結果如下:
長方形面積為 200.0
正方形面積為 100.0
橢圓面積為 628.3185307179587
圓面積為 314.1592653589793
2.最終類:
1〉聲明最終類:
使用關鍵字fianl聲明的類稱為最終類,最終類不能被繼承,即不能聲明最終類的子類。 public final class Math extends Object //數學類,最終類
如果不希望一個類被繼承,則聲明該類為最終類。
抽象類別不能被聲明為最終類。
2〉聲明最終方法:
使用final聲明成員方法稱為最終方法,最終方法不能被子類覆蓋。
public class Circle1 extends Graphics1
{
public final double area() //最終方法,不能被子類覆蓋
{
return Math.PI*this.radius*this.radius;
}
}
最終類可以不包含最終方法,非最終類可以包含最終方法。