




版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認領(lǐng)
文檔簡介
Java實用教程第4章面向?qū)ο蠡A(chǔ)(上)第
4
章面向?qū)ο蠡A(chǔ)4.1面向?qū)ο蟪绦蛟O(shè)計4.2類和對象4.3包4.4繼承4.5多態(tài)4.6特殊類4.7接口4.2類和對象Java語言與其他面向?qū)ο笳Z言一樣,引入了類和對象的概念,類是用來創(chuàng)建對象的模板,它包含被創(chuàng)建對象的屬性和方法的定義。因此,要學(xué)習(xí)Java編程就必須學(xué)會怎樣去編寫類,即怎樣用Java的語法去描述一類事物共有的屬性和行為。對象的屬性通過變量來刻畫,而對象的行為通過方法來體現(xiàn)。方法可以操作屬性形成一定的算法來實現(xiàn)一個具體的功能。類把屬性和方法封裝成一個整體。4.2.1定義類在Java語言中,類是基本的構(gòu)成要素,是對象的模板,Java程序中所有的對象都是由類創(chuàng)建的。一個Java類主要包括以下兩部分:類的聲明類的主體類的聲明在類聲明中,需要定義類的名稱、對該類的訪問權(quán)限、該類與其他類的關(guān)系等。類聲明的格式如下:[修飾符]用于指定類的訪問權(quán)限,可選值為public、abstract和final。類名用于指定類的名稱,類名必須是合法的Java標識符。一般情況下,要求首字母大寫。[extends父類]名用于指定要繼承參數(shù)。[implements接口列表]用于指定該類實現(xiàn)的所有接口。[修飾符]class<類名>[extends父類名][implements接口列表]{}權(quán)限:有public——公有類 無public——同包類 修飾:abstract:抽象類,只能被繼承 final:終極類,不能被繼承類的聲明類體類聲明部分大括號中的內(nèi)容為類體。類體主要由以下兩部分構(gòu)成:(1)成員變量的定義;(2)成員方法的定義。在程序設(shè)計過程中,編寫一個能完全描述客觀事物的類是不現(xiàn)實的。比如,構(gòu)建一個Apple類,該類可以擁有很多很多的屬性(即成員變量),在定義該類時,選取程序需要的必要屬性和行為就可以了。classperson{intage;voidshout(){
System.out.println(“oh,mygod!Myageis”+age);}}類體:person類4.2.2了解成員方法Java中類的行為由類的成員方法來實現(xiàn)。類的成員方法由方法聲明和方法體兩部分組成。其一般格式如下:[修飾符]用于指定方法的訪問權(quán)限,可選值為public、protected和private。方法返回值的類型用于指定該方法的返回值的類型,如果該方法沒有返回值,必須使用關(guān)鍵字void進行標識。方法返回值的類型可以是任何Java數(shù)據(jù)類型。[修飾符]<方法返回值的類型><方法名>([參數(shù)列表]){[方法體]}了解成員方法方法名用于指定成員方法的名稱,方法名必須是合法的Java標識符。[參數(shù)列表]用于指定方法中所需的參數(shù)。當存在多個參數(shù)時,各參數(shù)之間應(yīng)使用逗號分隔。方法的參數(shù)可以是任何Java數(shù)據(jù)類型。方法體是方法的實現(xiàn)部分,在方法體中可以完成指定的工作,可以只打印一句話,也可以省略方法體,使方法什么都不做。需要注意的是:當省略方法體時,其外面的大括號一定不能省略。【例4-1】實現(xiàn)兩數(shù)相加。4.2.3成員變量和局部變量在類體中所聲明的變量稱為類的成員變量,而在方法體中聲明的變量和方法的參數(shù)則稱為局部變量?,F(xiàn)在我們來看一下,如何聲明成員變量和局部變量,以及變量的有效范圍。聲明成員變量Java用成員變量來表示類的狀態(tài)和屬性,聲明成員變量的基本語法格式如下:修飾符:可選參數(shù),用于指定變量的被訪問權(quán)限,可選值為public、protected和private。static:可選,用于指定該成員變量為靜態(tài)變量,可以直接通過類名訪問。如果省略該關(guān)鍵字,則表示該成員變量為實例變量。final:可選,用于指定該成員變量為取值不會改變的常量。變量類型:必選:用于指定變量的數(shù)據(jù)類型,其值可以為Java中的任何一種數(shù)據(jù)類型。變量名:必選,用于指定成員變量的名稱,變量名必須是合法的Java標識符。[修飾符][static][final]<變量類型><變量名>;聲明成員變量例如,在類中聲明3個成員變量。publicclassApple{publicStringcolor; //聲明公共變量colorpublicstaticintcount; //聲明靜態(tài)變量countpublicfinalbooleanMATURE=true; //聲明常量MATURE并賦值publicstaticvoidmain(String[]args){
System.out.println(Apple.count);Appleapple=newApple();
System.out.println(apple.color);
System.out.println(apple.MATURE);}}聲明局部變量定義局部變量的基本語法格式同定義成員變量類似,所不同的不能使用權(quán)限修飾符和static關(guān)鍵字對局部變量進行修飾,但可以使用final關(guān)鍵字:final:可選,用于指定該局部變量為常量。變量類型:必選,用于指定變量的數(shù)據(jù)類型,其值可以為Java中的任何一種數(shù)據(jù)類型。變量名:必選,用于指定局部變量的名稱,變量名必須是合法的Java標識符。[final]<變量類型><變量名>;聲明局部變量例如,在grow()成員方法中聲明兩個局部變量。publicvoidgrow(){finalbooleanSTATE; //聲明常量STATE
intage; //聲明局部變量age}變量的有效范圍變量的有效范圍是指該變量在程序代碼中的作用區(qū)域,在該區(qū)域外不能直接訪問變量。有效范圍決定了變量的生命周期,變量的生命周期是指從聲明一個變量并分配內(nèi)存空間、使用變量,然后釋放該變量并清除所占用內(nèi)存空間的一個過程。進行變量聲明的位置,決定了變量的有效范圍,根據(jù)有效范圍的不同,可將變量分為以下兩種。(1)成員變量:在類中聲明,在整個類中有效。(2)局部變量:在方法內(nèi)或方法內(nèi)的復(fù)合代碼塊(“{”與“}”之間的代碼)中聲明的變量。在復(fù)合代碼塊聲明的變量,只在當前復(fù)合代碼塊中有效;在復(fù)合代碼塊外、方法內(nèi)聲明的變量在整個方法內(nèi)都有效。變量的有效范圍例如下面的實例:publicclassOlympics{privateint
medal_All=800; //成員變量
publicvoidChina(){
int
medal_CN=100; //方法的局部變量
if(medal_CN<1000){ //代碼塊
intgold=50; //代碼塊的局部變量
medal_CN+=50; //允許訪問
medal_All-=150; //允許訪問
}}}4.2.4構(gòu)造方法的概念及用途構(gòu)造方法是一種特殊的方法,它的名字必須與它所在類的名字完全相同,并且沒有返回值,也不需要使用關(guān)鍵字void進行標識。構(gòu)造方法用于對對象中的所有成員變量進行初始化,在創(chuàng)建對象時立即被調(diào)用?!纠?-2】publicclassPerson{publicPerson(){ //構(gòu)造方法
}}4.2.5
對象生命周期在Java語言中,把任何事物都看做對象,例如一個人、一個動物,或者沒有生命體的輪船、汽車、飛機,甚至概念性的抽象,例如公司業(yè)績。一個對象在Java語言中的生命周期包括3個階段:創(chuàng)建對象使用對象銷毀對象創(chuàng)建對象對象是類的實例。Java定義任何變量都需要指定變量類型,因此,在創(chuàng)建對象之前,一定要先聲明該對象。聲明對象的一般格式如下:類名:用于指定一個已經(jīng)定義的類。對象名:用于指定對象名稱,對象名必須是合法的Java標識符。例如聲明Apple類的一個對象redApple的代碼如下:類名對象名;AppleredApple;創(chuàng)建對象在聲明對象時,只是在內(nèi)存中為其建立一個引用,并置初值為null,表示不指向任何內(nèi)存空間。聲明對象以后,需要為對象分配內(nèi)存,這個過程也稱為實例化對象。在Java中使用關(guān)鍵字new來實例化對象,具體語法格式如下:對象名:必選,用于指定已經(jīng)聲明的對象名。類名:必選,用于指定構(gòu)造方法名,即類名,因為構(gòu)造方法與類名相同。參數(shù)列表:可選參數(shù),用于指定構(gòu)造方法的入口參數(shù)。如果構(gòu)造方法無參數(shù),則可以省略。對象名=new構(gòu)造方法名([參數(shù)列表]);創(chuàng)建對象在聲明Apple類的一個對象redApple后,可以通過以下代碼為對象redApple分配內(nèi)存(即創(chuàng)建該對象):在聲明對象時,也可以直接實例化該對象:這相當于同時執(zhí)行了對象聲明和創(chuàng)建對象:AppleredApple=newApple();redApple=newApple();AppleredApple;redApple=newApple();圖3-1對象產(chǎn)生時內(nèi)存狀態(tài)圖3-2語句:Personp1,p2;在內(nèi)存中產(chǎn)生的效果分布圖成員變量類型初始值byte0short0int
0long0Lfloat0.0Fdouble0.0Dchar
‘\u0000’(表示空)booleanfalseAllreferencetypenull
注意:當一個對象被創(chuàng)建時,會對其中各種類型的變量按下表自動進行初始化賦值
“==”:用于兩個變量的值是否相等equals()方法:用于比較兩個對象的內(nèi)容是否一致對象的比較classCompare{ publicstaticvoidmain(String[]args){ Stringstr1=newString("abc"); Stringstr2=newString("abc");Stringstr3=str1; if(str1==str2)System.out.println("str1==str2"); else System.out.println("str1!=str2"); if(str1==str3) System.out.println("str1==str3"); else System.out.println("str1!=str3"); }}例:運行結(jié)果:匿名對象創(chuàng)建完對象后,在調(diào)用該對象的方法時,可以不定義對象的句柄,而直接調(diào)用該對象的方法,這樣的對象叫匿名對象。如:
Personp1=newPerson();p1.shout();改為:
newPerson.shout();
1.如果對一個對象的方法只需一次調(diào)用,則可使用匿名對象2.將匿名對象作為實參傳遞給一個函數(shù)。如:
publicstaticvoidgetSomeOne(personp){...}
可以用下面的語句調(diào)用這個函數(shù):
getSomeOne(newperson());使用匿名對象有兩種情況:實現(xiàn)類的封裝性看下面的語句:
Personp1=newPerson();p1.age=-30;因為大家都可以訪問成員變量。這樣的語句會導(dǎo)致數(shù)據(jù)錯誤、混亂、或安全問題;因此,提出了私有變量的概念。classPerson{privateintage;voidshout(){
System.out.println(“oh,mygod!Myageis”+age);}}classTestPerson{publicstaticvoidmain(String
args[]){ newPerson().age=-30; }}再看下面的例子:
運行結(jié)果
為了實現(xiàn)良好的封裝性,通常將成員變量聲明為private類型,再通過public類型的方法來訪問該private類型的變量。對一個變量的操作一般有讀取和賦值操作,分別定義兩個方法來實現(xiàn):
getXxx()和setXxx()(Xxx是要訪問的成員變量的名字)(回憶一下怎樣在eclipse下自動生成getXxx()和setXxx())。
用上面的思想來修改Person類的代碼1.隱藏類的實現(xiàn)細節(jié)。2.讓使用者只能通過事先定制好的方法來訪問數(shù)據(jù),可以方便的加入邏輯控制,限制對屬性的不合理操作。3.便于修改,增強代碼的可維護性。4.可進行數(shù)據(jù)的檢查。
實現(xiàn)類的封裝可達到如下目的:
七.成員權(quán)限(數(shù)據(jù)成員,方法成員)
本類同包類非同包子類非同包非子類public√√√√protected√√√
(default)√√
private√
數(shù)據(jù)成員[權(quán)限][修飾]類型變量名[=初值];修飾符:
1)static有:類變量(類名.變量名,對象名.變量名) 無:實例變量(對象名.變量名)2)final用于修飾常量
publicstaticfinalintN=5;類的使用
1.方法重載特點:
1)在同一個類中
2)方法名相同
3)參數(shù)的個數(shù)或類型不同注:只有返回值類型不同,不叫方法重載,編譯時會報錯。方法名與類名相同一般選擇public訪問權(quán)限不能有任何修飾(包括void)無返回值類型構(gòu)造方法
3.構(gòu)造方法的重載classA{int
i,j;publicA(){i=0;j=0;}publicA(inti1,intj1){i=i1;j=j1;}publicA(intk){i=k;j=k;}}classPerson{privateStringname="unknown";privateintage=-1;publicPerson(){System.out.println("constructor1iscalling");}publicPerson(Stringn){name=n;System.out.println("constructor2iscalling");
System.out.println("nameis"+name);}
publicPerson(String
n,inta){name=n;age=a;System.out.println("constructor3iscalling");
System.out.println("nameandageis"+name+";"+age);}publicvoidshout(){
System.out.println("listentome!!");}}classTestPerson{ publicstaticvoidmain(String[]args) { Personp1=newPerson(); P1.shout(); Personp2=newPerson("Jack"); P2.shout(); Personp3=newPerson("Tom",18); P3.shout(); }}
對于下列語句,我們分析一下它的執(zhí)行過程
Personp3=newPerson("Tom",18);
首先,賦值符號左邊定義了一個Person類型的引用變量p3,賦值符號右邊用new關(guān)鍵字創(chuàng)建了一個Person類的實例對象,對象在內(nèi)存中的分布如圖3-4所示。構(gòu)造方法的執(zhí)行過程圖3-4內(nèi)存分布圖接著調(diào)用相應(yīng)的構(gòu)造方法,構(gòu)造方法接受外部傳入的姓名和年齡,在執(zhí)行構(gòu)造方法中的代碼之前,進行屬性的顯式初始化,也就是執(zhí)行在定義成員變量時就對其進行的賦值語句,即程序Person類中的:privateStringname=“unknown”;privateintage=-1;
對象在內(nèi)存中的分布如圖3-5所示。步驟一圖3-5對象在內(nèi)存中的分布圖然后,執(zhí)行構(gòu)造方法中的代碼,用外部接收到的姓名和年齡對成員變量重新賦值,對象在內(nèi)存中的分布如圖3-6所示。步驟二圖3-6對象在內(nèi)存中的分布圖最后,把剛剛創(chuàng)建的對象賦值給引用變量如圖3-7所示。步驟三圖3-7對象在內(nèi)存中的分布注意:創(chuàng)建對象時必須調(diào)用構(gòu)造方法沒有構(gòu)造方法時,系統(tǒng)提供缺省的無參構(gòu)造方法自定義構(gòu)造方法后,缺省的構(gòu)造方法立即失效不能在構(gòu)造方法中對static型常量進行初始化1.分配空間2.初始化構(gòu)造函數(shù)對數(shù)據(jù)完成兩個功能this引用句柄
看下面代碼:
classA{Stringname;publicA(Stringx){name=x; }publicvoidfunc1(){System.out.println("func1of"+name+"iscalling");}publicvoidfunc2(){Aa2=newA("a2");a2.func1();}}
classTestA{ publicstaticvoidmain(String[]args){ Aa1=newA("a1"); a1.func2(); }}
上面的程序中共產(chǎn)生了兩個類A的實例對象,在a1的func2中調(diào)用了a2的func1,想想如何在func2中引用另外一個對象的成員?其在內(nèi)存中如何分布?圖3-8func2運行期間內(nèi)存狀態(tài)classA{Stringname; publicA(Stringx){name=x;}publicvoidfunc1(){System.out.println("func1of"+name+"iscalling");} publicvoidfunc2(){Aa2=newA("a2"); this.func1();//使用this關(guān)鍵字調(diào)用func1方法
a2.func1(); }}用關(guān)鍵字this,修改類A思考題1.如果func2方法被調(diào)用,是不是一定要以“對象.func2()”的形式進行?2.能不能在func2內(nèi)部引用那個“事先存在并對func2()方法進行調(diào)用的對象呢”?答案:那是肯定的。一定是事先已經(jīng)有了一個存在的對象,func2()作為那個對象的方法使用。答案:對于一個方法來講,只要是對象都可以使用,它根本就不區(qū)分是不是自己所屬的對象??偨Y(jié)每個成員方法內(nèi)部,都有一個this引用變量,指向調(diào)用這個方法的對象,相當于“我所屬的對象”。點取成員作為方法名表示構(gòu)造方法publicclassBookextendsItem{privateStringisbn;
public
Book(finalStringtitle,finalStringisbn,finalfloatlistPrice){
this(title,listPrice);//CallstheconstructorofItem.
this.isbn=isbn; }public
Book(finalStringtitle,finalfloatlistPrice){
super(title,listPrice);//CallstheconstructorofItem.}publicStringgetIsbn(){ returnisbn; } publicStringgetName(){returntitle;} }構(gòu)造方法的重載函數(shù)的參數(shù)傳遞(1)基本數(shù)據(jù)類型的參數(shù)傳遞
形式參數(shù)相當于方法中定義的局部變量,方法調(diào)用結(jié)束時也就被釋放了,不會影響到主程序中的同名變量,看下面代碼:classPassValue{ publicstaticvoidmain(String[]args) {
intx=5;
change(x);
System.out.println(x); } publicstaticvoidchange(intx) { x=3; }}圖3-9change方法被調(diào)用時內(nèi)存狀況1change方法被調(diào)用時,定義了一個名為x的變量,它只在change方法中有效圖3-10change方法被調(diào)用時內(nèi)存狀況2
取出main()方法中的x值,賦值給change()方法中的x圖3-11change方法被調(diào)用時內(nèi)存狀況3
改變change()方法中的x圖3-12change方法調(diào)用結(jié)束時內(nèi)存狀況3change()方法調(diào)用結(jié)束時,change()方法中的x所占據(jù)的內(nèi)存被釋放(2)引用數(shù)據(jù)類型的參數(shù)傳遞
對象引用變量并不是對象本身,它們只是對象的句柄(名稱)。就象一個人有多個名字一樣(如英文名、筆名等),一個對象可以有多個句柄??聪旅娲a:classPassRef{
intx; publicstaticvoidmain(String[]args) {
PassRef
obj=newPassRef();
obj.x=5;
change(obj);
System.out.println(obj.x); } publicstaticvoidchange(PassRef
obj) {
obj.x=3; }}圖3-13main()方法中的obj指向的對象的內(nèi)容圖3-14main()方法和change()方法中obj及其所指對象內(nèi)存狀況圖
把main()方法中的obj的值賦值給change()方法中的obj,使其指向同一內(nèi)容。圖3-15main()方法和change()方法中obj及其所指對象內(nèi)存狀況圖
通過change()方法中的obj引用而改變內(nèi)存中對象的內(nèi)容。圖3-16main()方法中obj及其所指對象內(nèi)存狀況圖
change()方法調(diào)用結(jié)束后,change中的obj變量被釋放,但堆內(nèi)存中的對象仍然被main()方法中的obj引用,可以看到main()方法中的obj所引用的對象的內(nèi)容被改變。static關(guān)鍵字
類變量(對象共享)
static類方法
static塊
注:(1).只能修飾成員,不能修飾方法變量 (2).靜態(tài)方法不能被覆蓋
1.靜態(tài)變量
當程序員編寫一個類時,其實是在描述其對象的屬性和行為,并沒有產(chǎn)生實質(zhì)上的對象,只有通過new關(guān)鍵字才會產(chǎn)生出對象,這時系統(tǒng)才分配內(nèi)存空間給對象,其方法才可以供外部調(diào)用。有的時候我們希望無論是否產(chǎn)生了對象或產(chǎn)生了多少對象的情況下,某些特定的數(shù)據(jù)在內(nèi)存空間里只由一份,如所以中國人都有國家名稱,每一個中國人都共享這個國家名稱。不必在每一個中國人的實例對象中都單獨分配一個代表國家名稱的變量。如圖3-17所示。圖3-17
雖然在各個實例對象中沒有分配country這個變量,但我們可以通過中國人的實例對象來訪問這個變量,要實現(xiàn)這個效果,只需在類中定義的country變量前加static關(guān)鍵字即可,我們稱這種變量為靜態(tài)變量。也可以通過類名來訪問這個變量,還可以在類的非靜態(tài)成員方法中象訪問其它非靜態(tài)成員變量一樣訪問這個靜態(tài)變量。靜態(tài)變量在某種程度上與其它語言全局變量向類似,如不是私有的就可以在類的外部訪問,此時不需要產(chǎn)生類的實例對象,只需要類名即可。classChinese{staticStringcountry="中國";Stringname;
intage;voidsingOurCountry(){
System.out.println("??!,親愛的"+country); //類中的成員方法也可以直接訪問靜態(tài)成員變量
}}classTestChinese{publicStaticvoidmain(String[]args){
System.out.println("Chinesecountryis"+Chinese.country); //上面的程序代碼直接使用了"類名.成員"的格式
Chinesech1=newChinese();
System.out.println("Chinescountryis"+ch1.country); //上面的程序代碼直接使用了"對象名.成員"的格式
ch1.singOurCountry();}}運行結(jié)果:
2.靜態(tài)方法
我們有的時候希望不必創(chuàng)建對象就可以調(diào)用某個方法,換句話說也就是使該方法不必和對象綁在一起。要實現(xiàn)這樣的效果,只需在類中定義的方法前加上static關(guān)鍵字即可。同靜態(tài)成員變量一樣,可以使用類名直接訪問靜態(tài)成員方法,也可以使用類的實例對象來訪問靜態(tài)成員方法,還可以在非靜態(tài)成員方法中訪問靜態(tài)成員方法。在使用類的靜態(tài)方法時,要注意一下幾點:(1)在靜態(tài)方法中只能直接調(diào)用同類中其它的靜態(tài)成員(靜態(tài)變量和靜態(tài)方法),而不能直接訪問類中的非靜態(tài)成員。非靜態(tài)的方法和變量,需要先創(chuàng)建類的實例對象后才可使用,而靜態(tài)方法在使用前不用創(chuàng)建任何對象。
(2)靜態(tài)方法不能以任何方式引用this和super關(guān)鍵字。因為當靜態(tài)方法被使用時,this所引用的對象根本沒有產(chǎn)生。
(3)main()方法是靜態(tài)的,因此,JVM在執(zhí)行main()方法時不創(chuàng)建main()方法所在的類的實例對象,因而在main()方法中,不能訪問該類的非靜態(tài)成員,必須創(chuàng)建該類的一個實例對象后,才能通過這個對象訪問類中的非靜態(tài)成員。3.靜態(tài)代碼塊
一個類中可以使用不包含在任何方法體中的靜態(tài)代碼塊(staticblock),當類被裝載時,靜態(tài)代碼塊被執(zhí)行,且只被執(zhí)行一次。靜態(tài)代碼塊常被用來進行類屬性的初始化。看如下代碼:classStaticCode{staticStringcountry;static{ country="china";
System.out.println("StaticCodeisloading");}}classTestStaticCode{static{
System.out.println("TestStaticCodeisloading");}publicstaticvoidmain(String[]args){
System.out.println("beginexecutingmainmethod"); newStaticCode(); newStaticCode();}}運行結(jié)果:
類StaticCode中的靜態(tài)代碼塊被自動執(zhí)行,盡管產(chǎn)生了兩個類StaticCode的實例對象,但其中的靜態(tài)代碼塊只被執(zhí)行了一次。上面的例子也反過來說明,當一個程序用到其它的類,才會去裝載那個類。由此可以得出結(jié)論:類是在第一次使用時才被裝載,而不是在程序啟動時就裝載程序中用到的所有類。結(jié)論十.理解main()方法的語法
由于java虛擬機需要調(diào)用類的main()方法,所以該方法的訪問權(quán)限必須是public,又因為java虛擬機在執(zhí)行main()方法時不必創(chuàng)建對象,所以該方法必須是static,該方法接收String類型的數(shù)組參數(shù),該數(shù)組中保存執(zhí)行java命令時傳遞給所運行的類的參數(shù)。
publicclassTestMain{ publicstaticvoidmain(String[]args) { for(inti=0;i<args.length;i++)
System.out.println(args[i]); }}看如下代碼:
args數(shù)組中的元素的個數(shù)就是命令行中給類傳遞的參數(shù)的個數(shù),參數(shù)之間用空格隔開,如果一個參數(shù)中有空格,將這個參數(shù)用(“)隔開。運行結(jié)果
在一個類的內(nèi)部定義的類,稱為嵌套類(nestedclass),嵌套類可以訪問嵌套它的類的成員,包括private成員,但是,嵌套類的成員卻不能被嵌套它的類直接訪問。在類中定義的嵌套類的使用范圍,僅限于這個類的內(nèi)部,如A類里邊定義了一個B類,那么B為為A所知,卻不被A的外面所知,和外部類不同的是,內(nèi)部類可以聲明為private或protected。
內(nèi)部類(innerclass)1.
內(nèi)部類可以作為外部類的成員,內(nèi)部類可以互相調(diào)用,注意內(nèi)外部類不能同名
classA{classB{}classC{}}2.內(nèi)部類特性:(1).內(nèi)部類可以定義在方法中,但只能使用方法中的final常量
(2).可以被定義為abstract抽象類
(3).內(nèi)部類不能聲明任何static成員編譯后:A.class
A$B.class
A$C.class
classOuter{
int
outer_i=100;voidtest(){Innerin=newInner();
in.display();}classInner{voiddisplay(){
System.out.println("display:outer_i="+outer_i);}}}classInnerClassDemo{publicstaticvoidmain(String[]args){ Outerouter=newOuter();
outer.test();}}運行結(jié)果
在內(nèi)部類對象中保存了一個對外部類對象的引用,當在內(nèi)部類的成員方法中訪問某一變量時,如在該方法和內(nèi)部類中沒有定義過該變量,調(diào)用就會傳遞給內(nèi)部類中保存的那個外部類對象的引用,通過那個外部類對象的引用去調(diào)用這個變量,在內(nèi)部類中調(diào)用外部類的方法也是同樣的道理。一個內(nèi)部類可以訪問它的外部類的成員,但反過來就不成立。小結(jié)一publicclassOuter{
int
outer_i=100;voidtest(){Innerin=newInner();
in.display();}classInner{
inty=10;voiddisplay(){
System.out.println("display:outer_i="+outer_i);}
}
voidshowy(){
System.out.println(y);}}
運行結(jié)果如果用static修飾一個內(nèi)部類,這個類就相當于是一個外部定義的類:所以static修飾的內(nèi)部類中可以聲明static成員,但非static的內(nèi)部類中的成員是不可以用static修飾的。用static修飾的內(nèi)部類是不能使用外部類封裝的非static成員的。小結(jié)二classOuter{
int
outer_i=100;voidtest(){Innerin=newInner();
in.display();}staticclassInner{voiddisplay(){
System.out.println("display:outer_i="+outer_i);}}}把上面的程序中的Inner內(nèi)部類聲明為static,看看會出現(xiàn)什么錯誤?運行結(jié)果3.內(nèi)部類如何被外部類引用?(1)內(nèi)部類可以通過創(chuàng)建對象從外部類之外被調(diào)用,只要將內(nèi)部類聲明為public即可。
(2)下面的程序中,內(nèi)部類被聲明為public,在外部就可以創(chuàng)建其外部類Outer的實例對象,再通過Outer類的實例對象創(chuàng)建Inner類的對象,使用Inner類的對象來訪問Inner中的方法。classOuter{privateintsize=10;classInner{publicvoiddoStuff(){
System.out.println(++size);}}}classTestInner{ publicstaticvoidmain(String[]args) { Outerouter=newOuter();
Outer.Innerin=outer.newInner();
in.doStuff(); }}4.本地類
本地類(Localclass)是定義在代碼塊中的類.它們只在定義它們的代碼塊中是可見的.本地類與本地變量類似—它們被定義在使用它們的地方.本地類有兩個重要特性:
(1)它們僅在定義了它們的代碼塊中是可見的.(2)它可以使用定義它們的代碼塊中的final常量.例:publicclassTopClass{publicvoidmethodA(){classLocalClass{……}……}……}注:1.LocalClass類只能在methodA中可見;2.LocalClass可以訪問TopClass類的任何final常量;3.本地類中不能包含任何靜態(tài)的變量、方法或類。classInOut{ Stringstr=newString("Hello"); publicvoidamethod(final
int
iArgs){
int
aVar; classBicycle{publicvoidsayHello(){
System.out.println(str);
System.out.println(iArgs); } } Bicyclebi=newBicycle();
bi.sayHello();}}publicclassInnerTest{ publicstaticvoidmain(String[]args) {
InOut
iot=newInOut(); iot.amethod(20); //System.out.println("HelloWorld!"); }}運行結(jié)果十二使用java的文檔注釋1.注釋
//單行注釋
/*單、多行注釋*//**文檔注釋*/(放在變量、方法、類的前面,通過javadoc命令自動被包含在所產(chǎn)生的HTML文檔中)importjava.io.*;/***Title:engineer
類<br>*Description:通過engineer類來說明java文檔注釋*copyright:(c)2006<br>*company:sun公司*@authorBill.Gates*@version1.00*/publicclassengineer{publicStringEngineer_name;
/***這是一個engineer對象的構(gòu)造函數(shù)*@paramnameengineer的名字*/publicengineer(Stringname){}/***這是repair方法的說明*@paramsum需要修理的機器總數(shù) *@param
alltime
需要修理的總時間*/publicint
repairing(int
sum,int
alltime){//進行修理操作
returnsum;}}@author<作者姓名>
用于java類說明,表示這個java程序的作者@version<版本信息>
用于java類說明,表示這個java程序的的開發(fā)版本@param<參數(shù)名稱><參數(shù)說明>
用于方法的說明,表示方法引入的參數(shù),及其參數(shù)對應(yīng)的說明@return<返回值說明><br>表示回車換行,而帶@標志的屬性會自動換行不需要<br>標簽運行結(jié)果課件制作人:XXX銷毀對象在許多程序設(shè)計語言中,需要手動釋放對象所占用的內(nèi)存,但是,在Java中則不需要手動完成這項工作。Java提供的垃圾回收機制可以自動判斷對象
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 員工銷售提成合同范本
- 嘉寶莉漆供銷 合同范本
- 與農(nóng)戶合同范例
- 商鋪銷售認購合同范例
- 合作合同范例落款
- 商品代銷售合同范本
- 住建委建房合同范本
- 廠家涂料銷售合同范本
- 商鋪房屋轉(zhuǎn)讓合同范本
- 商鋪閣樓轉(zhuǎn)讓合同范本
- 2023年省機場管理集團有限公司招聘模擬預(yù)測(共1000題)筆試備考題庫及答案解析
- GHS化學(xué)品(含危險品)標簽標志與象形符號
- GB/T 24474.1-2020乘運質(zhì)量測量第1部分:電梯
- FZ/T 24011-2019羊絨機織圍巾、披肩
- 【課件】2.1.1植物細胞工程的基本技術(shù)課件-2021-2022學(xué)年高二下學(xué)期生物人教版選擇性必修3
- 35kV集電線路直埋施工組織設(shè)計方案
- 客戶來訪登記表
- 日產(chǎn)新軒逸電子手冊cvt
- 大連市小升初手冊
- 醫(yī)療垃圾管理及手衛(wèi)生培訓(xùn)PPT課件
- 嚇數(shù)基礎(chǔ)知識共20
評論
0/150
提交評論