java基礎(chǔ)一4new_第1頁
java基礎(chǔ)一4new_第2頁
java基礎(chǔ)一4new_第3頁
java基礎(chǔ)一4new_第4頁
java基礎(chǔ)一4new_第5頁
已閱讀5頁,還剩34頁未讀, 繼續(xù)免費閱讀

下載本文檔

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

文檔簡介

1、Java基礎(chǔ)一1、編譯原理簡單學習java編譯期編譯源文件生成字節(jié)碼文件的過程,以及如何通過java解釋器運行字節(jié)碼文件。1.1、jdk的安裝我們首先可以通過 FilesJava下安裝jdk和jre運行時環(huán)境。如圖:安裝完后我們可以選擇“開始”“運行”,輸入cmd,點及回車鍵,彈出如下圖:在彈出的控制臺窗口中我們可以輸入:java version回車,彈出如下窗口表示jdk安裝成功。1.2、開發(fā)環(huán)境的配置我們程序員主要是編寫java源程序,即擴展名是“.java”的文件稱為源文件。然后通過jdk自帶的編譯期javac.exe對源程序進行編譯,生成可執(zhí)行的字節(jié)碼文件,即擴展名為“.class”的

2、文件稱為字節(jié)碼文件,或稱為可執(zhí)行程序。編譯期和解釋器所在位置如圖:此時我們再控制臺輸入的任意目錄輸入“java”,結(jié)果如下圖:同樣在控制臺輸入“javac”,結(jié)果如下圖:結(jié)果表示沒有找到我們的javac編譯器,解決方法是:通過set path=“javac所在目錄”命令設置path環(huán)境變量,即可正常執(zhí)行javac.exe程序了,如圖:當然這種對于環(huán)境變量的設置只對當前窗口生效,對其他窗口無效,要想長期有效,我們可以通過“我的電腦”“屬性”“高級”標簽下的“環(huán)境變量”按鈕設置:環(huán)境變量設置分為用戶級的和系統(tǒng)級的,我們可以在任意其一進行設置。以用戶級為例:如果沒有變量名為path的,我們可以點擊新

3、建按鈕,在彈出的對話框中的變量名中輸入path,在變量值中輸入javac.exe所在的目錄即可。1.3、編譯與運行我們的編譯器只能編譯文件擴展名為“.java”的文件,文件中可以沒有任何內(nèi)容,但是如果有內(nèi)容必須符合java的語法規(guī)范,因為javac編譯器在編譯之前要先進行語法等信息的檢查。以windows平臺為例,在編譯時文件名不區(qū)分大小寫。有文件如下:兩種類型的文件名都可以編譯通過,但是用中文作為源文件的文件名不推薦。注意在windows平臺上,文件名是不區(qū)分大小寫的。即TEST.java和Test.java和TeST.java是同名文件,不允許在同一目錄下同時存在。Java的解釋器java

4、.exe執(zhí)行的是類,即類的內(nèi)容,而非類所在的文件的文件名,所以java后跟的是類名,而非類所在的文件的文件名。如下:class Testpublic static void main(String args)System.out.println("Hello world.");Javac Test.java 生成Test.class文件,要想執(zhí)行當前程序,可以這樣做:java Test 此時的Test是類名,而非文件名,如果我們這樣做:java test 則報錯:潛在說明類名是區(qū)分大小寫的。1.4、Hello world我們要想編寫第一個Helloworld程序,首先要將系

5、統(tǒng)內(nèi)部默認的入口函數(shù)main方法顯示聲明,可以通過打印語句System.out.print(“Hello world.”);進行打印。class Testpublic static void main(String args)System.out.println("Hello world.");每個類都有一個入口函數(shù):public static void main(String args) ,必須是public的,且要被static修飾。也就意味著我們要做的任何事情,都要在main方法中進行編寫。當運行一個類時,系統(tǒng)會自動調(diào)用main方法,如果沒有聲明main方法,會報一個

6、錯誤:“Exception in thread "main" java.lang.NoSuchMethodError: main”2、數(shù)據(jù)類型我們編寫的程序永遠是以處理數(shù)據(jù)為核心,比如對數(shù)據(jù)的增刪改查。任何一個數(shù)據(jù)我們都應該知道它的類型,才可以更好的應用。比如在我沒有具體說明的情況下,請問:1是什么類型?有人可能要說是一個整數(shù)。但是我也可以說它就是一個編號,是一個文本型的。因為1是一個常量。是一個具體值,只不過此時我們還沒有定義這個值的具體類型罷了。由此可見數(shù)據(jù)類型的重要性。Java中對于數(shù)據(jù)分為兩種類型,一種是基本數(shù)據(jù)類型,一種是引用型數(shù)據(jù)類型。當我們需要的類型在jdk中

7、不存在時,我們也可以通過class關(guān)鍵字定義。2.1、基本數(shù)據(jù)類型基本數(shù)據(jù)類型又叫原生數(shù)據(jù)類型,這種類型的數(shù)據(jù)是和變量名一并保存在相同的內(nèi)存中的,變量的本身就是數(shù)據(jù)。有別于后面的引用型?;緮?shù)據(jù)類型又分為如下幾種:1) 數(shù)值型:數(shù)值型包含整型(byte、short、int、long)和浮點型(float、double)2) 字符型:char類型3) 邏輯性:又叫布爾型(boolean),可取值只有true和false。以上就是我們常說的“四類八種“。2.2、引用型引用型的變量主要是通過類名稱定義的變量,或者是數(shù)組類型定義的變量。因為變量名和變量值不是“捆綁“在一起的,變量名只保存了值的”地址“

8、,而非值本身,我們可以理解變量就是操縱值的遙控器,所以我們叫這種類型為引用型。我們會在后面詳細介紹。2.3、變量聲明所謂變量的聲明就是在代碼塊中定義變量,同時我們可以為其賦一個初始值,這個動作又叫變量的初始化。變量在使用之前必須保證初始化。class Testint i;/變量聲明public static void main(String args)int t = 6;/變量聲明并初始化Test2 t2;/變量聲明t2 = new Test2();/變量初始化class Test22.4、數(shù)據(jù)類型與運算數(shù)值型數(shù)據(jù)常見的操作無外乎加減乘除(+、-、*、/、%)。而java又將數(shù)值型分為:編號類

9、型字節(jié)數(shù)1byte12short23int44long85float46double87char28booleantrue或者false基本數(shù)據(jù)類型中1到6為數(shù)值型,是可以參與運算的,其中字符型的char也可以參與數(shù)學運算,唯獨boolean類型無法參與數(shù)學運算。2.4.1、變量與常量、運算符使用常量是不可改變的量,而變量是可以改變的量。變量主要是用來存儲常量,可以實現(xiàn)常量的反復使用。Java中任意一個常量的默認類型是int類型。任意一個浮點型的常量默認為double類型。public static void main(String args) byte b = 12;/可以通過。byte b

10、2 = 128;/編譯不能通過,超出了byte的取值范圍。byte b3 = b + 12;/編譯也無法通過。b+=12;/可以通過。byte b4 = 127;b4+=1;/可以通過。 System.out.println(b4);/輸出結(jié)果是-128.以上程序告訴我們:當一個int類型的常量沒有超出byte的取值范圍時,系統(tǒng)會對該值進行強制類型轉(zhuǎn)換,且不會造成精度丟失。而當一個超出了byte取值范圍的int類型值(128)賦給byte類型變量時,系統(tǒng)檢測到該值超出了byte的取值范圍,不會對該值進行自動強制類型轉(zhuǎn)換。所以在編譯時會報精度丟失錯誤。要想編譯通過,我們可以手動強制類型轉(zhuǎn)換。而當

11、兩個不同類型的數(shù)值進行運算時,系統(tǒng)會先找到類型更寬的類型,將窄類型先自動強制轉(zhuǎn)換為寬類型。然后執(zhí)行運算。運算結(jié)果是寬類型的。表達式b+12的結(jié)果是一個int類型,b3是byte類型,賦值語句兩邊的類型不匹配,雖然表達式的結(jié)果沒有超出byte的取值范圍,但是系統(tǒng)不會自動對表達式的結(jié)果進行類型轉(zhuǎn)換。要想通過編譯,我們必須手動強制類型轉(zhuǎn)換?!?=”的意思是先執(zhí)行加運算,再執(zhí)行賦值語句。但是系統(tǒng)會自動對運算結(jié)果進行強制類型轉(zhuǎn)換(當運算結(jié)果的類型寬于被賦值的變量的類型時)。所以在使用“+=”符號時要注意,一定要保證其左邊的類型的寬度大于等于右邊的結(jié)果的類型。“+”運算符在java中被重載了。其有兩個功能

12、,當“+”符號左右只要有一個類型是非數(shù)值型的數(shù)據(jù),那么該符號就被充當字符串連接符使用。如果左右都是數(shù)值型,那么該符號就充當數(shù)學運算符使用。public static void main(String args) System.out.println(12+23+"10");/結(jié)果是:3510System.out.println("10"+12+23);/結(jié)果是:101223Java中通過String定義字符串類型,String str = “I am teacher.”;任何類型和String類型執(zhí)行“+”運算,其結(jié)果都是字符串類型?!?”和“-”運算符

13、的使用,在變量之前,表示先執(zhí)行加(減)一之后,再使用變量。在變量之后,則表示先使用變量,再改變變量的值。public static void main(String args) int i = 5;System.out.println(i+);/5System.out.println(i);/6int j = 5;System.out.println(+j);/6System.out.println(j);/62.4.2、char類型Java采用的是unicode編碼。所以一個字符型的變量是可以存儲一個漢字的。其實字符型的底層是采用assics碼存儲的。char類型的變量即可被一個字符常量賦值

14、,也可以被一個整型常量賦值。并可以參與數(shù)學運算。public static void main(String args) char c = 'a' , c2 = 65;System.out.println(c);/aSystem.out.println(int)c);/97System.out.println(c2);/ASystem.out.println(int)c2);/65System.out.println(c+c2);/1622.4.3、數(shù)據(jù)類型之間的轉(zhuǎn)換原則在整型中的轉(zhuǎn)換順序是:byte、short、charintlongfloatdoubleString。也就是

15、說byte、short、char在混合運算時,彼此之間不會相互轉(zhuǎn)換,它們統(tǒng)一轉(zhuǎn)換為int類型再運算。float和long類型運算的結(jié)果是float類型。public static void main(String args) byte b = 12;short s = 12;/s = s + b;報錯。int i = s + b;char c = 12;/c = s + c;報錯。i = s + c;long lg = 12;float f = 23.45f;f = f + lg;3、代碼塊在java中代碼塊分為普通代碼塊,靜態(tài)代碼塊,構(gòu)造代碼塊。首先代碼塊是在類體中定義的“”。我們編寫的代碼

16、必須要在代碼塊中或方法體中。不能直接寫在類體內(nèi)。3.1、普通代碼塊普通代碼塊是在方法中聲明的“”;在“”前也可以添加if、for、while、switch等關(guān)鍵字,就構(gòu)成了特定意義的普通代碼塊。public static void main(String args) System.out.println("這是普通代碼塊中的語句。");1) 在普通代碼塊前加if關(guān)鍵字,就是條件語句,if可以和else if 或者else配合使用,也可以單獨使用,但是else和else if不能單獨使用;2) 在普通代碼塊“”前添加“for(;)”就成了特殊的循環(huán)語句;3) 在普通代碼塊前還

17、可添加“while()”或者“do”、“switch(int類型)”等。public static void main(String args) int a = 10;if(a%2=0)System.out.println(a+"是偶數(shù)。");elseSystem.out.println(a+"是奇數(shù)。");If其后“()”中的表達式的結(jié)果必須是boolean類型的。public static void main(String args) System.out.println("打印1到10閉區(qū)間內(nèi)所有的偶數(shù)。");for(int i

18、=1;i<=10;i+)if(i%2=0)System.out.println("偶數(shù):"+i);elsecontinue;/表示直接進入下次循環(huán),當然此處可以不寫。for之后的“()”中有三個表達式,分別用兩個“;”隔開。第一個表達式也可以寫在for循環(huán)語句之前;第二個表達式的結(jié)果必須是一個boolean類型的。第三個表達式改變第二個表達式取值的一個量。也可以寫在循環(huán)體的內(nèi)部。如果“()”內(nèi)是三條空語句,則該循環(huán)是一個死循環(huán)。public static void main(String args) System.out.println("打印1到10閉區(qū)間

19、內(nèi)所有的偶數(shù)。");int i = 10;while(i>0)if(i%2=0)System.out.println("偶數(shù):"+i);i-;while之后的“()”中的表達式的結(jié)果必須是boolean類型的。public static void main(String args) int i = 2;switch(i)case 1:System.out.println("case 1.");case 2:System.out.println("case 2.");case 3:System.out.println(&

20、quot;case 3.");case 4:System.out.println("case 4.");break;case 5:System.out.println("case 5.");default:System.out.println("default.");Switch之后的“()”中的表達式的結(jié)果必須是int類型的。要想防止case語句穿透,必須使用break關(guān)鍵字結(jié)束。3.2、靜態(tài)代碼塊靜態(tài)代碼塊是在“”前添加static修飾,且靜態(tài)代碼塊是在方法之外,類體之內(nèi)聲明的。靜態(tài)代碼塊會在類加載時由系統(tǒng)默認執(zhí)行,且在

21、main方法之前執(zhí)行。靜態(tài)代碼塊主要作用是對類變量進行初始化。后面會詳細講解。public class Test2 staticSystem.out.println("靜態(tài)代碼塊。");public static void main(String args) System.out.println("入口方法main。");非main方法的Hello world如何編寫?如下:public class Test2 staticSystem.out.println("靜態(tài)代碼塊。");System.exit(1);/表示系統(tǒng)正常退出,不會

22、再向下查詢main方法。java.lang.System類的靜態(tài)方法exit(int)表示終止JVM的運行。直接結(jié)束程序的意思。3.3、構(gòu)造代碼塊構(gòu)造代碼塊也是在類體的內(nèi)部,方法的外部聲明的,不加任何修飾的“”。構(gòu)造代碼塊會在實例化類對象時,系統(tǒng)自動執(zhí)行的代碼塊。構(gòu)造代碼塊的主要作用是對成員變量進行初始化。會在后面進行詳細講解。public class Test2 System.out.println("構(gòu)造代碼塊。");public static void main(String args) /構(gòu)造一個Test2類型的對象。程序運行時會在main方法前自動執(zhí)行構(gòu)造代碼塊。

23、new Test2();3.4、代碼塊與作用域作用域就是變量的可視范圍。代碼塊“”就是作用域,比如類體、方法體、普通代碼塊、靜態(tài)代碼塊、構(gòu)造代碼塊都稱之為作用域。除類體之外的作用域都稱之為局部作用域。3.4.1、局部作用域中的變量與內(nèi)存局部作用域中的變量的作用范圍是從變量的定義處起,到該變量所在的第一層“”的結(jié)束。局部變量是在內(nèi)存的棧區(qū)開辟空間的。public static void main(String args) /局部作用域:方法體。int i = 3;/局部作用域:普通代碼塊。System.out.println("i="+i);int j = 4;System.

24、out.println("j="+j); /int i = 4;報錯,已在方法體局部作用域中定義了同名變量。System.out.println("i="+i);/System.out.println("j="+j);此處已經(jīng)脫離了j的作用范圍。4、方法方法描述的是一段算法,是一個動作,是一種功能。一個功能也可以理解為是一個事務,一個完整的事務可能由一到多個子事務(功能)一起完成的。作業(yè):對一下語句進行方法描述。1、 我去吃飯了。2、 我騎著自行車去上班。3、 我騎著自行車去上班了。4、 我一邊吃飯,一邊打游戲。5、 我吃完飯要去看電

25、影。6、 我每天晚上都會去操場跑步一圈,如果我每天晚上吃幾斤包子,我就多跑幾圈。比如吃3斤包子,就多跑三圈。4.1、一般方法一般方法的定義:修飾符1 修飾符2 返回值類型 方法名(形參列表)算法。這就是一個完整的方法定義,“”中是可選的。根據(jù)具體需要選擇。方法前如果有static修飾符修飾,該方法表示是一個靜態(tài)方法,也叫類方法。沒有static修飾的叫成員方法。類方法可以直接通過類名加引導符調(diào)用。成員方法要通過對象(或?qū)ο笠茫┘右龑Х{(diào)用。在一類的內(nèi)部,非靜態(tài)方法和非靜態(tài)方法之間可以相互直接調(diào)用,非靜態(tài)方法也可以直接調(diào)用靜態(tài)的類方法。而類方法不能調(diào)用非靜態(tài)方法,靜態(tài)方法之間可以相互直接調(diào)用。

26、public class Test2 public void m1()System.out.println("m1()");void m2()m1();/非靜態(tài)方法之間可以相互直接調(diào)用。public static int m3(int a, int b)return a+b;/return表示方法的結(jié)束,跳到方法的調(diào)用處。static void m4()/m1();報錯,靜態(tài)方法中不能調(diào)用非靜態(tài)方法。System.out.println(m3(2,3);/靜態(tài)方法之間可以相互調(diào)用。public void m5()m4();/非靜態(tài)方法可以直接調(diào)用靜態(tài)方法。4.2、構(gòu)造方法構(gòu)

27、造方法的主要作用是初始化成員變量,創(chuàng)建對象。每個類都至少要有一個構(gòu)造方法,沒有構(gòu)造方法的類是不存在的。構(gòu)造方法沒有返回值類型,且構(gòu)造方法的方法名與類名完全一致。如果一個類沒有顯示的聲明構(gòu)造方法,JVM在編譯時也會為該類添加一個無參的、不加任何實現(xiàn)的構(gòu)造方法,該構(gòu)造方法又被稱為缺省的構(gòu)造方法。public class Test2 public Test2()System.out.println("構(gòu)造方法。");public class Test2 /該類在編譯時系統(tǒng)會添加缺省的構(gòu)造方法。4.3、方法的重載在一個類的內(nèi)部,多個方法的方法名相同,但是參數(shù)的個數(shù)不同,或者是參數(shù)的

28、類型不同,或者是相同參數(shù)個數(shù)的類型排列順序不同,就叫方法的重載。返回值類型的不同不能作為評判方法是否重載的依據(jù)。比如計算器上的“+”就是一個重載功能。方法重載的目的是為了簡化API的使用。同名的方法具備不同的功能。這樣在調(diào)用時會變得更加簡單。方法的重載也是一種多態(tài)的表現(xiàn)形式。在一個類的內(nèi)部之所以可以有多個同名方法存在,是因為java采用的是“動態(tài)綁定原則”。運行時會根據(jù)參數(shù)選擇對應的方法。public class Test2 public void get()/public int get()return 21;這個不是重載方法。public void get(int a)public voi

29、d get(int a,String b)public void get(String a, int b)4.4、對字節(jié)碼文件進行反編譯我們在編寫源文件的時候,有可能沒有顯示的編寫構(gòu)造方法。但是我們定義一個類,難道真的可以沒有構(gòu)造方法嗎?不是的,在java中,沒有構(gòu)造方法的類可以理解為是不存在的。雖然我們可以不顯示的編寫構(gòu)造方法,但是JVM在編譯時,會先執(zhí)行檢查,當檢查到我們沒有定義構(gòu)造方法時,系統(tǒng)會為我們的類添加一個缺省構(gòu)造方法??梢酝ㄟ^如下方法進行驗證:Test.java的源文件package java.basic1;public class Test public int a;void

30、run()System.out.println("run();");先編譯源文件,生成字節(jié)碼文件如下:這個文件的內(nèi)容我們是無法看懂的,那么要如何驗證呢?可以通過反編譯命令:javap.exe我們可以通過反編譯的結(jié)果和源文件對比,字節(jié)碼文件中是有了構(gòu)造方法的。4.5、如何合理定義方法方法是一段算法的集合,而一段算法有可能又可以細分為多個子算法。我們可以將一段完整的算法理解為是一個完整的事務,而在這個事務中又集合了多個子事務。因此我們有必要將這些個子事務也定義成方法。然后將這些個子方法按照業(yè)務邏輯組成一個完整的事務。這樣做的好處是:1) 子方法可以重復使用,達到了代碼復用的目的

31、;2) 代碼利于維護,當一個完整的事務的某一塊邏輯需要改變時,我們可以定位到具體子方法,對具體子方法進行修改即可因此,定義一個合理的方法應做到如下幾點:1) 一事一方法,方法的具體代碼片段不耦合;2) 確定方法所屬的類,合理的方法出現(xiàn)在適當?shù)念愔?。舉例:“我每天騎自行車去上班?!比绾尉帉懛椒??class Bike/自行車類型。public void move()/自行車移動功能。System.out.println("自行車 開始啟動了");class Person/人類。String name;Person(String name) = name;pub

32、lic void ride(Bike bike)/騎自行車bike.move();public void goToWork(Bike bike)/騎自行車上班ride(bike);public static void main(String args) Person myself = new Person("我");/實例一個Person類型對象。myself.goToWork(new Bike();4.6、標識符與命名規(guī)范在java中,凡是我們可以自行定義的地方都可以稱之為標識符,比如:變量名、方法名、類名、包名等等。Java中標識符由一下字符組成:字母、數(shù)字、下劃線“_

33、”、美元符號“$”。定義一個標識符需要滿足如下幾點:1) 不能以數(shù)字開頭2) 不能和java中的關(guān)鍵字沖突3) Java中的標識符對字母的大小寫是敏感的,且不能出現(xiàn)非法字符命名規(guī)范之駝峰命名規(guī)范:我們在定義一個標識符時,盡量要做到見名知意,要做到見名知意,即要求標識符的可讀性高,那么一個標識符可能要出現(xiàn)多個單詞。駝峰命名要求:a) 標識符作為類名,要求每個單詞的首字母要大寫b) 標識符作為方法名和普通變量名,要求第一個單詞的首字母小寫,之后每個單詞的首字母大寫c) 標識符作為包名,要求一層包使用一個單詞d) 標識符作為常量名,要求每個單詞的每個字母都大寫,單詞間使用“_”線連接5、封裝:類與對

34、象類是一種抽象的概念,對象是客觀存在的實體。類可以對對象進行定義;對象則是類的體現(xiàn)。俗語說:“物以類聚人以群分”;關(guān)鍵我們?nèi)绾畏诸?,如何準確分類。封裝,可以理解為是對一段算法的封裝。也可以是對具有相同屬性和相同功能的一類事物的抽象。Java中對封裝有更特點的意思,主要是針對simpleBean(簡單的實體類)。即成員變量私有化(private修飾),然后通過getXXX和setXXX方法進行讀寫操作。class Personprivate String name;private int age;private String address;public String getName() ret

35、urn name;public void setName(String name) = name;public int getAge() return age;public void setAge(int age) this.age = age;public String getAddress() return address;public void setAddress(String address) this.address = address;5.1、類的概念在java中我們這樣對類進行定義:具有相同屬性和相同功能的一類事物的集合。比如我們身邊有如下對象:猴子、電腦、

36、空調(diào)、人、桌子;我們?nèi)绾螌ζ溥M行分類?如何我們從可視性上分,他們都是同一類事物固體;如果我們從生物和非生物角度分,又可以分為兩種生物和非生物;由此可見類型是無形的。關(guān)鍵看我們?nèi)绾螌ο髮傩赃M行區(qū)分。不同的屬性集合,得到不同的類。類是對對象的定義。描述一組對象是同類事物的過程就叫“抽象”。5.2、對象對象就是以類為模板,將類中的各個屬性賦值之后就產(chǎn)生了對象。我們可以這樣理解對象,對象就是具有屬性值的類。5.3、類和對象之間的關(guān)系類是通過一組對象按相同屬性和相同功能抽取出來的結(jié)果。對象則是類的一個具體體現(xiàn)。在java程序語言中,我們這樣說:類是對象的模板(或者說類是對象的集合),對象是類的實例。每一

37、個對象都是同一種類型的,因為它們有相同的屬性,屬性都是和類模板一致的。而每個對象又不同,因為每個對象的屬性值不同。class Person/對人類的抽象String name;/姓名int age;/年齡char sex;/性別Person(String n, int a, char s)/構(gòu)造方法保障對象的實例化name = n;age = a;sex = s;public static void main(String args) Person p1 = null;/定義Person類型的引用(變量)p1 = new Person("張三",45,'男'

38、);/通過構(gòu)造方法實例化對象System.out.println("p1="+p1);/打印該引用對應的堆區(qū)中對象的地址System.out.println("="+);/該引用所指對象的name屬性5.4、類中屬性的默認初始化規(guī)則我們知道在局部作用域中定義的變量在使用之前必須對其進行手動初始化。如果在使用之前得不到初始化,要報初始化錯誤。而我們在方法之外,類的內(nèi)部定義的變量,即使在使用之前我們沒有手動初始化,依然可以正常使用。為什么呢?難道是屬性不需要初始化嗎?顯然是不可能的。其實是JVM對其進行了初始化。初始化原則如下:p

39、ublic class Test static byte b;/0static short s;/0static int i;/0static long lg;/0static float f;/0.0static double d;/0.0static char c;/一個空格static boolean flag;/falsestatic String str;/nullpublic static void main(String args) System.out.println("b="+b);System.out.println("s="+s);

40、System.out.println("i="+i);System.out.println("lg="+lg);System.out.println("f="+f);System.out.println("d="+d);System.out.println("c="+c+"");System.out.println("flag="+flag);System.out.println("str="+str);注意:所有的引用型數(shù)據(jù)一律默認初

41、始化為null值。null的意思是表示該引用的值還不確定。引用型的變量當值不確定時,為了避免在使用變量時發(fā)生未被初始化異常,可以統(tǒng)統(tǒng)賦值為null。5.5、類的加載一個類在使用之前必須要先加載到內(nèi)存。一個類會被加載的幾種方式:1) 直接通過java.exe命令執(zhí)行該類,在執(zhí)行之前會先加載該類2) 一個類在另一個類中被間接使用,比如在A類型中使用B類的方法,當我們執(zhí)行A類時,執(zhí)行到B類相關(guān)方法時,也會先加載B類3) 通過Class.forName(“類的全路徑名”)可以加載一個類注意:在一個程序的生命周期中,一個類只被加載一次。加載一個類就是按照程序由上向下的順序執(zhí)行靜態(tài)代碼塊。5.6、程序生命

42、周期與內(nèi)存類的加載永遠排在第一位,當類加載完畢,就可以使用該類了,比如調(diào)用給類的靜態(tài)方法。當然了main方法是程序的入口。我們可以在main方法中調(diào)用方法,包括定義局部變量,實例化對象等??慈缦麓a:public class Person String name;int age;public Person()age = 1;System.out.println("缺省的構(gòu)造方法。");public Person(String n, int a)name = n;age = a;System.out.println("有參的構(gòu)造方法被執(zhí)行了。");Syst

43、em.out.println("一個對象要產(chǎn)生了。");staticSystem.out.println(Person.class.getName()+"類被加載了。");System.out.println("構(gòu)造代碼塊在構(gòu)造方法前執(zhí)行。");public static void main(String args) Person p1 = null;p1 = new Person();System.out.println("p1="+p1);System.out.println("-");p1

44、 = new Person("Jim", 22);System.out.println("p1="+p1);staticSystem.out.println("靜態(tài)代碼塊執(zhí)行了。");輸出結(jié)果:Person類被加載了。靜態(tài)代碼塊執(zhí)行了。一個對象要產(chǎn)生了。構(gòu)造代碼塊在構(gòu)造方法前執(zhí)行。缺省的構(gòu)造方法。p1=Personde6ced-一個對象要產(chǎn)生了。構(gòu)造代碼塊在構(gòu)造方法前執(zhí)行。有參的構(gòu)造方法被執(zhí)行了。p1=Personc17164注意:由輸出結(jié)果可知,一個類只有在第一次加載的時候才會執(zhí)行靜態(tài)代碼塊,且靜態(tài)代碼塊只執(zhí)行一次。構(gòu)造代碼塊在調(diào)用

45、構(gòu)造方法之前執(zhí)行,且每調(diào)用一次構(gòu)造方法,構(gòu)造代碼塊都會執(zhí)行一次。構(gòu)造方法在構(gòu)造代碼塊之后執(zhí)行。引用型變量存儲的是對象的地址,而非對象本身。在結(jié)束main方法之前,p1引用曾兩次指向不同的對象。整個程序在內(nèi)存中是什么樣的呢?畫圖說明。模擬內(nèi)存中對各個變量及對象是如何分配空間的。5.7、代碼塊與關(guān)鍵字此處要講的關(guān)鍵字都是可以作為一條語句來使用的。我們主要研究如下幾個關(guān)鍵字的特性。Java中的關(guān)鍵字都是小寫的。1) return:跳出方法,跳到方法調(diào)用處,程序依然可以向下運行;2) break:防止case語句穿透,跳出當前循環(huán);3) continue:只能在循環(huán)中使用,表示直接進入下一次循環(huán),循環(huán)

46、中的continue之后的語句不再執(zhí)行;4) 要想結(jié)束程序的運行,可以使用Systeme.exit(int)方法。public class Test public int get(int a, int b)return a + b;/帶值跳出方法到方法調(diào)用處。public void set(int a)int b = a;b+=b;return;/直接跳出方法,至方法調(diào)用處。/a = b;/return之后不能再有語句。public class Test public static void main(String args) for(int a = 1; a < 10; a+)if(a

47、=4)break;/跳出當前循環(huán)。System.out.println("a="+a);System.out.println("for循環(huán)結(jié)束,程序繼續(xù)運行。");public class Test2 public static void main(String args) for(int a = 1; a < 10; a+)if(a=4)continue;/直接進入下次循環(huán)。System.out.println("a="+a);System.out.println("for循環(huán)結(jié)束,程序繼續(xù)運行。");5.

48、8、對象與引用(this)我們java程序員,一般只操作內(nèi)存的棧區(qū),而不操作內(nèi)存的堆區(qū)。局部變量在棧區(qū)分配空間,而java中引用型數(shù)據(jù)(即對象)是在內(nèi)存的堆區(qū)分配空間的。因此我們需要在棧區(qū)定義一個變量來保存堆區(qū)對象的地址。通過該局部變量來反復操作堆區(qū)中的對象。因此java中的非基本數(shù)據(jù)類型的變量又叫引用。當然我們也可以在棧區(qū)中直接操作對象,即該對象創(chuàng)建之后,要一直“抓住”不放,否則再也無法使用該對象。這樣的對象又叫“匿名對象”。public class Test public static void main(String args) new Person("whz").r

49、un();/匿名對象調(diào)用run方法。Person p = new Person("wanghz");/p是指向堆中對象的引用。System.out.println(p);/引用中保存的是堆中對象的地址。System.out.println();p.run();/通過引用p訪問堆中的對象。class PersonString name;Person(String n)name = n;public void run()System.out.println("run();");以上代碼在內(nèi)存中的狀態(tài):非靜態(tài)方法在內(nèi)存中是這樣存儲的,類的完整路徑名

50、加引導符加方法名,并且在方法的形參列表處,永遠是在第一個位置定義一個接受自身類型的變量。從而將調(diào)用該方法的引用傳遞給該方法的臨時變量,以區(qū)分不同對象。class Personpublic void run()System.out.println("run();");public static void main(String args) Person p = new Person();p.run();/Person.run(p);5.8.1、當前類的默認引用thisthis就是一個指向當前類的某個對象的引用。this只能在方法內(nèi)部使用。它的類型就是所在類的類型。如果this

51、調(diào)用構(gòu)造方法,構(gòu)造方法的調(diào)用必須是構(gòu)造方法中的第一條語句,只能在構(gòu)造方法中通過this()調(diào)用構(gòu)造方法。Package com.test;class PersonString name;Person(String n)name = n;public void print()System.out.println("this="+this);System.out.println("="+);public static void main(String args) Person p = new Person("wh

52、z");System.out.println("p="+p);System.out.println("="+);p.print();/方法的本質(zhì)是:Person.print(p);=>this = p;看結(jié)果:p=com.test.P=whzthis=com.test.P=whz可以看出引用p和默認引用this是指向的同一個對象。借助this實現(xiàn)方法的鏈式調(diào)用:要想讓某方法可以被鏈式調(diào)用,要保證該方法返回一個自身所在類的類型。class Pe

53、rsonpublic Person print()/該方法可以實現(xiàn)鏈式調(diào)用。System.out.println("this="+this);return this;public static void main(String args) new Person().print().print().print();借用this區(qū)分成員變量和局部變量:class PersonString name;Person(String name)name = name;public static void main(String args) System.out.println(new

54、Person("whz").name);/輸出結(jié)果是:null以上程序輸出的name是null,說明屬性name的值沒有被改變。原因是變量的就近原則,構(gòu)造方法中的”name = name;”的意思是局部變量賦給了局部變量,而沒有改變屬性name的值??梢宰鋈缦滦薷?,解決該問題。class PersonString name;Person(String name) = name;public static void main(String args) System.out.println(new Person("whz").name);因為this是當前類的一個引用,這個引用this指向的就是main方法中的匿名對象;從而就是指堆中匿名對象的name屬性。從

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
  • 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

提交評論