第三章面向?qū)ο蟾呒壧匦訽第1頁
第三章面向?qū)ο蟾呒壧匦訽第2頁
第三章面向?qū)ο蟾呒壧匦訽第3頁
第三章面向?qū)ο蟾呒壧匦訽第4頁
第三章面向?qū)ο蟾呒壧匦訽第5頁
已閱讀5頁,還剩98頁未讀 繼續(xù)免費閱讀

下載本文檔

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

文檔簡介

第三章面向?qū)ο蟾呒壧匦员菊乱c類的繼承繼承的規(guī)則子類的構(gòu)造方法方法的覆蓋final關(guān)鍵字接口接口的規(guī)范引用數(shù)據(jù)類型的轉(zhuǎn)換多態(tài)Java中的包包和訪問權(quán)限修飾符類的封裝和內(nèi)部類主要內(nèi)容類的繼承1接口2Java中的包3類的封裝和內(nèi)部類4類的繼承類的繼承在Java中定義一個類時,讓該類通過關(guān)鍵字extends繼承一個已有的類,這就是類的繼承被繼承的類稱為父類(超類,基類),新的類稱為子類(派生類)。子類繼承父類的所有屬性和方法,同時也可以增加自己的屬性和方法。使用繼承假如你在為某個公司做一個企業(yè)管理軟件,來管理企業(yè)的雇員,比如:

工人(Worker)有姓名、出生日期和薪酬屬性,需要獲得名字、年齡、薪酬和服裝津貼;

主任(Officer)同樣包含姓名、出生日期和薪酬屬性,另外還有一個department(他所管理的部門),同樣他也有獲得姓名、年齡和薪酬的方法,還有一個獲得交通補助的方法。你怎么做?繼承是利用現(xiàn)有的類創(chuàng)建新類的過程,現(xiàn)有的類稱作基類(或父類),創(chuàng)建的新類稱作派生類(子類)。Java中所有的類都是通過直接或間接地繼承java.lang.Object類得到的。在Java中定義一個類時,讓該類通過關(guān)鍵字extends繼承一個已有的類,這就是類的繼承基類方法和屬性派生類基類方法+

附加方法類的繼承繼承的語法

示例Employee.java

Worker.java

[修飾符]class子類名extends

父類名類的繼承繼承的語法?練習Officer.javaTestOfficer.java用java中類的繼承機制,實現(xiàn)Officer類,并設(shè)計一個測試程序TestOfficer類,來訪問Officer類繼承的好處實現(xiàn)類的重用易維護類的繼承繼承的規(guī)則Java中只支持單繼承,也就是說每個類只能有一個父類,不允許有多重繼承一個父類可以有多個子類子類繼承父類所有的屬性和方法,但不繼承父類的構(gòu)造方法

示例

TestWorker.java類的繼承子類的構(gòu)造方法—

子類不能繼承父類的構(gòu)造方法使用默認的構(gòu)造方法在子類中的創(chuàng)建構(gòu)造方法示例

Worker.java在子類中創(chuàng)建構(gòu)造方法時,必須調(diào)用父類的構(gòu)造方法子類可以在自己的構(gòu)造方法中使用super關(guān)鍵字來調(diào)用父類的構(gòu)造方法如果使用super關(guān)鍵字調(diào)用父類構(gòu)造方法,必須寫在該子類構(gòu)造方法的第一行如調(diào)用的是父類中無參的構(gòu)造方法,則可以不寫super()如果子類中調(diào)用了父類無參的構(gòu)造方法,而父類中沒有無參構(gòu)造方法則系統(tǒng)編譯出錯super(參數(shù)1,參數(shù)2,…);案例classPoint{//定義"點"類

//x軸坐標和y軸坐標,由于準備用于繼承,故修飾為protected

protected

floatmX,mY;

publicPoint(floatx,floaty){//構(gòu)造方法

mX=x;mY=y;}}classCircleextendsPoint{//定義"圓"類繼承于"點"類

protected

floatmRadius;//半徑

publicCircle(floatr){//構(gòu)造方法

mRadius=r;}}public

classDemo{

public

static

voidmain(String[]args){Circlec=newCircle(2.5f);//實例化"圓"類對象

}}本例將報出錯誤構(gòu)造方法的執(zhí)行順序當實例化子類的對象時,必須先執(zhí)行父類的構(gòu)造方法,然后再執(zhí)行子類的構(gòu)造方法;如果父類還有更上級的父類,就會先調(diào)用最高父類的構(gòu)造方法,再逐個依次地將所有繼承關(guān)系的父類構(gòu)造方法全部執(zhí)行;如果父類的構(gòu)造方法執(zhí)行失敗,那么子類的對象也將無法實例化。super關(guān)鍵字調(diào)用父類的方法publicclassSoftwareTeacherextendsTeacher{publicSoftwareTeacher

(StringmyName,StringmyCenter){super(myName,myCenter);}}子類的構(gòu)造方法中,通過super關(guān)鍵字調(diào)用父類的構(gòu)造方法方法重寫后,通過super關(guān)鍵字調(diào)用父類的普通方法publicclassSoftwareTeacher

extendsTeacher{publicvoidgiveLesson(){System.out.println("使用電腦授課");super.giveLesson();}}通過調(diào)用父類的構(gòu)造方法,完成對屬性值的初始化通過調(diào)用父類的普通方法,完成部分功能super總結(jié)調(diào)用父類的構(gòu)造函數(shù)super(parametersopt)調(diào)用父類的構(gòu)造函數(shù)。必須是子類構(gòu)造函數(shù)的第一條語句。如果子類中沒有顯式地調(diào)用父類的構(gòu)造函數(shù),那么將自動調(diào)用父類不帶參數(shù)的構(gòu)造函數(shù)。父類的構(gòu)造函數(shù)在子類構(gòu)造函數(shù)之前執(zhí)行。調(diào)用父類的成員super.datasuper.method(parameters)類的繼承給定以下代碼:下列描述哪些是正確的_____?A.編譯失敗B.代碼正常運行

C.在第7行拋出異常D.在第2行拋出異常答案:A類的繼承?練習Officer.java在Officer類中,創(chuàng)建一個構(gòu)造方法,要求在調(diào)用該構(gòu)造方法時,可以對name、birth、salary、department屬性賦初值類的繼承方法的覆蓋(override)

重寫(rewrite)對從父類中繼承來的方法進行改造在子類繼承父類時發(fā)生示例TestOffice_1.java方法覆蓋的規(guī)則在子類中的覆蓋方法與父類中被覆蓋的方法應(yīng)具有相同的方法名相同的參數(shù)列表(參數(shù)數(shù)量、參數(shù)類型、參數(shù)順序都要相同)相同的返回值類型子類覆蓋方法的訪問權(quán)限要不小于父類中被覆蓋方法的訪問權(quán)限

類的繼承?練習給定類,在其子類中下列哪些覆蓋方法可以正確的聲明_____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方法覆蓋注意僅當方法是可訪問的實例方法時,才能被覆蓋,即私有方法不能被覆蓋。靜態(tài)方法不能被覆蓋,如果靜態(tài)方法在子類中重新定義,那么父類方法將被隱藏。一旦父類中的方法被覆蓋,則不能從子類外部訪問被覆蓋的方法。在子類中可以使用super引用被覆蓋的方法。重寫(覆蓋)與重載方法的重載:定義有相同名字,但參數(shù)不同的多個方法構(gòu)成重載方法的重寫:方法的重寫必須和被重寫的方法具有相同的名字,參數(shù),返回值類型。構(gòu)造方法也可以重載。類的繼承final關(guān)鍵字final可以修飾的元素:類:不能被繼承變量(屬性和局部變量):不能被重新賦值在聲明的同時賦值系統(tǒng)不會對final屬性默認的賦初始值方法:不能在子類中被覆蓋,即不能修改。

1.final修飾成員變量final修飾變量,則成為常量,例如

finaltypevariableName;修飾成員變量時,定義時同時給出初始值,而修飾局部變量時不做要求。

2.final修飾成員方法final修飾方法,則該方法不能被子類重寫。finalreturnTypemethodName(paramList){…}3.final類final修飾類,則類不能被繼承。如果一個類被final關(guān)鍵字修飾,說明這個類不能再被其他類所繼承,該類被稱為最終類。

finalclassfinalClassName{

}

在默認情況下,所有的成員變量或成員方法都可以被隱藏或重寫,如果父類的成員不希望被子類的成員所隱藏或重寫則將其聲明為final。classep4_12_a{ staticfinaldoublepi=3.1415926;//聲明靜態(tài)常量

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設(shè)計一個形狀類:屬性:周長和面積;方法:求周長和求面積形狀類的子類:Rect(矩形),Circle(圓形)Rect類的子類:Square(正方形)不同的子類會有不同的構(gòu)造方法及計算周長和面積的方法寫一個測試類,在main方法中創(chuàng)建三個不同的形狀對象,放在Shape類型的數(shù)組里,分別打印出每個對象的周長和面積Contents類的繼承1接口2Java中的包3類的封裝和內(nèi)部類4接口(interface)抽象方法只有方法聲明,沒有方法實現(xiàn)的方法[訪問權(quán)限修飾符]abstract返回值類型

抽象方法名(參數(shù)列表);classA{

abstractintmethod1(inta,intb);}構(gòu)造方法、靜態(tài)方法、私有方法、final方法不能被聲明為抽象的方法。接口(interface)抽象類抽象類是抽象方法和非抽象方法的集合特殊情況全部是抽象方法全部為非抽象方法[訪問權(quán)限修飾符]abstractclass類名{……}

abtractclassA{Stringname;

abstractintmethod1(inta,intb);

voidsayHi(){System.out.println(“Hello!”);}接口(interface)抽象類注意:抽象類不能被實例化;其包含的抽象方法必須在其子類中被實現(xiàn),否則該子類只能聲明為abstract;抽象方法不能為static;如果從一個抽象類繼承,并想創(chuàng)建該新類的對象,那么我們就必須為基類中的所有抽象方法提供方法定義。在下列情況下,一個類必須聲明為抽象類:

當一個類的一個或多個方法是抽象方法時;當類是一個抽象類的子類,并且沒有實現(xiàn)父類的所有抽象方法,即只實現(xiàn)部分;當一個類實現(xiàn)一個接口,并且不能為全部抽象方法都提供實現(xiàn)時;抽象類的使用——創(chuàng)建抽象類的對象創(chuàng)建抽象類的對象–擴展抽象類,實現(xiàn)其所有抽象方法–創(chuàng)建該抽象類子類的對象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)?練習給定以下代碼:

執(zhí)行下列哪些操作后,可以讓代碼通過編譯?對methodA方法添加方法體將5~7行,用“;”代替刪除class前的abstract關(guān)鍵字刪除methodA方法前的abstract關(guān)鍵字刪除methodB方法前的abstract關(guān)鍵字答案:BE接口(interface)?練習Animal.javaFish.java按下面的類圖,創(chuàng)建一個抽象類,該抽象類有字符串類型的eyecolor屬性抽象方法stayIn,返回值類型為void方法showEye,返回值類型String接口(interface)接口的聲明接口是一種特殊的抽象類,這種抽象類中只包含常量和抽象方法,而沒有變量和方法的實現(xiàn)接口的成員:常量(字段)抽象方法[訪問權(quán)限修飾符]interface接口名

{

接口的成員}接口(interface)接口的聲明注意:接口不是一個類,沒有構(gòu)造方法,不能被實例化接口使用interface關(guān)鍵字來定義,而不是class接口默認:常量:publicstaticfinal抽象方法:publicabstractinterfaceRunnable{publicabstractvoidrun();}接口(interface)?練習給定以下代碼:下列選項中,哪些選項可以用來替代第2行代碼?finalintk=4;Publicintk=4;Staticintk=4;Privateintk=4;Abstractintk=4;答案:ABC接口(interface)?練習

下列選項中,哪些可以定義在一個接口中?答案:AB接口(interface)?練習VideoDevice.javaAudioDevice.java定義一個接口VideoDevice,表示可視設(shè)備,該接口中有:MIN_BRITGHTNESS常量,其值為10,表示最小亮度打開方法:turnOn()關(guān)閉方法:turnOff()定義一個接口AudioDevice,表示可視設(shè)備,該接口中有:MIN_VOLUME常量,其值為5,表示最小音量打開方法:turnOn()關(guān)閉方法:turnOff()調(diào)節(jié)音量方法:turnVolume(intvolume)接口(interface)extendsinterfaceAextendsB{}interfaceinterfaceinterfaceextendsinterfaceAextendsB,C,D

{}interfaceextends

擴展接口(接口的繼承)接口(interface)類實現(xiàn)接口—implements為了使用一個接口,你要編寫實現(xiàn)接口的類如果一個類要實現(xiàn)一個接口,那么這個類就必須實現(xiàn)接口中所有抽象方法。否則這個類只能聲明為抽象類多個無關(guān)的類可以實現(xiàn)一個接口,一個類可以實現(xiàn)多個無關(guān)的接口一個類可以在繼承一個父類的同時,實現(xiàn)一個或多個接口接口(interface)

?練習

Runnable.javaBird.javaFlyable.java根據(jù)以下類圖實現(xiàn)Runnable接口和Fylable接口設(shè)計一個類Bird,類Bird實現(xiàn)了以上兩個接口,并設(shè)計一個main(),測試Bird類,得到以下測試結(jié)果Thebirdisrunningwithitsfeet!Thebirdisflyingwithitswings!接口(interface)

類的單繼承與多實現(xiàn)接口(interface)類實現(xiàn)接口?練習Student.javaConsumer.javaPerson.java創(chuàng)建一個Student類該類繼承了Person類,并實現(xiàn)了Consumer接口該類具有String類型的屬性school并有一個study方法,在該方法中,系統(tǒng)可打印出學生在那所學校學習并創(chuàng)建一個測試方法,測試Student類接口(interface)接口的意義:接口可以實現(xiàn)多繼承:用接口可以實現(xiàn)混合類型(主類型,副類型),java中可以通過接口分出主次類型主類型使用繼承,副類型,使用接口實現(xiàn)接口可以使方法的定義和實現(xiàn)相分離,降低模塊間或系統(tǒng)間的耦合性針對接口編程可以屏蔽不同實現(xiàn)間的差異,看到的只是實現(xiàn)好的功能。接口(interface)classCatextendsAnimalimplementsRunnable{}?練習

Cat.javaTestCat.java

編寫代碼實現(xiàn)以下類的關(guān)系其中,Cat有:屬性:furcolor(毛的顏色)、name(名字)構(gòu)造方法:一個有參的構(gòu)造方法,可以滿足在創(chuàng)建對象的同時,為其名字屬性賦初值一個無參的構(gòu)造方法方法:climbTree(),調(diào)用該方法將打印“Icouldclimbtree!”接口(interface)引用數(shù)據(jù)類型的轉(zhuǎn)換(對象造型)示例:TestStudent.java向上轉(zhuǎn)型(Upcasting)—子類轉(zhuǎn)換為父類,自動轉(zhuǎn)換;前提—具有繼承或?qū)崿F(xiàn)關(guān)系向上轉(zhuǎn)換損失了子類新擴展的屬性和方法僅可以使用從父類中繼承的屬性和方法接口(interface)引用數(shù)據(jù)類型的轉(zhuǎn)換示例:TestStudent.java向下轉(zhuǎn)型(Downcasting):強制轉(zhuǎn)換將父類對象顯示的轉(zhuǎn)換成子類類型。Animala=newCat();Catc=(Cat)a;接口(interface)instanceof運算符判斷一個類是否實現(xiàn)了某個接口判斷一個實例對象是否屬于一個類它的返回值是boolean型的

對象

instanceof

接口

對象

instanceof

類多態(tài)引入實例開發(fā)教員類,其中教員分為Java教員以及.NET教員,各自的要求如下:Java教員屬性:姓名,所屬中心方法:授課(步驟:打開Eclipse,實施理論課授課),自我介紹.NET教員屬性:姓名,所屬中心方法:授課(步驟:打開VS,實施理論課授課),自我介紹代碼:TestTeacher.java為什么需要使用多態(tài)在教員類的基礎(chǔ)上,開發(fā)一個類代表總部,負責對各教員進行評估,評估的內(nèi)容包括:1、教員的自我介紹;2、教員的授課;解決方法一:TestTeacherDuo_1.java前一方法存在的問題:違反了open-close原則

當一個軟件的需求發(fā)生改變時,我們能夠以添加新的代碼的方式,而不是修改原來代碼的方式來適應(yīng)需求的更改,如晨能做到這一點,就滿足open-close原則。第二種解決方案——多態(tài)TestTeacherDuo_2.java多態(tài)(動態(tài)綁定、晚綁定Polymorphism

)一個對象具有多種特征,根據(jù)不同的情況來做出不同的響應(yīng)當調(diào)用實例方法時,由Java虛擬機動態(tài)地決定所調(diào)用的方法,稱為動態(tài)綁定(dynamicbinding)或為多態(tài)(polymorphism)。如何實現(xiàn)多態(tài)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)要有繼承/實現(xiàn)4)父類引用指向子類對象在Java語言中,多態(tài)性的實現(xiàn)有兩種方式:1、覆蓋實現(xiàn)多態(tài)性——動態(tài)多態(tài)2、重載實現(xiàn)多態(tài)性——靜態(tài)多態(tài)多態(tài)的優(yōu)點簡化代碼改善代碼的組織性和可讀性易于擴展多態(tài)為什么可以這樣做子類可以無條件的給父類賦值,而且永遠是安全的,但父類給子類賦值是危險的。給定如下Java代碼,編譯運行后,輸出結(jié)果是什么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)根據(jù)參數(shù)月份來確定工資,如果該月員工過生日,則公司會額外獎勵100元。SalariedEmployee:Employee的子類,拿固定工資的員工。屬性:月薪HourlyEmployee:Employee的子類,按小時拿工資的員工,每月工作超出160小時的部分按照1.5倍工資發(fā)放。屬性:每小時的工資、每月工作的小時數(shù)練習?練習SalesEmployee:Employee的子類,銷售人員,工資由月銷售額和提成率決定。屬性:月銷售額、提成率定義一個類Company,在該類中寫一個函數(shù),調(diào)用該函數(shù)可以打印出某月某個員工的工資數(shù)額,寫一個main方法,把若干各種類型的員工放在一個ColaEmployee數(shù)組里,并單元出數(shù)組中每個員工當月的工資Contents類的繼承1接口2Java中的包3類的封裝和內(nèi)部類4Java中的包包的概念及應(yīng)用在Java中,包主要有以下用途:包允許將類組合成較小的單元有助于避免命名沖突

包允許在更廣的范圍內(nèi)保護類、數(shù)據(jù)和方法包可以是類、接口和子包的集合Java中的包包的概念及應(yīng)用將類放入包中

注意:在java中位于包中的類,在文件系統(tǒng)中的存放位置,必須有與包名層次相對應(yīng)的目錄結(jié)構(gòu)package語句作為java源文件的第一條語句每個源文件只能聲明一個包如果沒有package語句,則默認為無名包

package

包名;Java中的包訪問其它包中的類使用包名.類名前綴使用import關(guān)鍵字引入其它包中的類位于同一包中的類可以直接訪問packagetest;importp08.Animal;classCatextendsAnimal{…}CardClass.P200_Cardmy200=newardClass.P200_Card();System.out.println(my200.toString());Java中的包訪問其他包中的類導(dǎo)入包中所有的類導(dǎo)入子包中所有的類導(dǎo)入包中的某個類

import

包名.*;

import

包名.子包名.*;

import

包名.子包名.類名;常用包(一)1.java.lang包該包是Java語言的核心類庫,包含了運行Java程序必不可少的系統(tǒng)類,如基本數(shù)據(jù)類型、基本數(shù)學函數(shù)、字符串處理、線程、異常處理類等。每個Java程序運行時,系統(tǒng)都會自動引入java.lang包,所以這個包的加載是缺省的。2.java.io包該包是Java語言的標準輸入/輸出類庫,包含了實現(xiàn)Java程序與操作系統(tǒng)、用戶界面以及其它Java程序做數(shù)據(jù)交換所使用的類。如基本輸入/輸出流、文件輸入/輸出流、過濾輸入/輸出流、管道輸入/輸出流、隨機輸入/輸出流等。

常用包(二)3.java.util包

該包包含了Java語言中的一些低級的使用工具,如處理時間的Date類、處理變長數(shù)組的Vector類,實現(xiàn)棧和散列表的Stack類和HashTable類等。4.java.awt包

該包是Java語言用來構(gòu)建圖形用戶界面(GUI)的類庫,它包括了許多界面元素和資源,主要提供三方面的支持:低級繪圖操作,如Graphics類等;圖形界面組件和布局管理,如Checkbox類、Container類、LayoutManager接口等;界面用戶交互控制和事件響應(yīng),如Event類。

常用包(三)5.java.awt.image包

該包用來處理和操縱來自網(wǎng)上的圖片的Java工具類庫。6.java.awt.peer包該包的作用是使同一個Java程序在不同的軟、硬件平臺上運行時,具有相同的用戶界面;它是程序代碼和平臺之間的中介,將不同的平臺包裹、隱藏起來,使之在用戶面前呈現(xiàn)相同的面貌;該包是實現(xiàn)Java語言跨平臺特性的手段之一。常用包(四)7.java.applet包

該包是用來實現(xiàn)運行于Internet瀏覽器中的JavaApplet的工具類庫,它僅包含少量的幾個接口和一個非常有用的類:java.applet.Applet。8.包

該包是Java語言用來實現(xiàn)網(wǎng)絡(luò)功能的類庫,主要包括:底層的網(wǎng)絡(luò)通信,如Socket類、ServerSocket類;編寫用戶自己的Telnet、FTP、郵件服務(wù)等實現(xiàn)網(wǎng)上服務(wù)的類;用于訪問Internet上資源和進行CGI網(wǎng)關(guān)調(diào)用的類,如URL等。

Java中的包把自己的類打包使用java命令行參數(shù)jar-cvfanimal.jar*.*Java中的包訪問權(quán)限修飾符用來控制類的成員和類的使用范圍類成員的訪問權(quán)限修飾符:private、default、protected、public類的訪問權(quán)限修飾符:public、default

privatedefaultprotectedpublic同一類√√√√同一包中的類√√√不同包中的子類√√其他包中的類√Java中的包訪問權(quán)限修飾符課堂練習1、下列關(guān)于變量的敘述哪個是錯的?()A.實例變量是類的成員變量。B.在方法中定義的局部變量在該方法被執(zhí)行時創(chuàng)建。C.實例變量用關(guān)鍵字static聲明。D.局部變量在使用前必須被初始化。解答:C2、不允許作為類成員的訪問控制符的是()。A.public B.privateC.static D.protected解答:C3、為AB類的一個無形式參數(shù)無返回值的方法method書寫方法頭,使得使用類名AB作為前綴就可以調(diào)用它,該方法頭的形式為()。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、所有類都必須定義一個構(gòu)造函數(shù)。B、構(gòu)造函數(shù)必須有返回值。C、構(gòu)造函數(shù)可以訪問類的非靜態(tài)成員。D、構(gòu)造函數(shù)必須初始化類的所有數(shù)據(jù)成員。解答:C7、在Java中,關(guān)于final關(guān)鍵字的說法正確的是()A、如果修飾變量,則一旦賦了值,就等同一個常量。B、如果修飾類,則該類只能被一個子類繼承。C、如果修飾方法,則該方法不能在子類中被覆蓋。D、如果修飾方法,則該方法所在的類不能被繼承。解答:A,C8、在Java中,下面關(guān)于包的陳述中正確的是()A、包的聲明必須是源文件的第一句代碼。B、包的聲明必須緊跟在import語句的后面。C、只有公共類才能放在包中。D、可以將多個源文件中的類放在同一個包中。解答:A,DContents類的繼承1接口2Java中的包3類的封裝和內(nèi)部類4類的封裝和內(nèi)部類類的封裝將類的成員變量聲明為私有的(private),再提供一個或多個共有(public)方法實現(xiàn)對該成員變量的訪問或修改,這種方式就被稱為封裝封裝的目的隱藏類的實現(xiàn)細節(jié)讓使用者只能通過事先定制好的方法來訪問數(shù)據(jù),可以方便地加入控制邏輯,限制對屬性的不合理操作便于修改,增強代碼的可維護性可進行數(shù)據(jù)檢查類的封裝和內(nèi)部類?練習TestPerson_fenzhuan.java修改原來的Person類,將其進行良好的封裝類的封裝和內(nèi)部類內(nèi)部類(嵌套類)內(nèi)部類就是定義在另一個類內(nèi)部的類。內(nèi)部類對于同一包中的其它類來說,內(nèi)部類能夠隱藏起來。注意內(nèi)部類可以訪問其外部類中所有的屬性和方法無需創(chuàng)建外部類的對象,即可從內(nèi)部類訪問外部類的變量和方法。必須創(chuàng)建內(nèi)部類的對象,否則無法從外部類訪問內(nèi)部類的變量和方法。如果內(nèi)部類中有和外部類同名的變量或方法,則內(nèi)部類的變量和方法將獲得比外部類的變量和方法更高的優(yōu)先級。不能定義static變量類的封裝和內(nèi)部類類中定義的內(nèi)部類普通類的訪問權(quán)限修飾符defaultpublic內(nèi)部類的訪問權(quán)限修飾符defaultpublicprotectedprivate類的封裝和內(nèi)部類內(nèi)部類的訪問在Outer內(nèi)訪問Inner,只需如下:在Outer外訪問Inner,必須如下:

Innerin=newInner();Outero=newOuter();//實例化外部類

Outer.Inneroi=o.newInner();//實例化內(nèi)部類內(nèi)部類示例(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();}}內(nèi)部類特性

一般用在定義它的類內(nèi)部或語句塊之內(nèi),在外部引用它時必須給出完整的名稱.名字不能與包含它的類名相同。

可以使用包含它的類的靜態(tài)和實例成員變量,也可以使用它所在方法的局部變量。

可以定義為abstract,可以被其它的內(nèi)部類繼承。

可以聲明為private或protected類內(nèi)部。

若被聲明為static,就變成了頂層類,不能再使用局部變量(在內(nèi)部類不需要訪問外圍類對象的時候使用)。

若想在InnerClass中聲明任何static成員,則該InnerClass必須聲明為static。成員類靜態(tài)成員類局部類匿名類內(nèi)部類有多種形式1、成員類例:簡單的內(nèi)部類classB{B(){System.out.println("instanceofB.");}

classInnerB{//定義內(nèi)部類

InnerB(){System.out.println("InstanceofInnerB.");}}}classA{publicstaticvoidmain(String[]args){Bbbb=newB();B.InnerBinbbb=bbb.newInnerB(); //創(chuàng)建內(nèi)部類對象

System.out.println();inbbb=newB().newInnerB(); }}成員類的特點:創(chuàng)建一個內(nèi)部類的對象,必須先有一個外包類的對象存在。外包類與其內(nèi)部類之間完全互相信任。例:classB{privateintx=100;classInnerB{privateinty=1111/*,x=8888*/;voidshow(){System.out.println(x);//訪問B的private成員

System.out.println(y+"\n");}}publicvoidshow(){//外包類的方法

InnerBinB=newInnerB(); //創(chuàng)建內(nèi)部類對象

System.out.println(inB);System.out.println(inB.y+"\n");//訪問InnerB的私有成員

inB.show();}}classA{publicstaticvoidmain(String[]args){newB().newInnerB().show();newB().show();}}2、靜態(tài)成員類靜態(tài)成員類的特點:只與外部類有關(guān)系,而不依賴于外部類的對象。因而靜態(tài)成員類的創(chuàng)建不需要有外部類的存在。例:classB{protectedstaticclassInnerB{}//靜態(tài)成員類}classA{publicstaticvoidmain(String[]args){//System.out.println(newB());B.InnerBinB=newB.InnerB();System.out.println(inB);//System.out.println(newB.InnerB());}}靜態(tài)內(nèi)部類示例(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、局部類局部類定義在方法體內(nèi)因而外部不可訪問。不需要訪問修飾符。注意:局部類的對象在堆中創(chuàng)建局部類可以訪問外包方法之外的類的一切成員。局部類只能訪問外包方法的final局部變量。

4.匿名類匿名類的特點:匿名類沒有類名,它必須繼承一個類或者實現(xiàn)一個接口,并且不能有顯示的extends或implements子句。匿名類不能有構(gòu)造方法,因為它沒有類名??梢酝ㄟ^new<父類名>的方法創(chuàng)建其對象,匿名類的創(chuàng)建與定義同時進行。匿名類只能一次性的創(chuàng)建其對象,由其父類句柄持有。匿名類既可以在方法體中,也可以在參數(shù)列表中。匿名類必須簡單。4、匿名類例:匿名類示例abstractclassC{abstractvoidfoo();}classB{publicCgo(intx,finalinty){returnnewC(){publicvoidfoo(){System.out.println(y);}};//匿名類的定義是一個語句,要以;結(jié)束

}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. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(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)容負責。
  • 6. 下載文件中如有侵權(quán)或不適當內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論