




版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領
文檔簡介
第三章面向對象高級特性本章要點類的繼承繼承的規則子類的構造方法方法的覆蓋final關鍵字接口接口的規范引用數據類型的轉換多態Java中的包包和訪問權限修飾符類的封裝和內部類主要內容類的繼承1接口2Java中的包3類的封裝和內部類4類的繼承類的繼承在Java中定義一個類時,讓該類通過關鍵字extends繼承一個已有的類,這就是類的繼承被繼承的類稱為父類(超類,基類),新的類稱為子類(派生類)。子類繼承父類的所有屬性和方法,同時也可以增加自己的屬性和方法。使用繼承假如你在為某個公司做一個企業管理軟件,來管理企業的雇員,比如:
工人(Worker)有姓名、出生日期和薪酬屬性,需要獲得名字、年齡、薪酬和服裝津貼;
主任(Officer)同樣包含姓名、出生日期和薪酬屬性,另外還有一個department(他所管理的部門),同樣他也有獲得姓名、年齡和薪酬的方法,還有一個獲得交通補助的方法。你怎么做?繼承是利用現有的類創建新類的過程,現有的類稱作基類(或父類),創建的新類稱作派生類(子類)。Java中所有的類都是通過直接或間接地繼承java.lang.Object類得到的。在Java中定義一個類時,讓該類通過關鍵字extends繼承一個已有的類,這就是類的繼承基類方法和屬性派生類基類方法+
附加方法類的繼承繼承的語法
示例Employee.java
Worker.java
[修飾符]class子類名extends
父類名類的繼承繼承的語法?練習Officer.javaTestOfficer.java用java中類的繼承機制,實現Officer類,并設計一個測試程序TestOfficer類,來訪問Officer類繼承的好處實現類的重用易維護類的繼承繼承的規則Java中只支持單繼承,也就是說每個類只能有一個父類,不允許有多重繼承一個父類可以有多個子類子類繼承父類所有的屬性和方法,但不繼承父類的構造方法
示例
TestWorker.java類的繼承子類的構造方法—
子類不能繼承父類的構造方法使用默認的構造方法在子類中的創建構造方法示例
Worker.java在子類中創建構造方法時,必須調用父類的構造方法子類可以在自己的構造方法中使用super關鍵字來調用父類的構造方法如果使用super關鍵字調用父類構造方法,必須寫在該子類構造方法的第一行如調用的是父類中無參的構造方法,則可以不寫super()如果子類中調用了父類無參的構造方法,而父類中沒有無參構造方法則系統編譯出錯super(參數1,參數2,…);案例classPoint{//定義"點"類
//x軸坐標和y軸坐標,由于準備用于繼承,故修飾為protected
protected
floatmX,mY;
publicPoint(floatx,floaty){//構造方法
mX=x;mY=y;}}classCircleextendsPoint{//定義"圓"類繼承于"點"類
protected
floatmRadius;//半徑
publicCircle(floatr){//構造方法
mRadius=r;}}public
classDemo{
public
static
voidmain(String[]args){Circlec=newCircle(2.5f);//實例化"圓"類對象
}}本例將報出錯誤構造方法的執行順序當實例化子類的對象時,必須先執行父類的構造方法,然后再執行子類的構造方法;如果父類還有更上級的父類,就會先調用最高父類的構造方法,再逐個依次地將所有繼承關系的父類構造方法全部執行;如果父類的構造方法執行失敗,那么子類的對象也將無法實例化。super關鍵字調用父類的方法publicclassSoftwareTeacherextendsTeacher{publicSoftwareTeacher
(StringmyName,StringmyCenter){super(myName,myCenter);}}子類的構造方法中,通過super關鍵字調用父類的構造方法方法重寫后,通過super關鍵字調用父類的普通方法publicclassSoftwareTeacher
extendsTeacher{publicvoidgiveLesson(){System.out.println("使用電腦授課");super.giveLesson();}}通過調用父類的構造方法,完成對屬性值的初始化通過調用父類的普通方法,完成部分功能super總結調用父類的構造函數super(parametersopt)調用父類的構造函數。必須是子類構造函數的第一條語句。如果子類中沒有顯式地調用父類的構造函數,那么將自動調用父類不帶參數的構造函數。父類的構造函數在子類構造函數之前執行。調用父類的成員super.datasuper.method(parameters)類的繼承給定以下代碼:下列描述哪些是正確的_____?A.編譯失敗B.代碼正常運行
C.在第7行拋出異常D.在第2行拋出異常答案:A類的繼承?練習Officer.java在Officer類中,創建一個構造方法,要求在調用該構造方法時,可以對name、birth、salary、department屬性賦初值類的繼承方法的覆蓋(override)
重寫(rewrite)對從父類中繼承來的方法進行改造在子類繼承父類時發生示例TestOffice_1.java方法覆蓋的規則在子類中的覆蓋方法與父類中被覆蓋的方法應具有相同的方法名相同的參數列表(參數數量、參數類型、參數順序都要相同)相同的返回值類型子類覆蓋方法的訪問權限要不小于父類中被覆蓋方法的訪問權限
類的繼承?練習給定類,在其子類中下列哪些覆蓋方法可以正確的聲明_____classA{intmethod1(inta,doubleb){return0;}A.
intmethod1(inta,doubleb){return1;}B.
intmethod1(inta,longb){return1;}C.intmethod1(intb,doublea){return1;}D.
shortmethod1(inta,doubleb){return1:}E.
intmethod1(doubleb,inta){return1;}
答案:AC類的繼承?練習給定下列代碼:當在第6行加入什么方法時會引起編譯錯誤?答案:B方法覆蓋注意僅當方法是可訪問的實例方法時,才能被覆蓋,即私有方法不能被覆蓋。靜態方法不能被覆蓋,如果靜態方法在子類中重新定義,那么父類方法將被隱藏。一旦父類中的方法被覆蓋,則不能從子類外部訪問被覆蓋的方法。在子類中可以使用super引用被覆蓋的方法。重寫(覆蓋)與重載方法的重載:定義有相同名字,但參數不同的多個方法構成重載方法的重寫:方法的重寫必須和被重寫的方法具有相同的名字,參數,返回值類型。構造方法也可以重載。類的繼承final關鍵字final可以修飾的元素:類:不能被繼承變量(屬性和局部變量):不能被重新賦值在聲明的同時賦值系統不會對final屬性默認的賦初始值方法:不能在子類中被覆蓋,即不能修改。
1.final修飾成員變量final修飾變量,則成為常量,例如
finaltypevariableName;修飾成員變量時,定義時同時給出初始值,而修飾局部變量時不做要求。
2.final修飾成員方法final修飾方法,則該方法不能被子類重寫。finalreturnTypemethodName(paramList){…}3.final類final修飾類,則類不能被繼承。如果一個類被final關鍵字修飾,說明這個類不能再被其他類所繼承,該類被稱為最終類。
finalclassfinalClassName{
…
}
在默認情況下,所有的成員變量或成員方法都可以被隱藏或重寫,如果父類的成員不希望被子類的成員所隱藏或重寫則將其聲明為final。classep4_12_a{ staticfinaldoublepi=3.1415926;//聲明靜態常量
publicfinalvoidf(){//聲明最終方法
System.out.println("pi="+pi); }}classep4_12_bextendsep4_12_a{ intnum=100; privatevoidf(){//出錯,不可覆蓋父類的最終方法
System.out.println("num="+num); }}classep4_12{ publicstaticvoidmain(Stringargs[]){ ep4_12_bOne=newep4_12_b(); One.f(); }}練習?練習Shape.javaRect.javaCircle.javaSquare.javaTestShape.java設計一個形狀類:屬性:周長和面積;方法:求周長和求面積形狀類的子類:Rect(矩形),Circle(圓形)Rect類的子類:Square(正方形)不同的子類會有不同的構造方法及計算周長和面積的方法寫一個測試類,在main方法中創建三個不同的形狀對象,放在Shape類型的數組里,分別打印出每個對象的周長和面積Contents類的繼承1接口2Java中的包3類的封裝和內部類4接口(interface)抽象方法只有方法聲明,沒有方法實現的方法[訪問權限修飾符]abstract返回值類型
抽象方法名(參數列表);classA{
abstractintmethod1(inta,intb);}構造方法、靜態方法、私有方法、final方法不能被聲明為抽象的方法。接口(interface)抽象類抽象類是抽象方法和非抽象方法的集合特殊情況全部是抽象方法全部為非抽象方法[訪問權限修飾符]abstractclass類名{……}
abtractclassA{Stringname;
abstractintmethod1(inta,intb);
voidsayHi(){System.out.println(“Hello!”);}接口(interface)抽象類注意:抽象類不能被實例化;其包含的抽象方法必須在其子類中被實現,否則該子類只能聲明為abstract;抽象方法不能為static;如果從一個抽象類繼承,并想創建該新類的對象,那么我們就必須為基類中的所有抽象方法提供方法定義。在下列情況下,一個類必須聲明為抽象類:
當一個類的一個或多個方法是抽象方法時;當類是一個抽象類的子類,并且沒有實現父類的所有抽象方法,即只實現部分;當一個類實現一個接口,并且不能為全部抽象方法都提供實現時;抽象類的使用——創建抽象類的對象創建抽象類的對象–擴展抽象類,實現其所有抽象方法–創建該抽象類子類的對象31抽象類例子publicclassCircleextendsShape{publicvoiddraw(){System.out.println("drawacircle....");}}TestShape.javapublicstaticvoidmain(String[]args){
//Shapeshape=newShape();//error,shape是一個抽象類
Shapeshape=newCircle();shape.draw();System.out.println(shape.getArea());}32publicabstractclassShape{/**畫出自己*/
publicabstractvoiddraw();/**得到面積*/publicdoublegetArea(){return100.0;}}可行嗎?接口(interface)?練習給定以下代碼:
執行下列哪些操作后,可以讓代碼通過編譯?對methodA方法添加方法體將5~7行,用“;”代替刪除class前的abstract關鍵字刪除methodA方法前的abstract關鍵字刪除methodB方法前的abstract關鍵字答案:BE接口(interface)?練習Animal.javaFish.java按下面的類圖,創建一個抽象類,該抽象類有字符串類型的eyecolor屬性抽象方法stayIn,返回值類型為void方法showEye,返回值類型String接口(interface)接口的聲明接口是一種特殊的抽象類,這種抽象類中只包含常量和抽象方法,而沒有變量和方法的實現接口的成員:常量(字段)抽象方法[訪問權限修飾符]interface接口名
{
接口的成員}接口(interface)接口的聲明注意:接口不是一個類,沒有構造方法,不能被實例化接口使用interface關鍵字來定義,而不是class接口默認:常量:publicstaticfinal抽象方法:publicabstractinterfaceRunnable{publicabstractvoidrun();}接口(interface)?練習給定以下代碼:下列選項中,哪些選項可以用來替代第2行代碼?finalintk=4;Publicintk=4;Staticintk=4;Privateintk=4;Abstractintk=4;答案:ABC接口(interface)?練習
下列選項中,哪些可以定義在一個接口中?答案:AB接口(interface)?練習VideoDevice.javaAudioDevice.java定義一個接口VideoDevice,表示可視設備,該接口中有:MIN_BRITGHTNESS常量,其值為10,表示最小亮度打開方法:turnOn()關閉方法:turnOff()定義一個接口AudioDevice,表示可視設備,該接口中有:MIN_VOLUME常量,其值為5,表示最小音量打開方法:turnOn()關閉方法:turnOff()調節音量方法:turnVolume(intvolume)接口(interface)extendsinterfaceAextendsB{}interfaceinterfaceinterfaceextendsinterfaceAextendsB,C,D
{}interfaceextends
擴展接口(接口的繼承)接口(interface)類實現接口—implements為了使用一個接口,你要編寫實現接口的類如果一個類要實現一個接口,那么這個類就必須實現接口中所有抽象方法。否則這個類只能聲明為抽象類多個無關的類可以實現一個接口,一個類可以實現多個無關的接口一個類可以在繼承一個父類的同時,實現一個或多個接口接口(interface)
?練習
Runnable.javaBird.javaFlyable.java根據以下類圖實現Runnable接口和Fylable接口設計一個類Bird,類Bird實現了以上兩個接口,并設計一個main(),測試Bird類,得到以下測試結果Thebirdisrunningwithitsfeet!Thebirdisflyingwithitswings!接口(interface)
類的單繼承與多實現接口(interface)類實現接口?練習Student.javaConsumer.javaPerson.java創建一個Student類該類繼承了Person類,并實現了Consumer接口該類具有String類型的屬性school并有一個study方法,在該方法中,系統可打印出學生在那所學校學習并創建一個測試方法,測試Student類接口(interface)接口的意義:接口可以實現多繼承:用接口可以實現混合類型(主類型,副類型),java中可以通過接口分出主次類型主類型使用繼承,副類型,使用接口實現接口可以使方法的定義和實現相分離,降低模塊間或系統間的耦合性針對接口編程可以屏蔽不同實現間的差異,看到的只是實現好的功能。接口(interface)classCatextendsAnimalimplementsRunnable{}?練習
Cat.javaTestCat.java
編寫代碼實現以下類的關系其中,Cat有:屬性:furcolor(毛的顏色)、name(名字)構造方法:一個有參的構造方法,可以滿足在創建對象的同時,為其名字屬性賦初值一個無參的構造方法方法:climbTree(),調用該方法將打印“Icouldclimbtree!”接口(interface)引用數據類型的轉換(對象造型)示例:TestStudent.java向上轉型(Upcasting)—子類轉換為父類,自動轉換;前提—具有繼承或實現關系向上轉換損失了子類新擴展的屬性和方法僅可以使用從父類中繼承的屬性和方法接口(interface)引用數據類型的轉換示例:TestStudent.java向下轉型(Downcasting):強制轉換將父類對象顯示的轉換成子類類型。Animala=newCat();Catc=(Cat)a;接口(interface)instanceof運算符判斷一個類是否實現了某個接口判斷一個實例對象是否屬于一個類它的返回值是boolean型的
對象
instanceof
接口
對象
instanceof
類多態引入實例開發教員類,其中教員分為Java教員以及.NET教員,各自的要求如下:Java教員屬性:姓名,所屬中心方法:授課(步驟:打開Eclipse,實施理論課授課),自我介紹.NET教員屬性:姓名,所屬中心方法:授課(步驟:打開VS,實施理論課授課),自我介紹代碼:TestTeacher.java為什么需要使用多態在教員類的基礎上,開發一個類代表總部,負責對各教員進行評估,評估的內容包括:1、教員的自我介紹;2、教員的授課;解決方法一:TestTeacherDuo_1.java前一方法存在的問題:違反了open-close原則
當一個軟件的需求發生改變時,我們能夠以添加新的代碼的方式,而不是修改原來代碼的方式來適應需求的更改,如晨能做到這一點,就滿足open-close原則。第二種解決方案——多態TestTeacherDuo_2.java多態(動態綁定、晚綁定Polymorphism
)一個對象具有多種特征,根據不同的情況來做出不同的響應當調用實例方法時,由Java虛擬機動態地決定所調用的方法,稱為動態綁定(dynamicbinding)或為多態(polymorphism)。如何實現多態publicclassTeacher{publicvoidgiveLesson(){
System.out.println("知識點講解");}}publicclassTest{publicstaticvoidmain(String[]args){SchoolManagersm=newSchoolManager();
sm.manage(newSoftwareTeacher());}}3publicclassSoftwareTeacher
extendsTeacher{
publicvoidgiveLesson(){
System.out.println("使用電腦授課");
super.giveLesson();
}}1publicclassSchoolManager{publicvoidmanage(Teachert){
t.giveLesson();
}}2三個條件:1)要有方法的重寫2)要有繼承/實現4)父類引用指向子類對象在Java語言中,多態性的實現有兩種方式:1、覆蓋實現多態性——動態多態2、重載實現多態性——靜態多態多態的優點簡化代碼改善代碼的組織性和可讀性易于擴展多態為什么可以這樣做子類可以無條件的給父類賦值,而且永遠是安全的,但父類給子類賦值是危險的。給定如下Java代碼,編譯運行后,輸出結果是什么classBase{publicStringname;publicBase(){name="Base";}publicBase(StringpName){name=pName;}publicvoidmethod(){System.out.println(name);}}classChildextendsBase{publicChild(){super("Child1");name="Child2";}}publicclassSample{publicstaticvoidmain(String[]args){
Childc=newChild();c.method();
}}
Child2控制臺輸出123課外練習?練習Cola公司的雇員分為以下若干類:ColaEmployee:這是所有員工總的父類,屬性:員工的姓名,員工的生日月份。方法:getSalary(intmonth)根據參數月份來確定工資,如果該月員工過生日,則公司會額外獎勵100元。SalariedEmployee:Employee的子類,拿固定工資的員工。屬性:月薪HourlyEmployee:Employee的子類,按小時拿工資的員工,每月工作超出160小時的部分按照1.5倍工資發放。屬性:每小時的工資、每月工作的小時數練習?練習SalesEmployee:Employee的子類,銷售人員,工資由月銷售額和提成率決定。屬性:月銷售額、提成率定義一個類Company,在該類中寫一個函數,調用該函數可以打印出某月某個員工的工資數額,寫一個main方法,把若干各種類型的員工放在一個ColaEmployee數組里,并單元出數組中每個員工當月的工資Contents類的繼承1接口2Java中的包3類的封裝和內部類4Java中的包包的概念及應用在Java中,包主要有以下用途:包允許將類組合成較小的單元有助于避免命名沖突
包允許在更廣的范圍內保護類、數據和方法包可以是類、接口和子包的集合Java中的包包的概念及應用將類放入包中
注意:在java中位于包中的類,在文件系統中的存放位置,必須有與包名層次相對應的目錄結構package語句作為java源文件的第一條語句每個源文件只能聲明一個包如果沒有package語句,則默認為無名包
package
包名;Java中的包訪問其它包中的類使用包名.類名前綴使用import關鍵字引入其它包中的類位于同一包中的類可以直接訪問packagetest;importp08.Animal;classCatextendsAnimal{…}CardClass.P200_Cardmy200=newardClass.P200_Card();System.out.println(my200.toString());Java中的包訪問其他包中的類導入包中所有的類導入子包中所有的類導入包中的某個類
import
包名.*;
import
包名.子包名.*;
import
包名.子包名.類名;常用包(一)1.java.lang包該包是Java語言的核心類庫,包含了運行Java程序必不可少的系統類,如基本數據類型、基本數學函數、字符串處理、線程、異常處理類等。每個Java程序運行時,系統都會自動引入java.lang包,所以這個包的加載是缺省的。2.java.io包該包是Java語言的標準輸入/輸出類庫,包含了實現Java程序與操作系統、用戶界面以及其它Java程序做數據交換所使用的類。如基本輸入/輸出流、文件輸入/輸出流、過濾輸入/輸出流、管道輸入/輸出流、隨機輸入/輸出流等。
常用包(二)3.java.util包
該包包含了Java語言中的一些低級的使用工具,如處理時間的Date類、處理變長數組的Vector類,實現棧和散列表的Stack類和HashTable類等。4.java.awt包
該包是Java語言用來構建圖形用戶界面(GUI)的類庫,它包括了許多界面元素和資源,主要提供三方面的支持:低級繪圖操作,如Graphics類等;圖形界面組件和布局管理,如Checkbox類、Container類、LayoutManager接口等;界面用戶交互控制和事件響應,如Event類。
常用包(三)5.java.awt.image包
該包用來處理和操縱來自網上的圖片的Java工具類庫。6.java.awt.peer包該包的作用是使同一個Java程序在不同的軟、硬件平臺上運行時,具有相同的用戶界面;它是程序代碼和平臺之間的中介,將不同的平臺包裹、隱藏起來,使之在用戶面前呈現相同的面貌;該包是實現Java語言跨平臺特性的手段之一。常用包(四)7.java.applet包
該包是用來實現運行于Internet瀏覽器中的JavaApplet的工具類庫,它僅包含少量的幾個接口和一個非常有用的類:java.applet.Applet。8.包
該包是Java語言用來實現網絡功能的類庫,主要包括:底層的網絡通信,如Socket類、ServerSocket類;編寫用戶自己的Telnet、FTP、郵件服務等實現網上服務的類;用于訪問Internet上資源和進行CGI網關調用的類,如URL等。
Java中的包把自己的類打包使用java命令行參數jar-cvfanimal.jar*.*Java中的包訪問權限修飾符用來控制類的成員和類的使用范圍類成員的訪問權限修飾符:private、default、protected、public類的訪問權限修飾符:public、default
privatedefaultprotectedpublic同一類√√√√同一包中的類√√√不同包中的子類√√其他包中的類√Java中的包訪問權限修飾符課堂練習1、下列關于變量的敘述哪個是錯的?()A.實例變量是類的成員變量。B.在方法中定義的局部變量在該方法被執行時創建。C.實例變量用關鍵字static聲明。D.局部變量在使用前必須被初始化。解答:C2、不允許作為類成員的訪問控制符的是()。A.public B.privateC.static D.protected解答:C3、為AB類的一個無形式參數無返回值的方法method書寫方法頭,使得使用類名AB作為前綴就可以調用它,該方法頭的形式為()。A、staticvoidmethod() B、publicvoidmethod()C、finalvoidmethod() D、abstractvoidmethod()解答:A4、可以在下面代碼段pointx處寫入的是?()//pointxpublicclassInteresting{//dosomething}A.Stringstr;B. staticintPI=4.14;C. publicclassMyClass{//dootherthing…}D.importjava.awt.*;解答:D5、已知A類被打包在packageA,B類被打包在packageB,且B類被聲明為public,且有一個成員變量x被聲明為protected控制方式。C類也位于packageA包,且繼承了B類。則以下說法正確的是:()A、A類的實例不能訪問到B類的實例B、A類的實例能夠訪問到B類一個實例的x成員C、C類的實例可以訪問到B類一個實例的x成員D、C類的實例不能訪問到B類的實例解答:C6、下列命題為真的是:()A、所有類都必須定義一個構造函數。B、構造函數必須有返回值。C、構造函數可以訪問類的非靜態成員。D、構造函數必須初始化類的所有數據成員。解答:C7、在Java中,關于final關鍵字的說法正確的是()A、如果修飾變量,則一旦賦了值,就等同一個常量。B、如果修飾類,則該類只能被一個子類繼承。C、如果修飾方法,則該方法不能在子類中被覆蓋。D、如果修飾方法,則該方法所在的類不能被繼承。解答:A,C8、在Java中,下面關于包的陳述中正確的是()A、包的聲明必須是源文件的第一句代碼。B、包的聲明必須緊跟在import語句的后面。C、只有公共類才能放在包中。D、可以將多個源文件中的類放在同一個包中。解答:A,DContents類的繼承1接口2Java中的包3類的封裝和內部類4類的封裝和內部類類的封裝將類的成員變量聲明為私有的(private),再提供一個或多個共有(public)方法實現對該成員變量的訪問或修改,這種方式就被稱為封裝封裝的目的隱藏類的實現細節讓使用者只能通過事先定制好的方法來訪問數據,可以方便地加入控制邏輯,限制對屬性的不合理操作便于修改,增強代碼的可維護性可進行數據檢查類的封裝和內部類?練習TestPerson_fenzhuan.java修改原來的Person類,將其進行良好的封裝類的封裝和內部類內部類(嵌套類)內部類就是定義在另一個類內部的類。內部類對于同一包中的其它類來說,內部類能夠隱藏起來。注意內部類可以訪問其外部類中所有的屬性和方法無需創建外部類的對象,即可從內部類訪問外部類的變量和方法。必須創建內部類的對象,否則無法從外部類訪問內部類的變量和方法。如果內部類中有和外部類同名的變量或方法,則內部類的變量和方法將獲得比外部類的變量和方法更高的優先級。不能定義static變量類的封裝和內部類類中定義的內部類普通類的訪問權限修飾符defaultpublic內部類的訪問權限修飾符defaultpublicprotectedprivate類的封裝和內部類內部類的訪問在Outer內訪問Inner,只需如下:在Outer外訪問Inner,必須如下:
Innerin=newInner();Outero=newOuter();//實例化外部類
Outer.Inneroi=o.newInner();//實例化內部類內部類示例(OuterTest.java)publicclassOuter{privateinta=5;publicclassInner{privateinti=1;publicvoidmyMethod(){System.out.println("a="+a+",i="+i);}}publicstaticvoidmain(String[]args){Outer.InnerinnerClass=newOuter().newInner();innerClass.myMethod();}}內部類特性
一般用在定義它的類內部或語句塊之內,在外部引用它時必須給出完整的名稱.名字不能與包含它的類名相同。
可以使用包含它的類的靜態和實例成員變量,也可以使用它所在方法的局部變量。
可以定義為abstract,可以被其它的內部類繼承。
可以聲明為private或protected類內部。
若被聲明為static,就變成了頂層類,不能再使用局部變量(在內部類不需要訪問外圍類對象的時候使用)。
若想在InnerClass中聲明任何static成員,則該InnerClass必須聲明為static。成員類靜態成員類局部類匿名類內部類有多種形式1、成員類例:簡單的內部類classB{B(){System.out.println("instanceofB.");}
classInnerB{//定義內部類
InnerB(){System.out.println("InstanceofInnerB.");}}}classA{publicstaticvoidmain(String[]args){Bbbb=newB();B.InnerBinbbb=bbb.newInnerB(); //創建內部類對象
System.out.println();inbbb=newB().newInnerB(); }}成員類的特點:創建一個內部類的對象,必須先有一個外包類的對象存在。外包類與其內部類之間完全互相信任。例:classB{privateintx=100;classInnerB{privateinty=1111/*,x=8888*/;voidshow(){System.out.println(x);//訪問B的private成員
System.out.println(y+"\n");}}publicvoidshow(){//外包類的方法
InnerBinB=newInnerB(); //創建內部類對象
System.out.println(inB);System.out.println(inB.y+"\n");//訪問InnerB的私有成員
inB.show();}}classA{publicstaticvoidmain(String[]args){newB().newInnerB().show();newB().show();}}2、靜態成員類靜態成員類的特點:只與外部類有關系,而不依賴于外部類的對象。因而靜態成員類的創建不需要有外部類的存在。例:classB{protectedstaticclassInnerB{}//靜態成員類}classA{publicstaticvoidmain(String[]args){//System.out.println(newB());B.InnerBinB=newB.InnerB();System.out.println(inB);//System.out.println(newB.InnerB());}}靜態內部類示例(OuterTest.java)publicclassOuterTest{publicstaticintouterInt=5;publicstaticclassStaticInner{publicstaticintdoubleVal(intn){System.out.println("outerInt="+outerInt);return2*n;}}publicvoidtestInner(){inta=5;System.out.println("a="+a+",doubleVal="+StaticInner.doubleVal(a));}publicstaticvoidmain(String[]args){intn=7;System.out.println("n="+n+",doubleVal="+OuterTest.StaticInner.doubleVal(7));OuterTestout=newOuterTest();out.testInner();}}3、局部類局部類定義在方法體內因而外部不可訪問。不需要訪問修飾符。注意:局部類的對象在堆中創建局部類可以訪問外包方法之外的類的一切成員。局部類只能訪問外包方法的final局部變量。
4.匿名類匿名類的特點:匿名類沒有類名,它必須繼承一個類或者實現一個接口,并且不能有顯示的extends或implements子句。匿名類不能有構造方法,因為它沒有類名。可以通過new<父類名>的方法創建其對象,匿名類的創建與定義同時進行。匿名類只能一次性的創建其對象,由其父類句柄持有。匿名類既可以在方法體中,也可以在參數列表中。匿名類必須簡單。4、匿名類例:匿名類示例abstractclassC{abstractvoidfoo();}classB{publicCgo(intx,finalinty){returnnewC(){publicvoidfoo(){System.out.println(y);}};//匿名類的定義是一個語句,要以;結束
}publicvoidgogo(Cc00){c00.foo();}}匿名類publicclassA{publicstaticvoidmain(String[]args){Ccccc=newB().go(1,2);cccc.foo();Ccc=newB().go(1,20);newB().gogo(cc);newB().gogo(newC(){publicvoidfoo(){
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯系上傳者。文件的所有權益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網頁內容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
- 4. 未經權益所有人同意不得將文件中的內容挪作商業或盈利用途。
- 5. 人人文庫網僅提供信息存儲空間,僅對用戶上傳內容的表現方式做保護處理,對用戶上傳分享的文檔內容本身不做任何修改或編輯,并不能對任何下載內容負責。
- 6. 下載文件中如有侵權或不適當內容,請與我們聯系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 早安正能量測試題及答案
- 掌握金融科技對證券行業的影響試題及答案
- 2025年銀行從業資格證考試信息反饋機制試題及答案
- 重點提煉:微生物檢驗技師試題及答案
- 2024是項目管理考試的關鍵年份試題及答案
- 地磚打磨施工方案怎么寫
- 2024年項目管理考試講義試題及答案
- 遠程項目管理的策略探討試題及答案
- 寧夏擠塑板地面施工方案
- 液壓馬達的排量控制考核試卷
- 2025年廣東韶關南雄市衛生健康局下屬事業單位招聘工作人員67人歷年高頻重點提升(共500題)附帶答案詳解
- 撫養費糾紛答辯狀范文
- 《專業技術人才管理》課件
- 跨國合作:應對全球傳染病挑戰
- 大班韻律《朱迪警官破案記》
- 《永輝超市S店庫存管理問題及產生原因和優化建議》8700字(論文)
- 《光儲充一體化電站技術規范》標準編制說明+征求意見稿
- 【MOOC】中國傳統藝術-篆刻、書法、水墨畫體驗與欣賞-哈爾濱工業大學 中國大學慕課MOOC答案
- 菜鳥驛站轉讓合同協議書范本
- 多物理場模擬仿真
- 常見職業病危害和預防基礎知識
評論
0/150
提交評論