一区二区三区日韩精品-日韩经典一区二区三区-五月激情综合丁香婷婷-欧美精品中文字幕专区

分享

JAVA接口學(xué)習(xí)筆記

 techres 2010-11-21
2009-10-07 15:12
一, 接口基礎(chǔ)知識(shí)
1, java語言不支持一個(gè)類有多個(gè)直接的父類(多繼承),但可以實(shí)現(xiàn)(implements)多個(gè)接口,間接的實(shí)現(xiàn)了多繼承.
2, 與接口相關(guān)的設(shè)計(jì)模式:
1, 定制服務(wù)模式
   設(shè)計(jì)精粒度的接口,每個(gè)接口代表相關(guān)的一組服務(wù),通過繼承來創(chuàng)建復(fù)合接口
2, 適配器模式
   當(dāng)每個(gè)系統(tǒng)之間接口不匹配時(shí),用適配器來轉(zhuǎn)換接口
3, 默認(rèn)適配器模式
   為接口提供簡單的默認(rèn)實(shí)現(xiàn)
4, 代理模式
   為接口的實(shí)現(xiàn)類創(chuàng)建代理類,使用者通過代理來獲得實(shí)現(xiàn)類的服務(wù)
5, 標(biāo)識(shí)類型模式
   用接口來標(biāo)識(shí)一種沒有任何行為的抽象類型
6, 常量接口模式
   在接口中定義靜態(tài)常量,在其它類中通過import static語句引入這些常量
3, 接口的特征歸納:
1, 接口中的成員變量默認(rèn)都是public,static,final類型的(都可省略),必須被顯示初始化,即接口中的成員變量為常量(大寫,單詞之間用"_"分隔)
2, 接口中的方法默認(rèn)都是public,abstract類型的(都可省略),沒有方法體,不能被實(shí)例化
   public interface A
   {
    int CONST = 1; //合法,CONST默認(rèn)為public,static,final類型
    void method(); //合法,method()默認(rèn)為public,abstract類型
    public abstract void method2(); //method2()顯示聲明為public,abstract類型
   }
3, 接口中只能包含public,static,final類型的成員變量和public,abstract類型的成員方法
   public interface A
   {
    int var; //錯(cuò),var是常量,必須顯示初始化
    void method(){...};   //錯(cuò),接口中只能包含抽象方法
    protected void method2(); //錯(cuò),接口中的方法必須是public類型
    static void method3(){...};   //錯(cuò),接口中不能包含靜態(tài)方法
   }
4, 接口中沒有構(gòu)造方法,不能被實(shí)例化
   public interface A
   {
    public A(){...}; //錯(cuò),接口中不能包含構(gòu)造方法
    void method();
   }
5, 一個(gè)接口不能實(shí)現(xiàn)(implements)另一個(gè)接口,但它可以繼承多個(gè)其它的接口
   public interface A
   {
    void methodA();
   }
   public interface B
   {
    void methodB();
   }
   public interface C extends A, B   //C稱為復(fù)合接口
   {
    void methodC();
   }
   public interface C implements A{...}   //錯(cuò)
6, 接口必須通過類來實(shí)現(xiàn)它的抽象方法
   public class A implements B{...}
7, 當(dāng)類實(shí)現(xiàn)了某個(gè)接口時(shí),它必須實(shí)現(xiàn)接口中的所有抽象方法,否則這個(gè)類必須聲明為抽象的
8, 不允許創(chuàng)建接口的實(shí)例(實(shí)例化),但允許定義接口類型的引用變量,該引用變量引用實(shí)現(xiàn)了這個(gè)接口的類的實(shí)例
   public class B implements A{}
   A a = new B(); //引用變量a被定義為A接口類型,引用了B實(shí)例
   A a = new A(); //錯(cuò)誤,接口不允許實(shí)例化
9, 一個(gè)類只能繼承一個(gè)直接的父類,但可以實(shí)現(xiàn)多個(gè)接口,間接的實(shí)現(xiàn)了多繼承.
   public class A extends B implements C, D{...} //B為class,C,D為interface
4, 通過接口,可以方便地對(duì)已經(jīng)存在的系統(tǒng)進(jìn)行自下而上的抽象,對(duì)于任意兩個(gè)類,不管它們是否屬于同一個(gè)父類,只有它
們存在相同的功能,就能從中抽象出一個(gè)接口類型.對(duì)于已經(jīng)存在的繼承樹,可以方便的從類中抽象出新的接口,但從類
中抽象出新的抽象類卻不那么容易,因此接口更有利于軟件系統(tǒng)的維護(hù)與重構(gòu).對(duì)于兩個(gè)系統(tǒng),通過接口交互比通過抽象
類交互能獲得更好的松耦合.
5, 接口是構(gòu)建松耦合軟件系統(tǒng)的重要法寶,由于接口用于描述系統(tǒng)對(duì)外提供的所有服務(wù),因此接口中的成員變量和方法都
必須是public類型的,確保外部使用者能訪問它們,接口僅僅描述系統(tǒng)能做什么,但不指明如何去做,所有接口中的方法
都是抽象方法,接口不涉及和任何具體實(shí)例相關(guān)的細(xì)節(jié),因此接口沒有構(gòu)造方法,不能被實(shí)例化,沒有實(shí)例變量.
二, 比較抽象類與接口
1, 抽象類與接口都位于繼承樹的上層
相同點(diǎn)
1, 代表系統(tǒng)的抽象層,當(dāng)一個(gè)系統(tǒng)使用一顆繼承樹上的類時(shí),應(yīng)該盡量把引用變量聲明為繼承樹的上層抽象類型,
   這樣可以提高兩個(gè)系統(tǒng)之間的送耦合
2, 都不能被實(shí)例化
3, 都包含抽象方法,這些抽象方法用于描述系統(tǒng)能提供哪些服務(wù),但不提供具體的實(shí)現(xiàn)
不同點(diǎn):
1, 在抽象類中可以為部分方法提供默認(rèn)的實(shí)現(xiàn),從而避免在子類中重復(fù)實(shí)現(xiàn)它們,這是抽象類的優(yōu)勢(shì),但這一優(yōu)勢(shì)
   限制了多繼承,而接口中只能包含抽象方法.
   由于在抽象類中允許加入具體方法,因此擴(kuò)展抽象類的功能,即向抽象類中添加具體方法,不會(huì)對(duì)它的子類造
   成影響,而對(duì)于接口,一旦接口被公布,就必須非常穩(wěn)定,因?yàn)殡S意在接口中添加抽象方法,會(huì)影響到所有的實(shí)
   現(xiàn)類,這些實(shí)現(xiàn)類要么實(shí)現(xiàn)新增的抽象方法,要么聲明為抽象類
2, 一個(gè)類只能繼承一個(gè)直接的父類,這個(gè)父類可能是抽象類,但一個(gè)類可以實(shí)現(xiàn)多個(gè)接口,這是接口的優(yōu)勢(shì),但這
   一優(yōu)勢(shì)是以不允許為任何方法提供實(shí)現(xiàn)作為代價(jià)的
三, 為什么Java語言不允許多重繼承呢?
當(dāng)子類覆蓋父類的實(shí)例方法或隱藏父類的成員變量及靜態(tài)方法時(shí),Java虛擬機(jī)采用不同的綁定規(guī)則,假如還允許
一個(gè)類有多個(gè)直接的父類,那么會(huì)使綁定規(guī)則更加復(fù)雜,因此,為了簡化系統(tǒng)結(jié)構(gòu)設(shè)計(jì)和動(dòng)態(tài)綁定機(jī)制,Java語言
禁止多重繼承.
而接口中只有抽象方法,沒有實(shí)例變量和靜態(tài)方法,只有接口的實(shí)現(xiàn)類才會(huì)實(shí)現(xiàn)接口的抽象方法(接口中的抽象方
法是通過類來實(shí)現(xiàn)的),因此,一個(gè)類即使有多個(gè)接口,也不會(huì)增加Java虛擬機(jī)進(jìn)行動(dòng)態(tài)綁定的復(fù)雜度.因?yàn)镴ava虛
擬機(jī)永遠(yuǎn)不會(huì)把方法與接口綁定,而只會(huì)把方法與它的實(shí)現(xiàn)類綁定.
四, 使用接口和抽象類的總體原則:
1, 用接口作為系統(tǒng)與外界交互的窗口
   站在外界使用者(另一個(gè)系統(tǒng))的角度,接口向使用者承諾系統(tǒng)能提供哪些服務(wù),站在系統(tǒng)本身的角度,接口制定
   系統(tǒng)必須實(shí)現(xiàn)哪些服務(wù),接口是系統(tǒng)中最高層次的抽象類型.通過接口交互可以提高兩個(gè)系統(tǒng)之間的送耦合
   系統(tǒng)A通過系統(tǒng)B進(jìn)行交互,是指系統(tǒng)A訪問系統(tǒng)B時(shí),
   把引用變量聲明為系統(tǒng)B中的接口類型,該引用變量引用系統(tǒng)B中接口的實(shí)現(xiàn)類的實(shí)例.
   public interface B
   {
   }
   public class C implements B
   {
   }
   public class A
   {
   }
   B a = new C();
2, 接口本身必須非常穩(wěn)定,接口一旦制定,就不允許隨遇更加,否則對(duì)外面使用者及系統(tǒng)本身造成影響
3, 用抽象類來定制系統(tǒng)中的擴(kuò)展點(diǎn)
   抽象類來完成部分實(shí)現(xiàn),還要一些功能通過它的子類來實(shí)現(xiàn)
                   2008/1/9

一, Java多態(tài)機(jī)制中的綁定規(guī)則深入剖析
class Base
{
   String var = "BaseVar";   //實(shí)例變量
   static String staticVar = "StaticBaseVar";   //靜態(tài)變量
   void method()   //實(shí)例方法
   {
    System.out.println("Base method");
   }
   static void staticMethod()   //靜態(tài)方法
   {
    System.out.println("Static Base method");
   }
}
public class Sub extends Base
{
   String var = "SubVar";   //實(shí)例變量
   static String staticVar = "StaticSubVar";   //靜態(tài)變量

   void method()   //隱藏父類的method()方法
   {
    System.out.println("Sub method");
   }
   static void staticMethod()   //隱藏父類的staticMethod()方法
   {
    System.out.println("Static Sub method");
   }
   String subVar = "Var only belonging to Sub";
   void subMethod()
   {
    System.out.println("method only belonging to Sub");
   }
   public static void main(String args[])
   {
    //引用變量who被聲明為Base類型,引用Sub類的實(shí)例
    Base who = new Sub();  

    //成員變量(靜態(tài)變量,實(shí)例變量)與引用變量所聲明的類型(Base類型)的成員變量綁定
    System.out.println("who.var = "+who.var);   //所以,打印Base類的var變量
    System.out.println("who.staticVar = "+who.staticVar); //所以,打印Base類的staticVar變量
    //實(shí)例方法與引用變量實(shí)際引用的對(duì)象(Sub對(duì)象)的方法綁定
    who.method();   //所以,打印Sub實(shí)例的method()方法
    //靜態(tài)方法與引用變量所聲明的類型(Base類型)的方法綁定
    who.staticMethod();   //所以,打印Base類的staticMethod()方法
   }
}

【分析過程】
1, 對(duì)于一個(gè)引用類型的變量,Java編譯器按照它聲明的類型來處理.
   例如在以下代碼中,編譯器認(rèn)為who是Base類型的引用變量,不存在subVar成員變量喝subMethod()方法,編譯報(bào)錯(cuò)
   Base who = new Sub(); //引用變量who被聲明為Base類型,引用Sub類的實(shí)例
   who.subVar = "123";   //編譯錯(cuò),在Base類中沒有subVar屬性
   who.subMethod();   //編譯錯(cuò),在Base類中沒有submethod()方法
   如果要訪問Sub類的成員,必須通過強(qiáng)制類型轉(zhuǎn)換:
   Base who = new Sub();
   //把Base引用類型的who成員變量強(qiáng)制轉(zhuǎn)換為Sub引用類型
   //把引用變量轉(zhuǎn)換為子類的類型稱為向下轉(zhuǎn)型,把引用變量轉(zhuǎn)換為父類的類型稱為向上轉(zhuǎn)型
   ((Sub)who).subVar = "123";
   ((Sub)who).subMethod();
   Java編譯器允許在具有直接或間接繼承關(guān)系的類之間進(jìn)行類型轉(zhuǎn)換,對(duì)于向上轉(zhuǎn)型,Java編譯器會(huì)自動(dòng)進(jìn)行,對(duì)于
   向下轉(zhuǎn)型,需要進(jìn)行強(qiáng)制類型轉(zhuǎn)換
   如果兩種類型之間沒有繼續(xù)關(guān)系,即不在繼承樹的同一個(gè)繼承分支上,那么Java編譯器不允許進(jìn)行類型轉(zhuǎn)換
2, 對(duì)于一個(gè)引用類型的變量,運(yùn)行時(shí)Java虛擬機(jī)按照它實(shí)際引用的對(duì)象來處理
   例如以下代碼雖編譯可通過,但運(yùn)行時(shí)會(huì)拋出ClassCastException運(yùn)行時(shí)異常
   Base who = new Base();   //who引用Base類的實(shí)例
   Sub s = (Sub)who;   //運(yùn)行時(shí)會(huì)拋出ClassCastException
   在運(yùn)行時(shí),子類的對(duì)象可以轉(zhuǎn)換為父類類型,而父類的對(duì)象實(shí)際上無法轉(zhuǎn)換為子類類型
3, 在運(yùn)行時(shí)環(huán)境中,通過引用類型變量來訪問所引用對(duì)象的方法和屬性時(shí),Java虛擬機(jī)采用以下綁定規(guī)則:
   1, 實(shí)例方法與引用變量實(shí)際引用的對(duì)象的方法綁定,這種綁定屬于動(dòng)態(tài)綁定,因?yàn)槭窃谶\(yùn)行時(shí)由Java虛擬機(jī)
    動(dòng)態(tài)決定的
   2, 靜態(tài)方法與引用變量所聲明的類型的方法綁定,這種綁定屬于靜態(tài)綁定,因?yàn)閷?shí)際上是在編譯階段就已經(jīng)
    綁定
   3, 成員變量(靜態(tài)變量,實(shí)例變量)與引用變量所聲明的類型的成員變量綁定,這種綁定屬于靜態(tài)綁定,因?yàn)?br>     實(shí)際上是在編譯階段就已經(jīng)綁定

    本站是提供個(gè)人知識(shí)管理的網(wǎng)絡(luò)存儲(chǔ)空間,所有內(nèi)容均由用戶發(fā)布,不代表本站觀點(diǎn)。請(qǐng)注意甄別內(nèi)容中的聯(lián)系方式、誘導(dǎo)購買等信息,謹(jǐn)防詐騙。如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,請(qǐng)點(diǎn)擊一鍵舉報(bào)。
    轉(zhuǎn)藏 分享 獻(xiàn)花(0

    0條評(píng)論

    發(fā)表

    請(qǐng)遵守用戶 評(píng)論公約

    類似文章 更多

    亚洲熟女一区二区三四区| 亚洲国产成人av毛片国产| 亚洲国产精品一区二区毛片| 欧美极品欧美精品欧美| 激情五月天深爱丁香婷婷| 亚洲熟女精品一区二区成人| 久久精品欧美一区二区三不卡| 日韩一区中文免费视频| 国产在线一区中文字幕| 99久久精品免费精品国产| 日本一区不卡在线观看| 亚洲一区二区三区有码| 国产剧情欧美日韩中文在线| 一区二区不卡免费观看免费| 狠狠亚洲丁香综合久久| 中文字幕免费观看亚洲视频 | 日本办公室三级在线观看| 狠狠做深爱婷婷久久综合| 中文字幕在线五月婷婷| 国产一级内片内射免费看| 亚洲一区二区三区国产| 日本午夜一本久久久综合 | 亚洲一区二区欧美在线| 女生更色还是男生更色| 欧美夫妻性生活一区二区| 99久久精品国产麻豆| 欧美日韩国产综合特黄| 久久精品国产亚洲av久按摩| 欧洲一区二区三区自拍天堂| 国语对白刺激高潮在线视频| 中文字幕一二区在线观看| 国产精品免费精品一区二区| 亚洲一区二区三区熟女少妇| 国产高清精品福利私拍| 日韩欧美中文字幕av| 麻豆精品在线一区二区三区| 欧美三级不卡在线观线看| 亚洲一区二区三区四区性色av| 精品精品国产自在久久高清| 精品国产品国语在线不卡| 午夜福利激情性生活免费视频|