《Java語言》課件第4章_第1頁
《Java語言》課件第4章_第2頁
《Java語言》課件第4章_第3頁
《Java語言》課件第4章_第4頁
《Java語言》課件第4章_第5頁
已閱讀5頁,還剩74頁未讀 繼續(xù)免費(fèi)閱讀

下載本文檔

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

文檔簡介

第4章

繼承、多態(tài)與接口

4.1繼承的概念4.2訪問控制符4.3多態(tài)性4.4this和super4.5理解final修飾4.6抽象類和抽象方法4.7接口

4.8Java泛型4.9對(duì)象引用轉(zhuǎn)換

4.10內(nèi)嵌類4.11Lambda表達(dá)式繼承的概念父類或超類。實(shí)際上是所有子類的公共域和公共方法的集合子類,父類的特殊化,是對(duì)公共域和方法在功能、內(nèi)涵方面的擴(kuò)展和延伸,祖先類的所有成員均將成為子類擁有的“財(cái)富”

4.1.2OBJECT類Object類是所有Java類的最終祖先,以下為常用方法:publicbooleanequals(Objectobj):該方法本意用于兩個(gè)對(duì)象的“深度”比較,也就是比較兩對(duì)象封裝的數(shù)據(jù)是否相等;而比較運(yùn)算符“==”在比較兩對(duì)象變量時(shí),只有當(dāng)兩個(gè)對(duì)象引用指向同一對(duì)象時(shí)才為真值。但在Object類中,equals方法是采用“==”運(yùn)算進(jìn)行比較;publicStringtoString():該方法返回對(duì)象的字符串描述;publicfinalClassgetClass():返回對(duì)象的所屬類;protectedvoidfinalize():該方法Java垃圾回收程序在刪除對(duì)象前自動(dòng)執(zhí)行。JAVA繼承的實(shí)現(xiàn)classStudent{//未使用繼承

privateStringaddress;//籍貫

privateStringname;//姓名

privateintage;//年齡

Stringno;//學(xué)號(hào)

publicStudent(Stringname1,intage1){

name=name1;

age=age1;

}//其它…

}JAVA繼承的實(shí)現(xiàn)classStudentextendsPerson{

Stringno;//學(xué)號(hào)

//其它…}只有no屬性是新加入的,其它屬性在Person類中均存在

繼承關(guān)系中構(gòu)造方法的作用(1)當(dāng)子類未定義構(gòu)造方法時(shí),創(chuàng)建對(duì)象時(shí)將無條件地調(diào)用父類的無參構(gòu)造方法;(2)對(duì)于父類的含參數(shù)構(gòu)造方法,子類可以在自己構(gòu)造方法中使用關(guān)鍵字super來調(diào)用它,但super調(diào)用語句必須是子類構(gòu)造方法中的第一個(gè)可執(zhí)行語句;(3)子類在自己定義構(gòu)造方法中如果沒有用super明確調(diào)用父類的構(gòu)造方法,則在創(chuàng)建對(duì)象時(shí),將自動(dòng)先執(zhí)行父類的無參構(gòu)造方法,然后再執(zhí)行自己定義的構(gòu)造方法。以下程序在編譯時(shí)將出錯(cuò),為什么?classparent{Stringmy;publicparent(Stringx){my=x;}}publicclasssubclassextendsparent{}例4-1類的繼承中構(gòu)造方法的調(diào)用測試

classPerson{//Person類privateStringaddress;//籍貫privateStringname;//姓名privateintage;//年齡publicStringgetName(){//獲取人名

returnname;}publicPerson(Stringname1,Stringaddress1,intage1){name=name1;address=address1;age=age1;}publicPerson(){name="無名氏";}}

例4-1類的繼承中構(gòu)造方法的調(diào)用測試publicclassStudentextendsPerson{Stringno;//學(xué)號(hào)publicStudent(Stringname1,Stringaddress1,intage1,Stringno1){

super(name1,address1,age1);

no=no1;}publicstaticvoidmain(Stringa[]){Studentx=newStudent("張三","江西",25,"20012541");System.out.println("name="+x.getName());System.out.println("no="+x.no);//Studenty=newStudent();不能使用,子類無該構(gòu)造方法

}}子類中將隱藏父類的同名變量classparent{

inta=3;

intm=2;

}

publicclasssubclassextendsparent{

inta=4;

intb=1;

publicstaticvoidmain(Stringa[]){

subclassmy=newsubclass();

System.out.println("a="+my.a+",b="+my.b+",m="+my.m);

}

}4.2.1公共訪問控制符PUBLIC作為類的修飾符,將類聲明為公共類,表明它可以被所有的其它類所訪問和引用作為類的成員的訪問修飾符,表明在其他類中可以無限制地訪問該成員。要真正做到類成員可以在任何地方訪問,在進(jìn)行類設(shè)計(jì)時(shí)必須同時(shí)滿足兩點(diǎn):首先類被定義為public,其次,類的成員被定義為public。

4.2.2缺省訪問控制符沒有給出訪問控制符情形該類只能被同一個(gè)包中的類訪問和引用4.2.3

私有訪問控制符PRIVATE用private修飾的域或方法只能被該類自身所訪問例4-3測試對(duì)私有成員的訪問classMyclass{

privateinta;//私有變量voiddisplay(){System.out.println(a);}}

publicclasstest{publicstaticvoidmain(Stringarg[]){Myclassmy=newMyclass();

my.a=5;

my.display();

}}

4.2.4

保護(hù)訪問控制符PROTECTED用protected修飾的成員可以在三種類中所引用:該類本身;與它在同一個(gè)包中的其它類;在其它包中的該類的子類。例4-4測試包的訪問控制的一個(gè)簡單程序文件1:PackageData.java(該文件存放在sub子目錄下)packagesub;

publicclassPackageData{

protectedstaticintnumber=1;

}

文件2:Mytest.javaimportsub.*;

publicclassMytest{

publicstaticvoidmain(Stringargs[]){

System.out.println("result="+PackageData.number);

}}各類訪問控制符的作用可以歸納為表3-1可直接訪問修飾同一類中同一包中不同包的子類中其他privateYes

默認(rèn)YesYes

protectedYesYesYes

publicYesYesYesYes4.3.1方法的重載(例)publicclassA{

protectedvoidtest(intx,inty){

System.out.println("test(int,int):"+x+""+y);}

protectedvoidtest(intx){

System.out.println("test(int):"+x);}

protectedvoidtest(Stringstr){

System.out.println("test(String):"+str);

}publicstaticvoidmain(String[]args){

Aa1=newA();

a1.test("hello");

a1.test(5,4);}}4.3.1方法的重載通過形式參數(shù)表的差異來區(qū)分方法調(diào)用的匹配原則:1)精確匹配2)自動(dòng)轉(zhuǎn)換匹配基本類型轉(zhuǎn)換對(duì)象引用轉(zhuǎn)換例4-5方法調(diào)用的匹配測試publicclassA{

intx=0;voidtest(intx){

System.out.println("test(int):"+x);}

voidtest(longx){

System.out.println("test(long):"+x);

}

voidtest(doublex){

System.out.println("test(double):"+x);

}publicstaticvoidmain(String[]args){

Aa1=newA();

a1.test(5.0);a1.test(5);}}【思考】如果將test(intx)方法注釋掉,則調(diào)用test(5)如何?例4-6復(fù)數(shù)的加法publicclassComplex{privatedoublex,y;//x,y分別代表復(fù)數(shù)的實(shí)部和虛部

publicComplex(doublereal,doubleimaginary){//構(gòu)造方法

x=real;y=imaginary;}publicStringtoString(){return"("+x+","+y+"i"+")";}/*方法1:將復(fù)數(shù)與另一復(fù)數(shù)a相加*/publicComplexadd(Complexa){//實(shí)例方法

returnnewComplex(x+a.x,y+a.y);}/*方法2:將復(fù)數(shù)與另一個(gè)由兩實(shí)數(shù)a,b構(gòu)成的復(fù)數(shù)相加*/publicComplexadd(doublea,doubleb){//實(shí)例方法

returnnewComplex(x+a,y+b);}/*方法3:將兩復(fù)數(shù)a和b相加*/publicstaticComplexadd(Complexa,Complexb){//靜態(tài)方法

returnnewComplex(a.x+b.x,a.y+b.y);}publicstaticvoidmain(Stringargs[]){Complexx,y,z;x=newComplex(4,5);y=newComplex(3.4,2.8);z=add(x,y);//調(diào)用方法3進(jìn)行兩復(fù)數(shù)相加

System.out.println("result="+z);z=x.add(y);//調(diào)用方法1進(jìn)行兩復(fù)數(shù)相加

System.out.println("result="+z);z=y.add(4,5);//調(diào)用方法2進(jìn)行兩復(fù)數(shù)相加

System.out.println("result="+z);}}2.方法的可變長參數(shù)帶來的問題classHello{staticvoidprint(Stringtitle){System.out.println("1");}staticvoidprint(String...message){System.out.println("2");}staticvoidprint(Stringtitle,String...message){

System.out.println("3");}publicstaticvoidmain(String[]args){print("hello");}}JDK1.5支持可變長參數(shù)調(diào)用固定1個(gè)參數(shù)的方法,原則:固定參數(shù)優(yōu)先于可變長參數(shù)1運(yùn)行結(jié)果2.方法的可變長參數(shù)帶來的問題classHello{staticvoidprint(Stringtitle){System.out.println("1");}staticvoidprint(String...message){System.out.println("2");}staticvoidprint(Stringtitle,String...message){

System.out.println("3");}publicstaticvoidmain(String[]args){print();//無參調(diào)用

}}2運(yùn)行結(jié)果可變長參數(shù)對(duì)應(yīng)多個(gè)實(shí)參(包括0個(gè))?二義性問題classHello{staticvoidprint(Stringtitle){}staticvoidprint(String...message){}staticvoidprint(Stringtitle,String...message){}publicstaticvoidmain(String[]args){print("hello","world");}}編譯不過,存在二義性?避免二義性的新調(diào)用方式classHello{staticvoidprint(Stringtitle){}staticvoidprint(String...message){}staticvoidprint(Stringtitle,String...message){}publicstaticvoidmain(String[]args){print("hello",newString[]{"world"});}}調(diào)用最后一個(gè)print方法可變長參數(shù)可兼容數(shù)組類實(shí)參?數(shù)組類參數(shù)卻無法兼容可變參數(shù)

classHello{staticvoidprint(String[]title){}publicstaticvoidmain(String[]args){print("hello","world");}}調(diào)用非法!4.3.2方法的覆蓋以下類B定義的方法中,方法覆蓋如何?classBextendsA{

protectedvoidtest(intx){

System.out.println("inB.test(int):"+x);

}

protectedvoidtest(Stringx,inty){

System.out.println("inB.test(String,int):"+x+","+y);

}

}【思考】通過子類B的對(duì)象可調(diào)用多少test方法?關(guān)于方法覆蓋有以下問題值得注意:

方法名、參數(shù)列表、返回類型完全相同才會(huì)產(chǎn)生方法覆蓋;如果返回類型不一樣編譯將報(bào)錯(cuò)。方法覆蓋不能改變方法的靜態(tài)與非靜態(tài)屬性。子類中不能將父類非靜態(tài)方法定義為靜態(tài)方法,反之也一樣。不允許子類中方法的訪問修飾符比父類有更多的限制。

例如:子類不能將父類的public方法定義為protected方法。但可以將父類的private方法在子類中重新定義為public方法.final方法不能被覆蓋。THIS---出現(xiàn)在類的實(shí)例方法或構(gòu)造方法中,用來代表使用該方法的對(duì)象(1)把當(dāng)前對(duì)象的引用作為參數(shù)傳遞給另一個(gè)方法。

如:obj.f(this)(2)可以調(diào)用當(dāng)前對(duì)象的其它方法或訪問當(dāng)前對(duì)象的實(shí)例變量。如:this.g();(3)使用this可以區(qū)分當(dāng)前作用域中同名的不同變量。

Stringx;//實(shí)例變量

publicTest(Stringx,inta){

this.x=x;

}(4)一個(gè)構(gòu)造方法中調(diào)用另一個(gè)構(gòu)造方法。

publicTest(finalintx){this(x,0);

}

(1)用SUPER訪問超類的變量或方法classparent{

inta=3;

voidf()

{

a=a+1;

}

}

publicclasssubclassextendsparent{

inta=6;

voidf(){

super.f();

a=a+super.a-3;

}64(2)調(diào)用超類的構(gòu)造方法publicclassgraduate_studentextendsStudent{DateenterDate;//入校時(shí)間

publicgraduate_student(Stringname,intage,Dated)

{

super(name,age);

enterDate=d;

}如果有super(),必須放在構(gòu)造方法的第一條語句

子類中調(diào)用方法的查找過程以及THIS和SUPER的用法【思考】如果graduate_student中無toString()方法,則this.toString()將會(huì)出現(xiàn)什么情況?

4.5

FINAL修飾符final作為類修飾符

----最終類(不能有子類)用final修飾方法----不能被子類重新定義用final定義常量----只能賦值一次注意:如果將引用類型的變量標(biāo)記為final,那么該變量固定指向一個(gè)對(duì)象,但可以改變對(duì)象內(nèi)的屬性值。例4-7常量賦值測試publicfinalclasstest{publicstaticinttotalNumber=5;

publicfinalintid;

publicintweight;publictest(intweight){id=totalNumber++;

this.weight=weight;}publicstaticvoidmain(Stringargs[]){

finaltestt=newtest(5);t=newtest(4);t.weight=t.weight+2;

}}4.6.1抽象類的定義abstractclass類名稱{

成員變量;方法(){……}//一般方法

abstract方法();//抽象方法}

在抽象類中可以包含一般方法和抽象方法。抽象類表示的是一個(gè)抽象概念,不能被實(shí)例化為對(duì)象。4.6.2抽象類的實(shí)現(xiàn)abstractclassAnimal{//抽象類

Stringname;

abstractpublicintgetLeg();//抽象方法}classDogextendsAnimal{intleg=4;publicDog(Stringn){name=n;}

publicintgetLeg(){returnleg;}}4.6.2抽象類的實(shí)現(xiàn)(續(xù)1)classFishextendsAnimal{publicFish(Stringn){name=n;}

publicintgetLeg(){return0;}}

4.6.2抽象類的實(shí)現(xiàn)(續(xù)2)publicclasstest{publicstaticvoidmain(Stringargs[]){

Animala[]=newAnimal[3];

a[0]=newDog("dog-A");a[1]=newFish(“fish-A");a[2]=newDog("dog-B");for(inti=0;i<3;i++){System.out.println(a[i].name+"has"+a[i].getLeg()+"legs");}}}4.7.1接口定義[public]interface接口名[extends父接口名列表]{[public][static][final]域類型域名=常量值;[public][abstract]返回值方法名(參數(shù)列表)[throw異常列表];}

聲明接口可給出訪問控制符;一個(gè)接口還可以繼承多個(gè)父接口,父接口間用逗號(hào)分隔。系統(tǒng)默認(rèn)接口中所有屬性的修飾都是publicstaticfinal;

系統(tǒng)默認(rèn)接口中所有方法的修飾都是publicabstract。

4.7.1接口定義舉例interfaceShape{voiddraw();//用于繪制形狀

doublearea();//用于求面積}4.7.2接口的實(shí)現(xiàn)abstract

publicclassRectangleimplementsShape{privatedoublex,y,w,h;publicRectangle(doublex,doubley,doublew,doubleh){this.x=x;this.y=y;this.w=w;this.h=h;}

publicdoublearea(){returnw*h;}

}有關(guān)接口的實(shí)現(xiàn),要注意以下問題

一個(gè)類可以實(shí)現(xiàn)多個(gè)接口。接口間用逗號(hào)分隔;如果實(shí)現(xiàn)某接口的類不是抽象類,則在類的定義部分必須實(shí)現(xiàn)指定接口的所有抽象方法;一個(gè)類在實(shí)現(xiàn)某接口的抽象方法時(shí),必須使用完全相同的方法頭;接口的抽象方法的訪問限制符默認(rèn)為public,在實(shí)現(xiàn)時(shí)要在方法頭中顯式地加上public修飾。例4-9接口應(yīng)用舉例interfaceStartStop{

voidstart();voidstop();}

classConferenceimplementsStartStop{publicvoidstart(){System.out.println("Starttheconference.");}publicvoidstop(){System.out.println("Stoptheconference.");}}例4-9接口應(yīng)用舉例(續(xù)1)classCarimplementsStartStop{publicvoidstart(){System.out.println("Insertkeyinignitionandturn.");}publicvoidstop(){System.out.println("Turnkeyinignitionandremove.");}}例4-9接口應(yīng)用舉例(續(xù)2)publicclassTestInterface{publicstaticvoidmain(String[]args){

StartStop[]ss={newCar(),newConference()};

for(inti=0;i<ss.length;i++){ss[i].start();ss[i].stop();}}}二義性問題interfaceFrob{floatv=2.0f;}//接口定義classParent{intv=3;}//父類定義classTestextendsParentimplementsFrob{publicstaticvoidmain(String[]args){newTest().printV();}voidprintV(){System.out.println((super.v

+Frob.v)/2);}}4-8JAVA泛型

---參數(shù)化類型

publicclassExample<T>{ //T為類型參數(shù)privateTobj;//定義泛型成員變量publicExample(Tobj){this.obj=obj;}publicTgetObj(){returnobj;}【例4-12】

【例4-12】續(xù)publicvoidshowType(){System.out.println("T的實(shí)際類型是:"+obj.getClass().getName());}publicstaticvoidmain(String[]args){Example<String>str=newExample<String>("Genericclassexample!");str.showType();Strings=str.getObj();System.out.println("value="+s);}}在實(shí)例化時(shí)確定類型泛型在使用中的規(guī)則和限制:(1)泛型的類型參數(shù)只能是類類型(包括自定義類),不能是簡單類型。(2)泛型的類型參數(shù)可以有多個(gè),如Map<K,V>。(3)泛型的參數(shù)類型可以使用extends語句。例如,<TextendsNumber>,extends并不代表繼承,它是類型范圍限制,表示T≤Number。(4)泛型的參數(shù)類型還可以是通配符類型。例如,ArrayList<?extendsNumber>,表示Number范圍的某個(gè)類型,其中,“?”代表未定類型。

(5)泛型的參數(shù)類型還可以使用super子句。例如,<?superT>,表示T或者T的父類型。

泛型方法:與其所在的類是否泛型沒有關(guān)系。

要定義泛型方法,只需將泛型參數(shù)列表置于返回值前。publicclassExampleA{public<T>voidf(Tx){System.out.println(x.getClass().getName());}publicstaticvoidmain(String[]args){ExampleAea=newExampleA();ea.f("");ea.f(10);}}java.lang.Stringjava.lang.Integer運(yùn)行結(jié)果CLASSEXAMPLE<T>{

PUBLICSTRINGADD(TA,TB){

RETURNA.TOSTRING()+B.TOSTRING();

}

}

PUBLICCLASSTEST{

PUBLICSTATICVOIDMAIN(STRING[]ARGS){

EXAMPLE<STRING>X=NEWEXAMPLE<STRING>();

SYSTEM.OUT.PRINTLN(X.ADD("123","543"));

EXAMPLE<INTEGER>Y=NEWEXAMPLE<INTEGER>();

SYSTEM.OUT.PRINTLN(Y.ADD(12,25));

}

}

寫出程序運(yùn)行結(jié)果123543

1225運(yùn)行結(jié)果4.8.2關(guān)于COMPARABLE<T>與COMPARATOR<T>接口Java提供了兩個(gè)接口定義對(duì)數(shù)組或集合中對(duì)象進(jìn)行排序,實(shí)現(xiàn)此接口的對(duì)象數(shù)組或列表可以通過Arrays.sort或Collections.sort進(jìn)行自動(dòng)排序。1.Comparable<T>接口Comparable<T>接口定義了如下方法:intcompareTo(Tobj);

功能是將當(dāng)前對(duì)象與參數(shù)obj進(jìn)行比較,在當(dāng)前對(duì)象小于、等于或大于指定對(duì)象obj時(shí),分別返回負(fù)整數(shù)、零或正整數(shù)?!纠?-13】讓USER對(duì)象按年齡排序publicclassUserimplementsComparable<User>{......//省略屬性、構(gòu)造方法、toString方法

publicintcompareTo(Userobj){ returnthis.age-obj.age; } publicstaticvoidmain(String[]args){ User[]users={newUser("張三",30),newUser("李四",20)};

Arrays.sort(users); for(inti=0;i<users.length;i++) System.out.println(users[i]); }}【運(yùn)行結(jié)果】李四:20張三:302.COMPARATOR<T>接口Comparator<T>接口中定義了如下方法:intcompare(Tobj1,Tobj2);

當(dāng)obj1小于、等于或大于obj2時(shí),分別返回負(fù)整數(shù)、零或正整數(shù)。Comparator接口可以看成一種對(duì)象比較算法的實(shí)現(xiàn),不妨稱為“比較算子”,它將算法和數(shù)據(jù)分離。Comparator接口常用于以下兩種環(huán)境:(1)類的設(shè)計(jì)師沒有考慮到比較問題,因而沒有實(shí)現(xiàn)Comparable接口,可以通過Comparator比較算子來實(shí)現(xiàn)排序而不必改變對(duì)象本身;(2)對(duì)象排序時(shí)要用多種排序標(biāo)準(zhǔn),比如升序、降序等,只要在執(zhí)行sort方法時(shí)用不同的Comparator比較算子就可適應(yīng)變化。假設(shè)User類沒有實(shí)現(xiàn)Comparable接口,可采用UserComparator比較算子提供的方法實(shí)現(xiàn)排序publicclassUserComparatorimplementsComparator<User>{

publicintcompare(Userobj1,Userobj2){ pareTo(); }

publicstaticvoidmain(String[]args){ User[]users={newUser("mary",25),newUser("John",40)};

Arrays.sort(users,newUserComparator());//用比較算子排序 for(inti=0;i<users.length;i++) System.out.println(users[i]); }}

4.9.1對(duì)象引用賦值轉(zhuǎn)換Objectx=newApple();Fruitm=newOrange();Applex=newFruit();

4.9.1對(duì)象引用賦值轉(zhuǎn)換在賦值時(shí)允許的轉(zhuǎn)換歸納如下:接口類型可轉(zhuǎn)換為父接口或Object類;類對(duì)象可以轉(zhuǎn)換為父類或該類實(shí)現(xiàn)了的接口類型;數(shù)組可以轉(zhuǎn)換為Object,也可轉(zhuǎn)換為Cloneable或Serializable接口。數(shù)組還可轉(zhuǎn)換為一個(gè)新數(shù)組,但舊數(shù)組的元素類型必須能夠允許轉(zhuǎn)換為新類型方可。4.9.2對(duì)象引用強(qiáng)制轉(zhuǎn)換將父類引用賦值給子類變量時(shí)要進(jìn)行強(qiáng)制轉(zhuǎn)換,這種強(qiáng)制轉(zhuǎn)換在編譯時(shí)總是認(rèn)可的,但運(yùn)行時(shí)的情況取決于對(duì)象的值

Friutx;Appley;Orangem,n;n=newOrange();x=n;m=(Orange)x;y=(Apple)x;例4-10一個(gè)簡單例子publicclassOuterOne{privateintx=3;

InnerOneino=newInnerOne();

publicclassInnerOne{//內(nèi)嵌類

privateinty=5;publicvoidinnerMethod(){System.out.println("yis"+y);}publicvoidinnerMethod2(){

System.out.println("x2is"+x);

}}

創(chuàng)建內(nèi)嵌類的對(duì)象作為外部類的一個(gè)屬性成員內(nèi)嵌類可以訪問外部類的成員例4-10一個(gè)簡單例子(續(xù))publicvoidOuterMethod(){System.out.println("xis"+x);

ino.innerMethod();

ino.innerMethod2();

}

publicstaticvoidmain(Stringarg[]){OuterOnemy=newOuterOne();

my.OuterMethod();

}}調(diào)用內(nèi)嵌類的方法有關(guān)說明內(nèi)嵌類經(jīng)過編譯后產(chǎn)生的字節(jié)碼文件名為:OuterOne$InnerOne.class在內(nèi)嵌類中可以訪問外層類的成員內(nèi)嵌類可以使用訪問控制符public、protected、private修飾

在外層類中訪問內(nèi)嵌類的方法方法1:在外層類的成員定義中創(chuàng)建內(nèi)嵌類的對(duì)象,例如:InnerOneino=newInnerOne();然后,在外層類中通過該成員變量ino訪問內(nèi)嵌類的方法方法2:在某個(gè)方法體中創(chuàng)建內(nèi)嵌類的對(duì)象,然后通過該對(duì)象訪問內(nèi)嵌類的成員.(更常見)如:publicvoidaccessInner(){

InneroneanInner=newInnerone();

anInner.innerMethod();}在MAIN方法中間接創(chuàng)建內(nèi)嵌類的對(duì)象在main方法中,要?jiǎng)?chuàng)建內(nèi)嵌類的對(duì)象必須先創(chuàng)建外層類對(duì)象,然后通過外層類對(duì)象創(chuàng)建內(nèi)嵌類對(duì)象。例如:publicstaticvoidmain(Stringarg[]){OuterOne.InnerOnei=newOuterOne().newInnerOne();i.innerMethod();}在內(nèi)嵌類中使用THIS---在內(nèi)嵌類中,THIS指內(nèi)嵌類的對(duì)象,要訪問外層類的當(dāng)前對(duì)象須加上外層類名作前綴publicclassA{privateintx=3;publicclassB{//內(nèi)嵌類

privateintx=5; publicvoidM(intx){System.out.println("x="+x); System.out.println("this.x="+this.x); System.out.println("A.this.x="+A.this.x);}}//內(nèi)嵌類結(jié)束內(nèi)嵌類對(duì)象外部類的當(dāng)前對(duì)象例4-12靜態(tài)內(nèi)嵌類舉例publicclassOutertwo{privatestaticintx=3;privateinty=5;

publicstaticclassInnertwo{//靜態(tài)內(nèi)嵌類

publicstaticvoidMethod(){

System.out.println("xis"+x);}

publicvoidMethod2(){

System.out.println("xis"+x);}}//內(nèi)嵌類結(jié)束

publicstaticvoidmain(Stringarg[]){Outertwo.Innertwo.Method();

newOutertwo.Innertwo().Method2();

}}方法中的內(nèi)嵌類(例4-13)publicclassOuterTwo{privateintx=3;publicvoidOuterMethod(intm){finalintn=x+2;

classInnerTwo{//方法內(nèi)的內(nèi)嵌類

privateinty=5;publicvoidinnerMethod(){System.out.println("yis"+y);System.out.println("nis"+n);System.out.println("xis"+x);}}//內(nèi)嵌類結(jié)束只能訪問外部方法中的常量(帶final修飾)方法中的內(nèi)嵌類(例4-13續(xù))InnerTwoin2=newInnerTwo();in2.innerMethod();

}

publicstaticvoidmain(Stringarg[]){OuterTwomy=newOuterTwo();my.OuterMethod(8);}}匿名內(nèi)嵌類interfacesample{voidtestMethod();}publicclassAnonymousInner{voidOuterMethod(){

newsample()

{

publicvoidtestMethod(){System.out.println("justtest");}}.testMethod();//調(diào)用內(nèi)嵌類中定義的方法

}---字節(jié)碼文件為AnonymousInner$1.class。如果有更多的匿名內(nèi)嵌類將按遞增序號(hào)命名由接口派生匿名內(nèi)嵌類,根據(jù)該內(nèi)嵌類創(chuàng)建對(duì)象例4-16方法的引用類型參數(shù)匹配處理publicclassA{

intx=0;voidtest(intx){

System.out.println("test(int):"+x);}

voidtest(Objectobj){

System.out.println("test(Object):"+obj);

}

voidtest(Stringstr){

System.out.println("test(String):"+str);

}publicstaticvoidmain(String[]args){

Aa1=newA();

a1.test("hello");a1.test(5);}}4.11LAMBDA表達(dá)式4.11.1何為Lambda(λ)表達(dá)式Lambda表達(dá)式是Java8的新特性。λ表達(dá)式的目標(biāo)類型是函數(shù)接口(functionalinterface),如果一個(gè)接口只有一個(gè)顯式聲明的抽象方法,那么它符合函數(shù)接口。一般用@FunctionalInterface注解標(biāo)注出來(也可以不標(biāo))。例如:@FunctionalInterfaceinterfaceA{publicintadd(inta,intb);}Lambda表達(dá)式本質(zhì)上是匿名方法。它由三部分組成:參數(shù)列表,箭頭(->),以及一個(gè)表達(dá)式或語句塊。不妨假設(shè)方法的具體實(shí)現(xiàn)如下:publicintadd(intx,inty){

returnx+y;

}如果用Lambda表達(dá)式來表示,則可以寫成:

(intx,inty)->{returnx+y;}甚至,參數(shù)類型也可以省略,編譯器會(huì)根據(jù)使用該表達(dá)式的上下文推斷參數(shù)類型。(x,y)->{returnx+y;}特別地,如果語句塊中僅僅是一條返回語句,則可以直接寫出表達(dá)式。(x,y)->x+y;關(guān)于Lambda表達(dá)式的表示,還有幾點(diǎn)值得注意:對(duì)于無參方法,左邊的小括號(hào)對(duì)代表沒有參數(shù)。對(duì)于沒有返回結(jié)果的void方法,不能省略右邊的大括號(hào)。例如,Runnable接口的run()方法,Lambda表達(dá)式表示如下:()->{…}如果只有一個(gè)參數(shù)的方法(比如ActionListener接口),則參數(shù)列表的括號(hào)可省略。e->{…}在Lambda表達(dá)式中與泛型相關(guān)的情形很多,根據(jù)泛型參數(shù)可推導(dǎo)出Lambda表達(dá)式

溫馨提示

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

最新文檔

評(píng)論

0/150

提交評(píng)論