java4(成員變量的初始化、包和控制修飾符)_第1頁
java4(成員變量的初始化、包和控制修飾符)_第2頁
java4(成員變量的初始化、包和控制修飾符)_第3頁
java4(成員變量的初始化、包和控制修飾符)_第4頁
java4(成員變量的初始化、包和控制修飾符)_第5頁
已閱讀5頁,還剩39頁未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

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

文檔簡介

lecture4成員變量的初始化、包和訪問控制符提綱成員變量的初始化包訪問控制類的訪問控制符類成員的訪問控制符成員變量的初始化簡單數(shù)據(jù)類型變量的初始化復(fù)雜數(shù)據(jù)類型變量的初始化指定初值構(gòu)造函數(shù)的初始化靜態(tài)數(shù)據(jù)的初始化簡單數(shù)據(jù)類型成員變量的初始化(1)classMeasurement{booleant;charc;byteb;shorts;inti;longl;floatf;doubled;簡單數(shù)據(jù)類型成員變量的初始化(2)voidprint(){System.out.println("DatatypeInitialvalue\n"+"boolean"+t+"\n"+"char["+c+"]"+(int)c+"\n"+"byte"+b+"\n"+"short"+s+"\n"+"int"+i+"\n"+"long"+l+"\n"+"float"+f+"\n"+"double"+d);}}簡單數(shù)據(jù)類型成員變量的初始化(3)publicclassInitialValues{publicstaticvoidmain(String[]args){Measurementd=newMeasurement();d.print();/*Inthiscaseyoucouldalsosay:newMeasurement().print();*/}}///:~

簡單數(shù)據(jù)類型成員變量的初始化(4)結(jié)果:Theoutputofthisprogramis:DatatypeInitialvaluebooleanfalsechar[]0byte0short0int0long0float0.0double0.0復(fù)雜類型變量的初始化如果是復(fù)雜類型的變量,則初始化為null如:classtest{studentb;}則b初始化為null指定初值(1)簡單數(shù)據(jù)類型指定初值classMeasurement{booleanb=true;charc='x';byteB=47;shorts=0xff;inti=999;longl=1;floatf=3.14f;doubled=3.14159;//...指定初值(2)復(fù)雜數(shù)據(jù)類型指定初值classMeasurement{Deptho=newDepth();booleanb=true;//...指定初值后初始化順序構(gòu)造函數(shù)可用來執(zhí)行初始化動作,但是自動初始化動作和指定初值在構(gòu)造函數(shù)之前執(zhí)行classCounter{inti;Counter(){i=7;}}//...過程:初始化次序(1)classTag{Tag(intmarker){System.out.println("Tag("+marker+")");}}

初始化次序(2)classCard{Tagt1=newTag(1);//BeforeconstructorCard(){//Indicatewe'reintheconstructor:System.out.println("Card()");t3=newTag(33);//Reinitializet3}Tagt2=newTag(2);//Afterconstructorvoidf(){System.out.println("f()");}Tagt3=newTag(3);//Atend}初始化次序(3)publicclassOrderOfInitialization{publicstaticvoidmain(String[]args){Cardt=newCard();t.f();//Showsthatconstructionisdone}}///:~結(jié)果:

Tag(1)Tag(2)Tag(3)Card()Tag(33)f()靜態(tài)數(shù)據(jù)的初始化如果數(shù)據(jù)屬于基本數(shù)據(jù)類型,而又沒有加以初始化,則會設(shè)置為基本數(shù)據(jù)類型的標(biāo)準(zhǔn)初值如果數(shù)據(jù)是復(fù)雜類型,初值便為null如果想在定義時給定初值,做法跟非static數(shù)據(jù)是一樣的注意:不論產(chǎn)生多少對象,static變量都只占用一份存儲空間Static明確初始化Java允許你將多個static初始化動作組織起來,置于特殊的“static構(gòu)建子句(有時也稱為staticblock)”中,看起來像這樣:classSpoon{staticinti;static{i=47;}//...看起來像是個函數(shù),但其實(shí)是在關(guān)鍵字static之后緊接著函數(shù)本體。這樣的程序代碼就像其他形式的static初始化一樣,只會被執(zhí)行一次;在你首次產(chǎn)生class對象或首次訪問該class的static成員時。

Static明確初始化示例(1)classCup{Cup(intmarker){System.out.println("Cup("+marker+")");}voidf(intmarker){System.out.println("f("+marker+")");}}

classCups{staticCupc1;staticCupc2;static{c1=newCup(1);c2=newCup(2);}Cups(){System.out.println("Cups()");}}Static明確初始化示例(2)publicclassExplicitStatic{publicstaticvoidmain(String[]args){System.out.println("Insidemain()");Cups.c1.f(99);//(1)}//staticCupsx=newCups();//(2)//staticCupsy=newCups();//(2)}///:~No-static實(shí)體初始化Java也為對象內(nèi)的non-static變量的初始化行為提供了類似語法。

classMug{Mug(intmarker){System.out.println("Mug("+marker+")");}voidf(intmarker){System.out.println("f("+marker+")");}}

No-static實(shí)體初始化示例(1)publicclassMugs{Mugc1;Mugc2;{c1=newMug(1);c2=newMug(2);System.out.println("c1&c2initialized");}Mugs(){System.out.println("Mugs()");}publicstaticvoidmain(String[]args){System.out.println("Insidemain()");Mugsx=newMugs();}}///:~No-static實(shí)體初始化示例(2)其中{c1=newMug(1);c2=newMug(2);System.out.println("c1&c2initialized");}可以看作實(shí)體的初始化子句初始化順序(二)當(dāng)某個型別為A的對象首次被產(chǎn)生出來,或是當(dāng)classA的static函數(shù)或static數(shù)據(jù)成員被首次訪問,Java編譯器必須查找環(huán)境變量所指定的位置,找到A.class一旦A.class被裝載,它的所有static初始動作會被執(zhí)行起來。因此static初始化動作僅會發(fā)生一次,就是在Class對象首次被裝載時。當(dāng)你newA(),構(gòu)建過程會先為A()對象在heap上分配足夠的存儲空間。這塊存儲空間會先被清為零,并自動將A對象內(nèi)所有隸屬基本型別的數(shù)據(jù)設(shè)為缺省值,并將復(fù)雜類型的引用設(shè)為null執(zhí)行所有出現(xiàn)數(shù)據(jù)定義處的初始化序列執(zhí)行構(gòu)造函數(shù)初始話順序(二)classBowl{Bowl(intmarker){System.out.println("Bowl("+marker+")");}voidf(intmarker){System.out.println("f("+marker+")");}}初始話順序(二)classTable{staticBowlb1=newBowl(1);Table(){System.out.println("Table()");b2.f(1);}voidf2(intmarker){System.out.println("f2("+marker+")");}staticBowlb2=newBowl(2);}初始話順序(二)classCupboard{Bowlb3=newBowl(3);staticBowlb4=newBowl(4);Cupboard(){System.out.println("Cupboard()");b4.f(2);}voidf3(intmarker){System.out.println("f3("+marker+")");}staticBowlb5=newBowl(5);}初始話順序(二)publicclassStaticInitialization{publicstaticvoidmain(String[]args){System.out.println("CreatingnewCupboard()inmain");newCupboard();System.out.println("CreatingnewCupboard()inmain");newCupboard();t2.f2(1);t3.f3(1);}staticTablet2=newTable();staticCupboardt3=newCupboard();}///:~初始話順序(二)結(jié)果:Bowl(1)Bowl(2)Table()f(1)Bowl(4)Bowl(5)Bowl(3)Cupboard()f(2)CreatingnewCupboard()inmainBowl(3)Cupboard()f(2)CreatingnewCupboard()inmainBowl(3)Cupboard()f(2)f2(1)f3(1)Package(包)一個包就是一些提供訪問保護(hù)和命名空間管理的相關(guān)類與接口的集合使用包的目的就是使類容易查找使用包的作用命名空間的管理防止類名的沖突訪問控制privatepublicpackageprotected包的創(chuàng)建格式:packagepkg1[.pkg2[.pkg3]];包名獨(dú)一無二將Internet域名反寫作為包的名稱將包的名稱分解為機(jī)器的目錄結(jié)構(gòu)必須放在一個Java文件的第一句import語句格式:importpkg1[.pkg2].(<classname>|*);例子importjava.util.Date;importjava.io.*;注意:使用的類或包必須加載程序中使用‘*’將會延長編譯時間,但不會影響類的大小和性能包的使用用包的全名來引用包中的類,要求在類名前加上包的全名。例如:java.lang.refrect.Array.getByte(nameArray,5);用import語句導(dǎo)入包importjava.io.*;用import導(dǎo)入包import包名;例如:importjava.lang.refrect;若要使用包中的類,可用refrect.類名import包名.類名;例如:java.lang.refrect.Array這樣,在程序中就可直接引用Arrayimport包名.*;例如:java.lang.refrect.*;它引入了包的所有類,這種方式最常用包對文件的管理在沒有package語句的源文件中,一個文件中的所有類都放在默認(rèn)的無名包中,它對應(yīng)于當(dāng)前的目錄當(dāng)有包語句的情況下,解釋器按照文件系統(tǒng)的層次結(jié)構(gòu)查找類,所以字節(jié)碼文件所在目錄名應(yīng)與其中的類所在的包名對應(yīng)包對文件的管理說明.njtu.graphicsclassCircle{………}

classTriangle{………}包對應(yīng)的字節(jié)碼文件cnedunjtugraphicsCircle.classTriangle.class創(chuàng)建包路徑格式j(luò)avac–d包路徑根目錄源文件例子假設(shè)在d:\test\source目錄下有一個TestPackage.java文件,定義如下:packageaa.bb.cc;publicclassTestPackage{………}假設(shè)想要將編后的字節(jié)碼文件放到d:\test\classes目錄下,則可以使用下列命令:javac–dd:\test\classesd:\test\source\TestPackage.java創(chuàng)建包路徑若當(dāng)前在d:\test\source目錄下,則可以使用下列命令將當(dāng)前目錄作為包路徑的根目錄:javac–d.TestPackage.java其中”.”表示當(dāng)前目錄編譯后在d:\test\source\aa\bb\cc\目錄下存放TestPackage.class文件編譯器、解釋器尋找類首先找出環(huán)境變量CLASSPATH,CLASSPATH含有一個或多個目錄,每個目錄作為.class的文件的查找起點(diǎn)Java會從這個起點(diǎn)開始,并將package名稱中的每個“.”號替換為斜線以獲得在CLASSPATH起點(diǎn)下的路徑名稱得出的路徑會接續(xù)于CLASSPATH的各個目錄下這些路徑名稱便是直譯器查找你所產(chǎn)生.class的起點(diǎn)例子環(huán)境變量classpah的設(shè)置有以下兩種方式。(1)設(shè)置環(huán)境變量CLASSPAHTsetclasspath=.;d:\test\classes(2)

用-classpath選項(xiàng)指明java–classpathd:\test\classesaa.bb.cc.TestPackage編譯器和解釋器可以在classpath指定的路徑中搜索到類。上面的例子中解釋器會根據(jù)路徑d:\test\classes和包名aa.bb.cc構(gòu)造出d:\test\classes\aa\bb\cc路徑找TestPackage.class字節(jié)碼文件。

訪問控制類的訪問控制一個獨(dú)立的類稱為外部類,嵌在類內(nèi)部的類稱為內(nèi)部類。所說的類一般指外部類。類可以用公有、友好修飾;不能用保護(hù)、私有(編譯不過)。每個編譯單元(文件)可以有多個類,但只能有一個是公有的,其它都是友好的。公有類名與文件名完全相同。一般設(shè)計成一個文件只包含一個類??赡芤粋€文件不含公有類,此時類名可以任意。修飾一個公有類的成員變量和成員函數(shù)同一包其它類,可訪問該類公有、保護(hù)、友好的成員。不同包其它類(不包括子類),僅能訪問該類公有成員。同一包的子類,繼承父類公有、保護(hù)、友好的成員。訪問父類公有、保護(hù)、友好的成員。繼承和訪問的一樣多。不同包的子類,繼承父類公有、保護(hù)的成員,不能繼承友好成員。訪問父類公有成員。繼承的多于訪問的??稍L問(本類聲明對象)publicprotecteddefaultprivate1.同一個類yyyy2.同一個包其它類(包括子類)yyyn3.不同包其它類(不包括子類)ynnn可繼承(子類聲明對象)publicprotecteddefaultprivate1.同一包子類,可繼承yyyn2.不同包子類,可繼承yynn

public

—所有類都能訪問—可以被子類繼承—公共的接口

private

—本類可訪問

protected

—同一包的所有類可訪問;所有子類都可繼承。

package:—同一包的所有類可訪問;同一包子類可繼承。訪問控制符總結(jié)publicpackageGreek;publicclassAlpha{

publicintiampublic;

publicvoidpublicMethod(){System.out.println("publicMethod");}}packageRoman;importGreek.*;classBeta{voidaccessMethod(){Alphaa=newAlpha();

a.iampublic=10;//?

a.publicMethod();//?}}返回privateclassAlpha{

privateintiamprivate;

privatevoidprivateMethod(){System.out.println("privateMethod");}}classBeta{

voidaccessMethod(){Alphaa=newAlpha();

a.iamprivate=10;//?

a.privateMethod();//?}}返回protectedpackageGreek;classAlpha{

protectedintiamprotected;

protectedvoid

溫馨提示

  • 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)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論