多重繼承是指一個子類可以有多個直接父類,,該子類可以全
部或部分繼承所有直接父類的數據成員及成員方法,。而Java出于安全性、簡化程序結構的考慮,,不支持類間的多繼承而只支持單繼承,。然而在 解決實際問題的過程中,在很多情況下僅僅依靠單繼承不能將復雜的問題描述清楚,。為了使Java程序的類間層次結構更加合理,,更符合實際問
題的本質,Java語言提供接口來實現多重繼承機制,。
(1) interface是聲明接口的關鍵字,可以把它看成一個特殊 類,。 (2) 接口名要求符合Java標識符規(guī)定,。 (3) 修飾符有兩種:public 和默認。public修飾的接口是公共 接口,,可以被所有的類和接口使用,;默認修飾符的接口只能被 同一個包中的其他類和接口使用。 (4) 父接口列表:接口也具有繼承性,。定義一個接口時可以 通過extends關鍵字聲明該接口是某個已經存在的父接口的派生接 口,,它將繼承父接口的所有屬性和方法。與類的繼承不同的是一 個接口可以有一個以上的父接口,,它們之間用逗號分隔,。 (5) 常量數據成員聲明:常量數據成員前可以有也可沒有修 飾符。修飾符是public final static和fina1 static,;接口中的數據成 員都是用 final修飾的常量,,寫法如下: 修飾符 數據成員類型 數據成員名=常量值 或 數據成員名=常量值 例如: public final static double PI=3.14159; final static int a=9,; int SUM=100,;(等價于final static int SUM=100;) (6) 抽象方法聲明:接口中的方法都是用abstract修飾的抽象 方法。在接口中只能給出這些抽象方法的方法名,、返回值和參 數列表,,而不能定義方法體,即這些接口僅僅是規(guī)定了一組信 息交換,、傳輸和處理的“接口”,。格式如下: 返回值類型 方法名(參數列表); 其中:接口中的方法默認為public abstract方法,。接口中方 法的方法體可以由Java語言書寫,,也可以由其他語言書寫,。方 法體由其他語言書寫時,接口方法由native修飾符修飾,。 從上面的格式可以看出,,定義接口與定義類非常相似。實 際上完全可以把接口理解成為一種特殊的類,,由常量和抽象方 法組成的特殊類,。一個類只能有一個父類,但是它可以同時實 現若干個接口,。這種情況下,,如果把接口理解成特殊的類,那 么這個類利用接口實際上就獲得了多個父類,,即實現了多重繼 承,。 接口定義僅僅是實現某一特定功能的一組功能的對外接口 和規(guī)范,而不能真正地實現這個功能,,這個功能的真正實現是 在“繼承”這個接口的各個類中完成的,,即要由這些類來具體定義 接口中各抽象方法的方法體。因而在Java中,,通常把對接口功能 的“繼承”稱為“實現”,。 定義接口注意事項
定義接口要注意以下幾點: (1) 接口定義用關鍵字interface,而不是用class,。 (2) 接口中定義的數據成員全是final static,,即常量。 (3) 接口中沒有自身的構造方法,,所有成員方法都是抽象 方法,。 (4) 接口也具有繼承性,可以通過extends關鍵字聲明該接 口的父接口,。 類實現接口的注意事項
一個類要實現接口,,即一個類要調用多個接口時,要注意 以下幾點: (1) 在類中,,用implements關鍵字就可以調用接口,。一個類 若要調用多個接口時,可在implements后用逗號隔開多個接口的 名字,。 (2) 如果實現某接口的類不是abstract的抽象類,,則在類的定 義部分必須實現指定接口的所有抽象方法,即為所有抽象方法 定義方法體,,而且方法頭部分應該與接口中的定義完全一致,, 即有完全相同的返回值和參數列表。 (3) 如果實現某接口的類是abstract的抽象類,則它可以不實 現該接口所有的方法,。但是對于這個抽象類的任何一個非抽象 的子類而言,,它們的父類所實現的接口中的所有抽象方法都必 須有實在的方法體。這些方法體可以來自抽象的父類,,也可以 來自子類自身,,但是不允許存在未被實現的接口方法。這主要 體現了非抽象類中不能存在抽象方法的原則,。 (4) 接口的抽象方法的訪問限制符都己指定為public,,所以類在實現方法時,必須顯式地使用public飾符,,否則將被系統(tǒng)警告為縮小了接口中 定義的方法的訪問控制范圍,。正是因為抽象的概念在問題領域沒有對應的具體概念,所以用以表征抽象概念的抽象類是不能夠實例化的,。
在面向對象的概念中,,我們知道所有的對象都是通過類來描繪的,但是反過來卻不是這樣,。并不是所有的類都是用來描繪對象的,,如果一個類
中沒有包含足夠的信息來描繪一個具體的對象,這樣的類就是抽象類,。抽象類往往用來表征我們在對問題領域進行分析、設計中得出的抽象概
念,,是對一系列看上去不同,,但是本質上相同的具體概念的抽象。
從某種意義上說,,interface是一種特殊形式的abstractclass,。
abstarctclass在Java語言中體現了一種繼承關系,要想使得繼承關系合理,,父類和派生類之間必須存在"isa"關系,,即父類和派生類在概念本 質上應該是相同的)。對于interface來說則不然,,并不要求interface的實現者和interface定義在概念本質上是一致的,,僅僅是實現了
interface定義的契約而已。abstractclass在Java語言中表示的是一種繼承關系,,一個類只能使用一次繼承關系,。但是,一個類卻可以實現多
個interface,。
接口(interface)可以說成是抽象類的特例,。接口中的所有方法都必須是抽象的,接口中的方法定義默認為public abstract finable。
看一下他們在語法上的區(qū)別吧,! 1,,抽象類里可以有構造方法,而接口內不能有構造方法,。 2,,抽象類中可以有普通成員變量,而接口中不能有普通成員變量,。 3,,抽象類中可以包含非抽象的普通方法,而接口中所有的方法必須是抽象的,,不能有非抽象的普通方法,。 4,抽象類中的抽象方法的訪問類型可以是public ,,protected和默認類型,,但接口中的抽象方法只能是public類型的,并且默認即為 public abstract類型,。
5,,抽象類中可以包含靜態(tài)方法,接口內不能包含靜態(tài)方法,。 6,,抽象類和接口中都可以包含靜態(tài)成員變量,抽象類中的靜態(tài)成員變量的訪問類型可以任意,,但接口中定義的變量只能是public static 類型,,并且默認為public static類型。
7,,一個類可以實現多個接口,,但只能繼承一個抽象類。 再補充點兩者在應用上的區(qū)別: 接口更多的是在系統(tǒng)框架設計方法發(fā)揮作用,,主要定義模塊之間的通信,,而抽象類在代碼實現方面發(fā)揮作用,可以實現代碼的重用 2.public abstract class A { int i=1; public void printI() { System.out.println("i="+i); } } public class B extneds A{ int i=2; public static void main(String[] args) { B b=new B(); b.printI(); } } 輸出地結果為1 (1)子類B 的構造方法被調用,,實例化一個B對象,,B對象的成員被初始化 (2)jvm隱含的調用父類的構造方法,實例化一個A對象,A對象的成員被初始化,。 (3)由于A對象的printI()未被屏蔽,,所以調用的A對象的printI()函數。 那么,,在這里A的成員函數當然是訪問自己的成員變量了,。 類的繼承知識點 (1)java不支持多重繼承,也就是說子類至多只能有一個父類 (2)子類繼承了其父類中不是私有的成員變量和成員方法,作為自己的成員變量和方法 (3)子類中定義的成員變量和父類中定義的成員變量相同時,,則父類中的成員變量不能被繼承 (4)子類中定義的成員方法,,并且這個成員方法的名字,返回類型,,及參數個數和類型與父類的某個成員方法完全相同,,則父類的成員方法不 能被繼承。
super關鍵字在java中的作用是使被屏蔽的成員變量或者成員方法或變?yōu)榭梢?,或者說用來引用被屏蔽的成員變量和成員成員方法,。super是用 在子類中,目的是訪問直接父類中被屏蔽的成員,。
|
|
來自: 李曉卡 > 《java語言總結與學習》