java深度历险记-第3话

摘:

使用顯式的方法來達成動態性,意味著我們要自己動手處理類別載入時的細
節部分。處理細節部分雖然需要撰寫一些額外的程式碼,但是可以讓程式變的更
具彈性,我們以上面這個 Office.java、Word.java、以及 Excel.java的例子來
說,這個程式雖然很有彈性(可以讓執行程式的人在執行時期決定要載入哪個類

別) ,但是,如果我們新增了Access.java和PowerPoint.java 這兩個新類別時,
Office.java 裡的主程式就必須增加兩個if … else 的迴圈。身為一個強調程式
維護性的工程師,接下來要問的一定是:「那麼,有沒有更好的方法,可以在不
修改主程式的情況下增加主程式的功能?」 有的,使用顯式的方法所達成的動態
性,可以增加程式的彈性,並達成我們不希望修改主程式的需求。程式碼如下所
示:

檔案:Assembly.java
public interface Assembly
{
public void start() ;
}

檔案:Office.java
public class Office
{
public static void main(String args[]) throws Exception
{
Class c = Class.forName(args[0]) ;
Object o = c.newInstance() ;
Assembly a = (Assembly) o ;
a.start() ;
}
}

檔案:Word.java
public class Word implements Assembly
{
public void start()
{
System.out.println("Word starts") ;
}
}

檔案:Excel.java
public class Excel implements Assembly
{
public void start()

{
System.out.println("Excel starts") ;
}
}

如此一來,我們的主程式 Office.java 只要編譯之後,往後只要叫用:
java Office Word或 java Office Excel
就可以動態載入我們需要的類別,如下圖所示:

[img]/upload/attachment/105947/66b30528-9b5b-3790-bf3f-d83dd7d8ade6.jpg[/img]


[img]/upload/attachment/105949/63e347b8-329a-3ee7-997e-7ab1a982fa7d.jpg[/img]


除此之外,輸入
java Office Access
的時候,雖然會出現錯誤訊息(因為我們還沒有完成Access.java),如下圖所示:


[img]/upload/attachment/105951/ea4cd305-5116-3058-beca-b715441e770e.jpg[/img]

但是,一旦往後我們完成了 Access(Access.java) 這個類別,或是
PowerPoint(PowerPoint.java),只要他們都實作了 Assembly這個介面,我們 12
就可以在不修改主程式(Office.java)的情況下,新增主程式的功能:

檔案:Access.java
public class Access implements Assembly
{
public void start()
{
System.out.println("Access starts") ;
}
}

檔案:PowerPoint.java
public class PowerPoint implements Assembly
{
public void start()
{
System.out.println("PowerPoint starts") ;
}
}

注意: 請仔細端看加入 –verbose:class 之後的螢幕輸出,您會看到
Assembly.class 也被系統載入了。在此您可以發現,interface如同 class 一般,
會由編譯器產生一個獨立的類別檔(.class),當類別載入器載入類別時,如果發
現該類別繼承了其他類別,或是實作了其他介面,就會先載入代表該介面的類別
檔,也會載入其父類別的類別檔,如果父類別也有其父類別,也會一併優先載入。
換句話說,類別載入器會依繼承體系最上層的類別往下依序載入,直到所有的祖
先類別都載入了,才輪到自己載入。舉例來說,如果有個類別 C 繼承了類別 B、
實作了介面 I,而 B 類別又繼承自A 類別,那麼載入的順序如下圖:

[img]/upload/attachment/105954/327b2c5c-3161-355b-967a-fa3a8e0860ca.jpg[/img]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值