[J2SE 基礎知識]2、抽象類和接口(上)

抽象類和接口

一、抽象類

在類層次結構中,類的位置越高,其定義的抽象程度也就越高。在定義類層次結構中的過程中,有一些類確定了子類的通用的行爲和屬性,而且這些類不能被實例化用限定符abstract來聲明。這些類稱爲抽象類。

l    抽象類可以包含常規類能夠包含的任何東西,包括構造方法,因爲子類可能需要繼承這種方法。

l    抽象類也可以包含抽象方法,也就是沒有實現的方法,而這些方法在子類中被實現。不能在非抽象類中聲明抽象方法。

l    如果一個抽象類中除了抽象方法外什麼都沒有,則最好使用接口。

 

二、接口

     與抽象類和抽象方法一樣,接口也是提供了其他類要實現的行爲模板。

 

使用和實現接口

l    要使用接口,可以在類定義中包含關鍵字implements

l    包含接口後,必須實現該接口中的所有方法,而不能有選擇地實現其中的某些。

l    類實現接口後,子類將繼承該接口中的所有方法,並可以覆蓋或重載它們。

l    若類繼承了一個實現了某一接口的超類,則不必在本類中又implements一次。

l    要在類中使用多個接口,只需要將它們的名稱用逗號分開。

使用多個接口時如果兩個接口定義了相同的方法,則應注意以下規則:

l    如果兩個方法的特徵標相同,可以在類中實現一個方法,其定義能夠滿足兩個接口。

l    如果方法的參數列表不同,則是一種簡單的方法重載:實現兩種方法特徵標,分別滿足兩個接口的需要。

l    如果方法的參數列表相同,但返回值不同,則無法創建一個能夠滿足兩個接口的方法。這時,編譯會出錯。

創建接口的規定:

l    創建接口要用interface,而不是class

l    如果接口前沒有限定符,則自動被轉換爲abstractpublic的,而且不能在接口內將方法聲明爲私有的或是保護的。

l    除了方法外,接口還可以包含變量,但它們必須是公有、靜態和final的(常量)。或者不使用限定符,這樣會自動聲明爲這些限定,而且變量須賦值。

l    如果聲明接口時沒有使用pulbic,則接口不會自動將方法轉換爲公有和抽象的,也不會將常量轉換爲公有的。而非公有接口的方法和常量也是非公有的,這些方法和常量只能被同一個包中的類和其他接口使用。

l    與類一樣,接口也可以屬於某個包。接口還可以導入其他包中的接口和類,就像類一樣。

l    接口可以繼承另一個接口,此時子接口將獲得超接口中聲明的所有方法定義和常量。這時要使用extends擴展。

l    另外,不同於類,接口可以多重繼承,新接口將包含其父接口中的方法和常量。(多繼承約束參見本話題之上的一個話題)

三、實例

創建一個網上商店,應用程序Storefront使用了包、訪問控制、接口和封裝。主要處理兩項任務:

l    根據庫存量計算每種商品的銷售價格;

l    按照銷售價格對商品排序;

Item

package com.prefect.ecommerce;
/**
* 本類實現了Comparable接口,這個接口使得對類的對象進行排序更容易。
* 這個接口只有一個方法compareTo(Object),返回一個整數,功能是比較
* 兩個對象:
*      若當前對象應排列在另一個之前,返回-1
*      若當前對象應排列在另一個之後,返回1
*      兩個對象相等,則返回0
* */

public class Item implements Comparable
{
        private String id;
        private String name;
        private double retail;
        private int quantity;
        private double price;
        
        Item(String id,String name,String retail,String quan)
        {
                this.id = id;
                this.name = name;
                this.retail = Double.parseDouble(retail);
                this.quantity = Integer.parseInt(quan);
                
                if(this.quantity > 400)
                {
                        this.price = this.retail * .5D;                        
                }
                else if(this.quantity > 200)
                {
                        this.price = this.retail * .6D;
                }
                else
                {
                        this.price = this.retail * .7D;
                }
                //對price四捨五入,Math.floor()表示將小數舍入爲與之最接近且不大於它的整數
                //並返回double
                price = Math.floor(price * 100 + .5)/100;
        }
        //compareTo()方法需要決定根據哪個實例變量來對對象進行排序,這裏根據price
        public int compareTo(Object o)
        {
                Item temp = (Item)o;
                if(this.price < temp.price)
                {
                        return 1;
                }
                else if(this.price > temp.price)
                {
                        return -1;
                }
                return 0;
        }
        public String getId()
        {
                return id;
        }
        public String getName()
        {
                return name;
        }
        public double getPrice()
        {
                return price;
        }
        public int getQuantity()
        {
                return quantity;
        }
        public double getRetail()
        {
                return retail;
        }

Storefont
/**
*用於管理商店中的商品,每一種商品都是一個Item對象,他們被存儲在鏈表中    
*/

package com.prefect.ecommerce;
import java.util.Collections;
import java.util.LinkedList;
public class Storefont
{
        //創建一個鏈表
        private LinkedList catalog = new LinkedList();
        //將item加入到鏈表中
        public void addItem(String id, String name, String price, String quant)
        {
                Item it = new Item(id, name, price, quant);
                //在鏈表中添加對象的方法
                catalog.add(it);
        }
        
        //返回當前的item,使用索引i來讀取他們
        public Item getItem(int i)
        {
                //讀取鏈表中的索引
                return (Item) catalog.get(i);
        }
        //返回鏈表中的對象數
        public int getSize()
        {
                //鏈表的大小
                return catalog.size();
        }
        public void sort()
        {
                //此方法對鏈表和其他數據結果中的對象進行排序,期間將調用對象的
                //comparaTo()方法來確定排序
                Collections.sort(catalog);
        }
}
GiftShop
package com.prefect.ecommerce;
public class GiftShop
{
        public static void main(String[] args)
        {
                Storefont store = new Storefont();
                //添加商品
                store.addItem("C01","MUG","9.99","150");
                store.addItem("C02","LG MUG","12.99","82");
                store.addItem("C03","MOUSEPAD","10.49","800");
                store.addItem("D01","T SHIRT","16.99","90");
                //進行排序
                store.sort();
                
                //輸出排序後的結果
                for(int i = 0 ; i < store.getSize() ; i++)
                {
                        Item show = (Item)store.getItem(i);
                        System.out.println("\nItem ID:" + show.getId()
                                        + "\nName:" + show.getName()
                                        + "\nRetail Price:$" + show.getRetail()
                                        + "\nPrice:$" + show.getPrice()
                                        + "\nQuantity:" + show.getQuantity());
                }
        }
}
運行結果

 

Item ID:D01
Name:T SHIRT
Retail Price:$16.99
Price:$11.89
Quantity:90

Item ID:C02
Name:LG MUG
Retail Price:$12.99
Price:$9.09
Quantity:82

Item ID:C01
Name:MUG
Retail Price:$9.99
Price:$6.99
Quantity:150

Item ID:C03
Name:MOUSEPAD
Retail Price:$10.49
Price:$5.25
Quantity:800

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章