第4課-java面向?qū)ο缶C述二_第1頁(yè)
第4課-java面向?qū)ο缶C述二_第2頁(yè)
第4課-java面向?qū)ο缶C述二_第3頁(yè)
第4課-java面向?qū)ο缶C述二_第4頁(yè)
第4課-java面向?qū)ο缶C述二_第5頁(yè)
已閱讀5頁(yè),還剩37頁(yè)未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(quán)說(shuō)明:本文檔由用戶(hù)提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)

文檔簡(jiǎn)介

多態(tài)

(Polymorphism)

是面 象技術(shù)的概念。方法的重寫(xiě)(Overriding)和方法的重載(Overloading)是Java多態(tài)性的不同表現(xiàn)。在Java中,子類(lèi)重寫(xiě)父類(lèi)方法時(shí),不會(huì)隱藏父類(lèi)中的同名方法。這與C++不同。3.3

接口與動(dòng)態(tài)多態(tài)實(shí)現(xiàn)一、接口接口(interface)是抽象類(lèi)概念的進(jìn)一步深化。接口可以看成是一個(gè)完全抽象的類(lèi),是一個(gè)沒(méi)有任何實(shí)現(xiàn)的類(lèi),是抽象方法的集合(可缺省public)。一個(gè)類(lèi)可以implments不止一個(gè)接口,這提供了一種實(shí)現(xiàn)多重繼承的方式。所以接口存在的原因除了與抽象類(lèi)存在的原因一致外,還可以幫助將一個(gè)接口對(duì)象

到多個(gè)基類(lèi)。接口中的方法默認(rèn)是public

的。接口內(nèi)的變量成員默認(rèn)是static

和final

的,屬于常量。接口與類(lèi)的不同在于:(1)

沒(méi)有變量的(2)

只有方法的,但可以定義常量。,沒(méi)有方法的實(shí)現(xiàn)。接口 的基本格式如下:public

interface

接口名extends

接口列表【例4.1】測(cè)試接口,定義接口文件Product.java,定義了兩個(gè)常量, 了一個(gè)方法。接口文件如下://程序文件名Product.javapublic

interface

Product{static

final

String

MAKER

=

"計(jì)算機(jī)制造廠";static

final

String

ADDRESS

=

"

";public

intgetPrice();}使用接口的源文件代碼如下://程序文件名UseInterface.javapublic

class

UseInterface{public

static

void

main(String[]

args){Computer

p=new

Computer();System.out.print(p.ADDRESS+p.MAKER);System.out.println("

計(jì)算機(jī)的價(jià)格:"+p.getPrice()+"萬(wàn)元");}}class

Computer

implements

Product{public

intgetPrice(){return

1;}}上例的運(yùn)行過(guò)程是:編譯器首先編譯接口文件

“Product.java”,然后編譯使用這個(gè)接口的類(lèi)文件“UseInterface.java”,最后執(zhí)行

“UseInterface.class”。如何選擇接口和抽象類(lèi):接口既提供抽象類(lèi)的優(yōu)點(diǎn)也提供接口本身獨(dú)特的優(yōu)點(diǎn),所以應(yīng)該優(yōu)先選擇接口類(lèi),只有需要方法定義和成員變量時(shí)才應(yīng)該考慮將其轉(zhuǎn)化為抽象類(lèi)。接口應(yīng)用實(shí)例Java實(shí)現(xiàn)動(dòng)態(tài)多態(tài)主要依賴(lài)于接口實(shí)現(xiàn)及其回調(diào)時(shí)的動(dòng)態(tài)綁定過(guò)程。一個(gè)接口變量可以關(guān)聯(lián)多個(gè)實(shí)現(xiàn)該接口的類(lèi)對(duì)象。接口變量作為類(lèi)型,存放其關(guān)聯(lián)對(duì)象的引用,那么就可通過(guò)接口變量調(diào)用對(duì)象的接口方法,這個(gè)過(guò)程稱(chēng)為“回調(diào)”。接口回調(diào)過(guò)程類(lèi)似于上對(duì)象調(diào)用子類(lèi)繼承或重寫(xiě)方法的過(guò)程。二、動(dòng)態(tài)多態(tài)的實(shí)現(xiàn)將一個(gè)方法調(diào)用同一個(gè)方法本體關(guān)聯(lián)起來(lái)被稱(chēng)作

“綁定(binding)”。“先期綁定”:在編譯時(shí)編譯器就能判斷出應(yīng)該調(diào)用的方法稱(chēng)為靜態(tài)綁定方法。Java中這類(lèi)方法包括private、static、final方法以及構(gòu)造方法?!皠?dòng)態(tài)綁定“:在運(yùn)行期由JVM判定對(duì)象的類(lèi)型,并調(diào)用其相應(yīng)的方法稱(chēng)做動(dòng)態(tài)綁定(dynamic

binding)(“后期綁定”、“運(yùn)行時(shí)綁定”)方法。除了靜態(tài)綁定方法,其他所有的方法都是動(dòng)態(tài)綁定的。這也給多態(tài)機(jī)制提供了條件。class

A

{static

void

method1()

{System.out.println(“A.method1()”);}void

method2()

{System.out.println(“A.method2()”);}}publicclass

B

extends

A{//

will

not

override

A.method1()static

void

method1()

{System.out.println(“B.method1()”);}//

will

override

the

A.method2()void

method2()

{System.out.println(“B.method2()”);}public

static

void

main(String[]

args)

{A

a=

new

B();a.method1();//A的method1是static,編譯時(shí)靜態(tài)綁定,輸出

A.method1()a.method2();}//輸出

B.method2(),動(dòng)態(tài)綁定體現(xiàn)java的多態(tài)性}多態(tài)在面 象程序設(shè)計(jì)中意味著通過(guò)動(dòng)態(tài)綁定原理,使用單個(gè)變量來(lái)

不同類(lèi)的對(duì)象,自動(dòng)調(diào)用

對(duì)象類(lèi)的對(duì)應(yīng)方法。有了動(dòng)態(tài)綁定機(jī)制,編譯器無(wú)需知道對(duì)象的類(lèi)型,但方法的綁定和調(diào)用機(jī)制能夠找出正確的方法體并加以調(diào)用。面象的替代原則(substitution

principle):基類(lèi)可以用其派生類(lèi)代換。替代過(guò)程也是派生類(lèi)向上的過(guò)程。向上是一種常用的安全的類(lèi)型轉(zhuǎn)換,通過(guò)向上也可實(shí)現(xiàn)多態(tài)性。果園系統(tǒng)的繼承與動(dòng)態(tài)多態(tài)派生類(lèi)的對(duì)象具有多個(gè)類(lèi)型fruits[0]=new

TropicalFruit("香蕉",1000);fruits[1]=new

Berry("葡萄",2000);fruits[2]=new

TropicalFruit("菠蘿",2000);fruits[3]=new

Berry("草莓",1000);fruits[4]=new

CitrusFruit("橘子",1000);動(dòng)態(tài)綁定實(shí)現(xiàn)多態(tài)

(向上

)可以像對(duì)待父類(lèi)對(duì)象那樣對(duì)待子類(lèi)對(duì)象。即所有繼承自共同父類(lèi)的子類(lèi)對(duì)象可以當(dāng)做是這些父類(lèi)的對(duì)象。Food

myFood;Fruit

myFruit;CitrusFruit

orange;orange

= new

CitrusFruit("橘子",1000);

//創(chuàng)建橘子對(duì)象myFood

=

orange;

//相當(dāng)于myFood

=

(Food)orange;myFood.eat();

//調(diào)用的是CitrusFruit的eat方法:剝皮吃橘子myFruit

=

orange;

//相當(dāng)于myFruit

=

(Fruit)orange;myFruit.eat();

//調(diào)用的還是CitrusFruit的eat方法:剝皮吃橘子4.2

數(shù)組、枚舉與泛型一、數(shù)組在Java中,數(shù)組屬于

型變量。創(chuàng)建數(shù)組需要經(jīng)過(guò)數(shù)組

和為數(shù)組分配變量?jī)蓚€(gè)過(guò)程。一維數(shù)組創(chuàng)建的語(yǔ)法格式如下:數(shù)組類(lèi)型名稱(chēng)[]

數(shù)組變量名;

//

數(shù)組變量(也可以寫(xiě)成:數(shù)組類(lèi)型名稱(chēng)數(shù)組變量名[];)數(shù)組變量名

=

new

數(shù)組類(lèi)型名稱(chēng)[n];

//創(chuàng)建長(zhǎng)度為n的數(shù)組以上兩步也可以合并寫(xiě)為:數(shù)組類(lèi)型名稱(chēng)數(shù)組變量名[]=new數(shù)組類(lèi)型名稱(chēng)[n];或者:數(shù)組類(lèi)型名稱(chēng)[]

數(shù)組變量名=

new數(shù)組類(lèi)型名稱(chēng)[n];例如:int

score[]

;

//

整型數(shù)組scorescore=new

int[3];

//為整型數(shù)組score分配內(nèi)存空間,其元素個(gè)數(shù)為3或:int

score[]

=

new

int[3];一維數(shù)組【例4.2】程序TestJava4_1.java,一維數(shù)組的使用方法。public

class

TestJava4_1

{public

static

void

main(String

args[])

{int

i;int

a[];

//a=newint[3];一個(gè)整型數(shù)組a//為數(shù)組a開(kāi)辟3個(gè)內(nèi)存空間for(i=0;i<3;i++)//輸出數(shù)組的內(nèi)容System.out.print("a["+i+"]="+a[i]+",\t");System.out.println("\n數(shù)組長(zhǎng)度是:"+a.length);}}輸出結(jié)果:a[0]=

0,a[1]=

0,

a[2]

=

0,數(shù)組長(zhǎng)度是:3在Java中取得數(shù)組的長(zhǎng)度(也就是數(shù)組元素的個(gè)數(shù))可通過(guò)“數(shù)組名.length”完成。”length”是數(shù)組等集合類(lèi)對(duì)象的屬性。

如上例中a.length時(shí)就給數(shù)組賦初值。也可以采用靜態(tài)方式直接在格式如下:數(shù)據(jù)類(lèi)型數(shù)組名[]={初值0,初值1,…,初值n}此時(shí)編譯器根據(jù)所給出的初值個(gè)數(shù)來(lái)判斷數(shù)組的元素個(gè)數(shù)。除了在 時(shí)就賦初值之外,也可以在程序中為某個(gè)特定的數(shù)組元素賦值。 如:a[0]

=

5;一維數(shù)組在Java中提供了許多的API方法。與數(shù)組有關(guān)的兩種常用方法:數(shù)組的拷貝操作方法System.arrayCopy(source,0,dest,0,x)功能:

源數(shù)組從下標(biāo)0開(kāi)始的x個(gè)元素到目標(biāo)數(shù)組,從目標(biāo)數(shù)組的下標(biāo)0所對(duì)應(yīng)的位置開(kāi)始存取。數(shù)組的排序操作Arrays.sort(數(shù)組名)一維數(shù)組的使用如:for(int

i:a)//a是整形數(shù)組System.out.println(i);for(char

ch:b)

//b是字符型數(shù)組System.out.println(ch);一維數(shù)組的遍歷遍歷數(shù)組,可以使用傳統(tǒng)的for循環(huán)方式,將循環(huán)變量作為索引值 每一個(gè)數(shù)組元素。也可以使用如下增強(qiáng)型for循環(huán)方式遍歷數(shù)組:for(

循環(huán)變量:數(shù)組名)目標(biāo)數(shù)組元素類(lèi)型 變量名二維數(shù)組以及數(shù)組Java也提供了二維數(shù)組以及 數(shù)組。二維數(shù)組 與分配內(nèi)存的格式如下:數(shù)據(jù)類(lèi)型數(shù)組名[][];數(shù)組名=new數(shù)據(jù)類(lèi)型[行的個(gè)數(shù)][列的個(gè)數(shù)];或者:數(shù)據(jù)類(lèi)型數(shù)組名[][]=new數(shù)據(jù)類(lèi)型[行的個(gè)數(shù)][列的個(gè)數(shù)];例如:int

score[][]=new

int[4][3];二維數(shù)組二維數(shù)組的靜態(tài)賦值格式:數(shù)據(jù)類(lèi)型數(shù)組名[][]={{第0行初值},{第1行初值},…{第n行初值},};Java允許二維數(shù)組中每行的元素個(gè)數(shù)均不相同。如:int

num[][]={{26,28},{33},{12,34,90}};取得二維數(shù)組的行數(shù):數(shù)組名.length取得數(shù)組中特定行的元素的個(gè)數(shù):數(shù)組名[索引值].length如:num.length;

//

計(jì)算數(shù)組num的行數(shù)num[0].length

//計(jì)算數(shù)組num第1行元素個(gè)數(shù)想要提高數(shù)組的維數(shù),只要在

數(shù)組的時(shí)候?qū)⑺饕c中括號(hào)再加一組即可。所以三維數(shù)組的

為int

A[][][],而

數(shù)組為int

A[][][][]

……,以此類(lèi)推。二維數(shù)組與

數(shù)組對(duì)象數(shù)組對(duì)象也可以用數(shù)組來(lái)存放,通過(guò)下面兩個(gè)步驟來(lái)實(shí)現(xiàn):1、

類(lèi)類(lèi)型的數(shù)組變量,并用new分配內(nèi)存空間給數(shù)組。2、用new產(chǎn)生新的對(duì)象,并調(diào)用構(gòu)造方法初始化對(duì)象。例如://創(chuàng)建對(duì)象數(shù)組元p[

]

=

new

[3];素,并分配內(nèi)存空間for(int

i=0;i<p.length;i++)

{p[i]=new

();}

//對(duì)象數(shù)組初始化二、枚舉類(lèi)型枚舉類(lèi)型定義包括枚舉的

和枚舉體。格式如下:[public]

enum

枚舉類(lèi)型名{枚舉常量列表}枚舉類(lèi)型是一個(gè)類(lèi),它的隱含父類(lèi)是java.lang.Enum。枚舉值(枚舉常量)是被

的枚舉類(lèi)的自身實(shí)例。枚舉類(lèi)不能有public的構(gòu)造方法,構(gòu)造方法都隱含private,由編譯器自動(dòng)處理。每個(gè)枚舉值隱含都是由public、static、final修飾。枚舉變量的使用枚舉變量只能取枚舉常量列表中的枚舉值。取值方式:枚舉類(lèi)型名.枚舉常量名。如:enum

Season{spring,summer,autumn,winter}Season

x;x=

Season.spring;可以創(chuàng)建枚舉類(lèi)型的一維數(shù)組,數(shù)組元素依次取枚舉常量值。方法如下:枚舉類(lèi)型名數(shù)組名[]=枚舉類(lèi)型名.values();枚舉變量的使用通過(guò)“枚舉類(lèi)型名.values()”取得的枚舉常量可以替代一維數(shù)組名放入for循環(huán)中,遍歷每一個(gè)枚舉常量作為循環(huán)條件。方法:for(枚舉類(lèi)型名枚舉變量名:枚舉類(lèi)型名.values()){循環(huán)體}枚舉變量的值也可作為switch語(yǔ)句的判定條件。方法:switch(枚舉變量名){case

枚舉常量名0:…break;case

枚舉常量名1:…break;……}三、泛型泛型也被稱(chēng)為參數(shù)化類(lèi)型,是一種特殊的類(lèi)型,它把指定類(lèi)型的工作推客戶(hù)端代碼并實(shí)例化類(lèi)或方法的時(shí)候進(jìn)行。也就是說(shuō),在定義類(lèi)、接口或方法時(shí),可使用泛型參

數(shù),在創(chuàng)建對(duì)象或調(diào)用方法時(shí),才明確對(duì)象或方法的類(lèi)型。(即編譯時(shí)不確定類(lèi)型,運(yùn)行時(shí)確定。)泛型主要作用于集合應(yīng)用,用于表明集合元素的類(lèi)型限制。例如需要一個(gè)緩沖類(lèi)Pool來(lái)管理等待處理的隊(duì)列元素,可以使用泛型來(lái)取消對(duì)Pool所管理元素的具體類(lèi)型限制,

以增強(qiáng)Pool的功能并降低程序出錯(cuò)風(fēng)險(xiǎn)。泛型類(lèi)的定義泛型類(lèi)

方式:[public]

class

泛型類(lèi)名<T>其中,參數(shù)T(或者E)只是個(gè)簡(jiǎn)單字符,用來(lái)表示一個(gè)未知的類(lèi)型(注意是類(lèi)或接口,而非基本類(lèi)型)。編譯類(lèi)時(shí)參數(shù)T沒(méi)有值。在程序運(yùn)行中具體

并創(chuàng)建實(shí)例時(shí),才確定參數(shù)T的實(shí)際類(lèi)型。p228例12-1泛型類(lèi)也是 類(lèi)型。泛型類(lèi)的類(lèi)體內(nèi)仍然是成員變量或成員方法。類(lèi)體中方法也可以是泛型方法。泛型接口一個(gè)接口也同樣可 泛型參數(shù)。泛型接口 格式:[public]

interface接口名<T>例如:public

interface

IPool<T>{Tget();int

add(T

t);}

Java

接口規(guī)定了不同對(duì)象具有相似的行為。泛型進(jìn)一步擴(kuò)展了接口的適用范圍,可針對(duì)不同類(lèi)型的對(duì)象定義相同的行為特征。泛型方法在普通類(lèi)或者泛型類(lèi)中,也可以定義泛型方法。通常泛型方法定義為靜態(tài)方法。例如:public

class

ArrayTool{public

static<E>void

insert(E[]

e,int

i){…}public

static<E>E

value(E[]

e){…}…}方法類(lèi)型前“<>”中的參數(shù)就是方法的泛型參數(shù),可做為方法的返回值和參數(shù)的類(lèi)型

。泛型方法的調(diào)用調(diào)用泛型方法的格式:(注意是靜態(tài)方法調(diào)用)類(lèi)名.<返回類(lèi)型>方法名(實(shí)參列表);例如上頁(yè)例:String[]

names={“

”,“

”};方法insert調(diào)用:ArrayTool.insert(names,0);類(lèi)型為E的value方法調(diào)用:ArrayTool.<string>value(names);一個(gè)類(lèi)通過(guò)泛型參數(shù)定義,實(shí)現(xiàn)了處理對(duì)象的普遍性。但是由于泛型類(lèi)的參數(shù)只能在運(yùn)行時(shí)被確定類(lèi)型,限定了泛型類(lèi)的對(duì)象只能做為Object類(lèi)的實(shí)例被處理,無(wú)法有效地使用參數(shù)實(shí)例(泛型類(lèi)對(duì)象)本身提供的方法或?qū)傩浴=鉀Q上述問(wèn)題需要進(jìn)行參數(shù)類(lèi)型的邊界設(shè)定。1、使用extends關(guān)鍵字定義泛型參數(shù)的上界格式如下:[public]

class

類(lèi)名<T

extends

父類(lèi)名|接口名>泛型參數(shù)的限定設(shè)定了泛型參數(shù)的上界,就可將T類(lèi)型的對(duì)象視為繼承的類(lèi)型,使用所繼承的方法和屬性。2、使用super關(guān)鍵字定義泛型參數(shù)的下界格式如下:集合名<?

super

類(lèi)名或其超類(lèi)名>其中,通配符?表示任意類(lèi)型。而T表示未知類(lèi)型。通過(guò)使用super關(guān)鍵字可以固定泛型參數(shù)的類(lèi)型為某種類(lèi)型或其某個(gè)超類(lèi)。Java的集合框架在JDK1.2之后,Java提供了實(shí)現(xiàn)常見(jiàn)數(shù)據(jù)結(jié)構(gòu)的類(lèi),例如鏈表類(lèi)、散列表類(lèi)等,以便于處理對(duì)象集合。這些類(lèi)被稱(chēng)為集合框架,定義在java.util包中。Java使用泛型的主要目的就是建立具有類(lèi)型安全的數(shù)據(jù)結(jié)構(gòu)。從JDK1.5開(kāi)始,這些實(shí)現(xiàn)了的數(shù)據(jù)結(jié)構(gòu)類(lèi)均支持泛型,因此在使用過(guò)程中不必進(jìn)行諸如強(qiáng)制類(lèi)型轉(zhuǎn)換等操作,提高了編譯的安全性。LinkedList<E>泛型類(lèi)LinkedList<E>是實(shí)現(xiàn)了泛型接口List<E>的泛型類(lèi)。用于實(shí)現(xiàn)雙鏈表結(jié)構(gòu)的

與操作。(

List<E>是泛型接口Collection<E>的子接口)LinkedList<E>實(shí)現(xiàn)的List<E>泛型接口方法:publicboolean

add(Eelement)public

void

add(int

index,E

element)public

void

clear()public

E

remove(int

index)public

boolean

remove(E

element)public

E

get(int

index)public

int

indexOf(E

element)public

int

lastIndexOf(E

element)public

E

set(int

index,E

element):數(shù)據(jù)替換public

boolean

contains(Objec

ement)public

int

size():返回鏈表結(jié)點(diǎn)個(gè)數(shù),即表長(zhǎng)(2)LinkedList<E>新增方法:public

void

add (E

element)public

void

addLast(E

element)public

Eget

()public

EgetLast()public

Eremove

()public

EremoveLast()public

Object

clone():克隆當(dāng)前鏈表例:創(chuàng)建雙鏈表list。鏈表數(shù)據(jù)元素為string類(lèi)型。LinkedList<string> list=new

LinkedList<string>

();//先創(chuàng)建一個(gè)鏈表對(duì)象,表示空雙鏈表list.add(“

o”);list.add(“World!”);//在鏈表尾增加兩個(gè)結(jié)點(diǎn)遍歷鏈表時(shí)可使用集合框架提供的迭代器iterator(),提高對(duì)動(dòng)態(tài) 結(jié)構(gòu)對(duì)象集合的 速度。p232例12-3Stack<E>泛型類(lèi)實(shí)現(xiàn)堆棧結(jié)構(gòu)的Stack<E>泛型類(lèi)包含的方法有:public

E

push(E

item)public

E

pop()public

boolean

empty()public

E

peek():取棧頂元素public

int

search(Object

data):獲取元素在堆棧中的位置。頂端從1起向下遞增。HashMap<K,V>與HashSet<E>HashMap<K,V>泛型類(lèi)實(shí)現(xiàn)哈希表結(jié)構(gòu)的動(dòng)態(tài)與操作(K/V是散列表中 的“鍵/值”對(duì)),實(shí)現(xiàn)了Map<K,V>泛型接口。HashMap<K,V>泛型類(lèi)創(chuàng)建的對(duì)象被稱(chēng)作散列

,就是哈希表。 例如創(chuàng)建如下對(duì)象:HashMap<string,student>

hatable=HashSet<string,student>();HashMa

溫馨提示

  • 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶(hù)所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒(méi)有圖紙預(yù)覽就沒(méi)有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫(kù)網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶(hù)上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶(hù)上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶(hù)因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。

評(píng)論

0/150

提交評(píng)論