2023年JAVA程序員必讀基礎篇類和繼承_第1頁
2023年JAVA程序員必讀基礎篇類和繼承_第2頁
2023年JAVA程序員必讀基礎篇類和繼承_第3頁
2023年JAVA程序員必讀基礎篇類和繼承_第4頁
2023年JAVA程序員必讀基礎篇類和繼承_第5頁
已閱讀5頁,還剩11頁未讀, 繼續(xù)免費閱讀

下載本文檔

版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領

文檔簡介

JAVA程序員必讀:基礎篇(4)類和繼承這節(jié)教程將開始討論對象的生命周期。涉及如何創(chuàng)建對象、如何使用它以及在不使用它的時候將它從系統(tǒng)中清除。下面一個一個介紹:4.1對象的生命周期在這一小節(jié)中你可以學到如何創(chuàng)建和使用任何類型的對象,還討論了當對象不再需要的時候系統(tǒng)如何清除對象的。典型的JAVA程序創(chuàng)建對象,對象之間的交互是通過發(fā)送消息來實現(xiàn)的。通過這些對象的交互,JAVA程序可以執(zhí)行一個GUI、運營一個動畫或者通過網(wǎng)絡發(fā)送和接受信息。一旦對象已經(jīng)完畢了任務,它就被作為無用信息被回收,它的資源可以由其它對象回收運用。以下是一個小的例子程CreateObjectDemo,它創(chuàng)建三個對象:一個是Point對象和兩個Rectange對象,你需要這三個源程序才可以編譯這個程序:publicclassCreateObjectDemo{publicstaticvoidmain(String[]args){//創(chuàng)建一個Point對象和兩個Rectangle對象Pointorigin_one=newPoint(23,94);Rectanglerect_one=newRectangle(origin_one,100,200);Rectanglerect_two=newRectangle(50,100);//顯示rect_one的寬、高以及面積System.out.println("Widthofrect_one:"+rect_one.width);System.out.println("Heightofrect_one:"+rect_one.height);System.out.println("Areaofrect_one:"+rect_one.area());//設立rect_two的位置rect_two.origin=origin_one;//顯示rect_two的位置System.out.println("XPositionofrect_two:"+rect_two.origin.x);System.out.println("YPositionofrect_two:"+rect_two.origin.y);//移動rect_two并且顯示它的新位置rect_two.move(40,72);System.out.println("XPositionofrect_two:"+rect_two.origin.x);System.out.println("YPositionofrect_two:"+rect_two.origin.y);}}一旦創(chuàng)建了對象,程序就可以操作對象并將它們有關的一些信息顯示出來,以下是這個程序的輸出結果:Widthofrect_one:100Heightofrect_one:200Areaofrect_one:20230XPositionofrect_two:23YPositionofrect_two:94XPositionofrect_two:40YPositionofrect_two:72這一節(jié)使用這個例子來在程序中描述對象的生命周期。從這你可以學到如何編寫代碼來創(chuàng)建、使用對象以及系統(tǒng)如何將它從內存中清除的。4.1對象的生命周期下面重要提成幾部分來討論:1.

創(chuàng)建對象使用對象清除沒有使用的對象4.1.1創(chuàng)建對象眾所周知,可以從類來創(chuàng)建對象。下面的幾條語句都是用來創(chuàng)建對象的,它們都是來自上面程序CreateObjectDemo程序:Pointorigin_one=newPoint(23,94);Rectanglerect_one=newRectangle(origin_one,100,200);Rectanglerect_two=newRectangle(50,100);上面第一條語句從Point類創(chuàng)建了一個對象,而第二條和第三條語句是從Rectangle類眾創(chuàng)建了對象。但是每條語句都有三部分組成:1.

聲明:Pointorigin_one、Rectanglerect_one以及Rectanglerect_two都是變量的聲明,它們的格式是類型后加變量名。當你創(chuàng)建一個對象的時候,你不必聲明一個變量來引用它。然而,變量生命經(jīng)常出現(xiàn)在創(chuàng)建對象代碼的相同行上。實例化:new是JAVA運算符,它可以創(chuàng)建新的對象并且為對象分派了內存空間。初始化:new運算符后跟著一個構造函數(shù)的調用。比如Point(23,94)就是一個Point類的構造函數(shù)的調用。這個構造函數(shù)初始化了這個新對象。下頁也對這幾個部分逐個介紹:聲明一個變量來引用對象從前面的教程,你應當知道了如何聲明一個變量了,你可以這樣來編寫:typename其中type是數(shù)據(jù)類型,而name是變量名。除了原始類型(比如int和boolean),JAVA平臺還直接提供了類和接口也是數(shù)據(jù)類型。這樣為了聲明一個變量來引用對象,你可以使用類或者接口的名字作為變量的類型。下面的例程使用了Point和Rectangle類作為類型來聲明變量:Pointorigin_one=newPoint(23,94);Rectanglerect_one=newRectangle(origin_one,100,200);Rectanglerect_two=newRectangle(50,100);聲明沒有創(chuàng)建新對象。Pointorigin_one代碼沒有一個新的Point對象,它只是聲明一個變量orgin_one,它將用來引用Point對象。這個引用暫時是空的直到被賦值了。一個空的引用就是一個NULL引用。實例化對象為了創(chuàng)建一個對象你必須用new來實例化它。New運算符是通過為新對象分派內存來實例化一個類的。這個new運算符需要一個后綴參數(shù),即構造函數(shù)的一個調用。構造函數(shù)的名字提供了要初始化類的名字。構造函數(shù)初始化了新的對象。New運算符號返回一個引用給它創(chuàng)建的對象的。通常,這個引用被賦值為適當類型的變量。初始化對象以下是Point類的代碼:publicclassPoint{publicintx=0;publicinty=0;//一個構造函數(shù)publicPoint(intx,inty){this.x=x;this.y=y;}}

這個類包含了一個構造函數(shù)。你可以辨認這個構造函數(shù)由于它跟類的名字是相同名字的,它沒有任何的返回類型。這個在Point類中的構造函數(shù)有兩個整型參數(shù),它是由代碼(intx,inty)來定義的。下面的整數(shù)23和94就是這個參數(shù)的數(shù)值:Pointorigin_one=newPoint(23,94);初始化對象下面是Rectangle類的代碼,它包含了四個構造函數(shù):publicclassRectangle{publicintwidth=0;publicintheight=0;publicPointorigin;//四個構造函數(shù)publicRectangle(){origin=newPoint(0,0);}publicRectangle(Pointp){origin=p;}publicRectangle(intw,inth){this(newPoint(0,0),w,h);}publicRectangle(Pointp,intw,inth){origin=p;width=w;height=h;}//用于移動rectangle的方法publicvoidmove(intx,inty){origin.x=x;origin.y=y;}//用于計算矩形面積的方法publicintarea(){returnwidth*height;}}每一個構造函數(shù)可以讓你為矩形的各個方法提供初始數(shù)值,你可以設立矩形的原點、寬度和高度。假如一個類中有多個構造函數(shù),它們的名字都是相同的只是它們有不同類型的參數(shù)或者不同數(shù)目的參數(shù)。JAVA平臺可以根據(jù)參數(shù)的不同數(shù)目和類型類來區(qū)分構造函數(shù)。當JAVA平臺碰到的代碼的時候,它就調用在Rectangle類中的構造函數(shù),這個函數(shù)需要一個Point參數(shù)以及兩個整型參數(shù):Rectanglerect_one=newRectangle(origin_one,100,200);這個調用初始化了矩形的原點(orgin_one)。代碼也設立了矩形的寬度(100)和高度(200)。初始化對象多個引用可以引用相同的對象。下面的代碼行調用了需要兩個整型參數(shù)的構造函數(shù),它為寬度和高度提供了初始化數(shù)值。假如你仔細看看這個代碼,你會發(fā)現(xiàn)它創(chuàng)建一個Point對象,它的x和y數(shù)值被初始化為0。下面的Rectangle構造函數(shù)沒有任何參數(shù):Rectanglerect=newRectangle();假如一個類沒有顯性聲明任何構造函數(shù),JAVA平臺自動提供一個沒有參數(shù)的構造函數(shù),這是一個缺省的構造函數(shù),它沒有完畢任何事情。這樣,所有的類就至少有一個構造函數(shù)。4.1.2使用對象一旦你創(chuàng)建了一個對象,你也許想使用它來做一些事情。你也許從它得到一些信息,或者想改變它的狀態(tài)或者讓它來完畢一些動作。對象允許你做以下兩件事情:1.

操作或者檢查它的變量。調用它的方法。引用對象的變量下面是引用對象變量的基本形式,它是使用了有條件的名字即長名字:objectReference.variableName當實例變量處在作用域內的時候,你可認為實例變量使用一個簡樸的名字,也就是說,在對象類的代碼中。處在對象類外面的代碼必須使用有條件的名字。比如,在CreateObjectDemo類中的代碼處在類Rectangle類代碼的外面。所認為了引用Rectangle對象rect_one的origin、width和height變量,CreateObjectDemo必須相應使用rect_one.origin、rect_one.width和rect_one.height。這個程序使用了rect_one的width和height:System.out.println("Widthofrect_one:"+rect_one.width);System.out.println("Heightofrect_one:"+rect_one.height);假如直接使用在CreateObjectDemo類中的變量width和height,那就將產生一個編譯錯誤。在后面,程序還將使用類似的代碼來顯示關于rect_two的信息。相同類型的對象將有相同實例變量的副本。這樣,每一個Rectangle對象就都有變量origin、width和height了。當你通過對象引用來訪問實例變量的時候,你就引用了特定對象的變量。在CreateObjectDemo程序有兩個對象rect_one和rect_two,它們有不同的origin、width和height變量:對象的長文獻名的第一部分是對象引用,它必須是一個對象的引用。這里你可以使用引用變量的名字,或者你可以使用任何的表達式來返回一個對象引用。重新調用這個new運算符可以返回一個對象的引用。這樣你可以使用從new返回的數(shù)值來訪問一個新的對象變量:intheight=newRectangle().height;這個語句創(chuàng)建了一個新的Rectangle對象并且得到它的height(高度)。從本質上講,這條語句計算了Rectangle缺省的高度。這里注意,在這條語句被執(zhí)行后,程序不再有創(chuàng)建了的Rectangle的引用,由于程序不再在變量中存儲這個引用。對象就被取消引用,而它的資源可以JAVA平臺重新使用。關于變量訪問運用其它對象和類對對象變量直接的操作是不允許的,由于有也許為變量設立的數(shù)值沒有任何的意義。比如,我們使用前面教程中的Rectangle類,你可以創(chuàng)建一個矩形,它的width和height都是負的,但是它是沒故意義的。較好的做法是:不采用直接對變量進行操作,類提供一些方法,其它的對象可以通過這些方法來檢查或者改變變量。這些方法要保證變量的數(shù)值是故意義的。這樣,Rectangle類將提供setWidth、setHeight、getWidth以及getHeight方法來設立或者獲得寬度和高度。這些用于設立變量的方法將在調用者試圖將width和height設立為負數(shù)的時候報告一個錯誤。使用方法而不使用直接變量訪問的好處尚有:類可以改變變量的類型和名字來存儲width和height而沒有影響它的客戶程序。但是,在實際情況下,有時允許對對象變量直接訪問。比如,通過定義Point類和Rectangle類為public,它們都允許對它們的成員變量自由訪問。JAVA編程語言提供了一個反問控制機制,憑它,類可以決定什么其它的類可以直接訪問它的變量。假如其它對象對類直接操作也許導致無意義的話,類可以保護變量。改變這些變量應當運用方法調用來控制。假如類授權訪問給它的變量,你可以檢查和改變這些變量而但不能導致不利的效果。調用對象的方法同樣你可以使用有限制的名字(長名字)來調用對象的方法。有限制的名字的格式是:在對象引用的后面加上點(.)再跟著方法的名字,即對象引用.方法名字。同樣你還可以運用圓括號(和)來為方法提供參數(shù)。假如方法不需要任何參數(shù)就留空它:objectReference.methodName(argumentList);orobjectReference.methodName();Rectangle類有兩個方法:area和move,即計算矩形的面積和改變矩形的原點。這里是CreateObjectDemo代碼,它調用這兩個方法:System.out.println("Areaofrect_one:"+rect_one.area());...rect_two.move(40,72);上面的第一條語句調用rect_one的area方法并顯示結果。第二條語句是移動rect_two,由于move方法為對象的原點坐標x和y賦了新值。其中objectReference必須是一個對象的引用。你可以使用一個變量名字,并且你也可以使用任何表達式來返回對象的引用。而new運算符返回一個對象的引用,因此你可以使用從new返回的數(shù)值來調用一個新的對象方法:newRectangle(100,50).area()表達式newRectangle(100,50)返回一個對象引用,它是引用一個Rectangle對象。上面已經(jīng)提到,你可以使用點符號(.)來調用新的Rectangle的面積方法以計算新矩形的面積。此外方法area也返回一個數(shù)值。對于這些返回數(shù)值的方法,你可以使用在表達式中使用方法調用。你可以指定返回的數(shù)值給變量,參見如下的例子:intareaOfRectangle=newRectangle(100,50).area();這里要提醒一下,在特定對象中調用一個方法跟發(fā)送一個信息給對象是相同的。關于方法訪問在Point和Rectangle類中的方法都被聲明為public,因此它們可以被任何其它的類所訪問。有時,類需要限制訪問它的方法。比如,一個類也許也許有一個方法,只有它的子類才干調用它。類可以在它用于控制訪問它的變量的時候,使用相同的機制來對它的方法進行控制訪問。4.1.3清除沒有使用的對象有些面向對象語言需要保持對所有對象的跟蹤,所以需要在對象不再使用的使用來將它從內存中清除。管理內存是一個很沉悶的事情并且容易犯錯。JAVA平臺允許你創(chuàng)建任意個對象(當然會受到系統(tǒng)的限制),所以你也不必要老是要將它清除。JAVA是在當對象不再使用的使用被清除的。這個過程就是所謂的“垃圾收集”。當對象不再有引用的時候,對象就會被清除,即作為垃圾收集的對象。保存在變量中的引用通常在變量超過作用域的時候被清除?;蛘?,你可以通過設立變量為NULL來清除對象引用。這里注意,程序中同一個對象可以有多個引用,對象的所有引用必須在對象被作為垃圾收集對象清除之前清除。下面講講垃圾收集器:JAVA有一個立即收集器,它周期性地講不再被引用的對象從內存中清除。這個垃圾收集器是自動執(zhí)行的,雖然有時候你也許想通過調用系統(tǒng)類的gc方法來顯性運營垃圾收集程序。比如,你也許想在創(chuàng)建大量垃圾代碼之后或者在需要大量內存代碼之前運營垃圾收集器。垃圾收集器從內存中清除不再被引用的對象的機制已經(jīng)被要到了VB.net和C#中去了。最后介紹對象finalize方法:在一個對象得到垃圾收集之前,垃圾收集器在對象自己調用對象的finalize方法之后給對象一個機會來從內存中清除掉。這個過程就是所說的最后解決。絕大部分的程序員不得不關系這個finalize方法的執(zhí)行。在少數(shù)情況下,程序員不得不執(zhí)行finalize方法來釋放資源。Finalize方法是一個對象類的成員函數(shù),它處在JAVA平臺類分級結構的頂部,并且是所有類的子類。這個類重載了finalize方法來完畢對象的最后解決工作。4.2字符和字符串字符數(shù)據(jù)(不管是單一字符或者一系列的字符)可以運用java.lang三個類來儲存和操作,這三個類分別為:Character、String和StringBuffer。JAVA平臺包含了三個類,在解決字符數(shù)據(jù)的時候你可以使用這三個類:1.

Character:這個類的實例可以容納單一的字符數(shù)值。這個同樣定義了簡潔的方法來操作或者檢查單一字符數(shù)據(jù)。String:這個類用于解決由多個字符組成的不可變數(shù)據(jù)。StringBuffer:這個類用于存儲和操作由多個字符組成的可變數(shù)據(jù)。下面開始具體介紹字符:字符類型的對象包含了單一字符數(shù)值。你可以在對象需要的時候使用一個字符對象取代原始字符類型。比如,當傳遞一個字符給改變數(shù)值的方法或者當放置一個字符到一個數(shù)據(jù)結構中,比如一個矢量等等。下面的例程序CharacterDemo創(chuàng)建了一些字符對象并顯示一些信息。這個程序的數(shù)據(jù)結果為:aislessthanb.aisequaltoa2.Thecharacteraislowercase.4.2字符和字符串CharacterDemo程序調用以下由Character類提供的構造函數(shù)和方法:Character(char)Character類只是構造函數(shù),它創(chuàng)建了一個Character對象包含了由參數(shù)提供的數(shù)值。一旦Character對象被創(chuàng)建,它包含的數(shù)值就不能改變。compareTo(Character)一個實例方法比較了由兩個Character對象容納的數(shù)值:方法被調用的對象(即例子中的a)以及方法的參數(shù)(即例子中的b)。這個方法返回一個整數(shù)表白在當前對象中的數(shù)值是否大于、等于或者小于參數(shù)給定的數(shù)值。假如字母的數(shù)值較大那么這個字母就較大。equals(Object)一個實例方法,它比較當前對象容納的數(shù)值和由其它容納的數(shù)值。這個方法在兩個對象容納的數(shù)值相等的時候返回true。toString()一個實例方法,它將對象轉換為字符串。結果的字符串在長度上就是一個Character對象并且它包含了有這個Character對象容納的數(shù)值。charValue()一個實例方法,它返回由Character對象容納的數(shù)值作為原始字符數(shù)值。isUpperCase(char)類方法決定是否原始字符數(shù)值為大寫。這個是許多Character類方法中的一個,它可以檢查或者操作字符數(shù)據(jù)。下面我們再談談于string(字符串)有關的幾個問題:1.

為什么有兩個String類:String和StringBuffer創(chuàng)建Strings和StringBuffers存取器函數(shù)修改StringBuffers將對象轉換為Strings將String轉換為數(shù)字Strings和JAVA編譯器下頁接著一個一個加以細講。1)為什么有兩個String類:String和StringBufferJAVA平臺提供了兩個類:String和StringBuffer,它們可以儲存和操作字符串,即包含多個字符的字符數(shù)據(jù)。這個String類提供了數(shù)值不可改變的字符串。比如,假如你編寫一個方法,它需要字符串數(shù)據(jù)并且方法不能修改字符串,而要將一個String對象傳遞給方法。而這個StringBuffer類提供的字符串進行修改。當你直到字符數(shù)據(jù)要改變的時候你就可以使用StringBuffer。典型地,你可以使用StringBuffers來動態(tài)構造字符數(shù)據(jù)。比如,從一個文獻讀文本數(shù)據(jù)。由于Strings是常量,所以它用起來比StringBuffers更有效,并且可以共享。因此在允許的情況下還是使用Strings。下面是一個例程StringsDemo,它反轉了字符串中的字符。這個程序同時使用了String和StringBuffer:publicclassStringsDemo{publicstaticvoidmain(String[]args){Stringpalindrome="DotsawIwasTod";intlen=palindrome.length();StringBufferdest=newStringBuffer(len);for(inti=(len-1);i>=0;i--){dest.append(palindrome.charAt(i));}System.out.println(dest.toString());}}這個程序的輸出為:doTsawIwastoD2)創(chuàng)建Strings和StringBuffers字符串經(jīng)常是由雙引號括起的一系列字符組成。比如,當有以下的字符串,JAVA平臺就創(chuàng)建一個String對象,它的數(shù)值為Goodluck。"Goodluck"這個StringsDemo程序使用這個記述來創(chuàng)建字符串,它是由palindrome變量引用的:Stringpalindrome="DotsawIwasTod";同樣你可以運用其它方法來創(chuàng)建String對象:使用new關鍵字和構造函數(shù)。String類提供了幾個構造函數(shù),它允許你提供字符串的初始值,它們是使用不同的資源的,比如字符的數(shù)組、字節(jié)的數(shù)組或者一個StringBuffer。char[]helloArray={'h','e','l','l','o'};helloString=newString(helloArray);System.out.println(helloString);上面的這段程序輸出為:hello。你必須使用new來創(chuàng)建一個StringBuffer。StringsDemo程序創(chuàng)建了SringBuffer,它是由dest引用的,這里使用了設立緩沖區(qū)容量的構造函數(shù)。Stringpalindrome="DotsawIwasTod";intlen=palindrome.length();StringBufferdest=newStringBuffer(len);這個代碼創(chuàng)建了一個字符串的緩沖區(qū),這個緩沖區(qū)的容量等于被palindrome引用的字符串的長度。這個保證了為dest只分派一個內存,由于它只有包含被復制的字符串那么大的空間。通過初始化字符串的緩沖區(qū)的容量,你最小化必須分派的內存空間。這就使得你的代碼更加有效,由于內存分派是相對高級的操作。(3)存取器函數(shù)一方面講解一下獲得String或者StringBuffer的長度:獲得有關對象信息的方法稱為存取器函數(shù)。你可以用在字符串和字符串緩沖區(qū)的一個存取器方法是length方法,它可以包含在字符串或者字符串緩沖區(qū)的字符的個數(shù)。下面給出一個例程,當這個程序執(zhí)行后,len就將等于17:Stringpalindrome="DotsawIwasTod";intlen=palindrome.length();除了length,StringBuffer類尚有一個方法叫做capacity,它是返回為字符串緩沖區(qū)分派的空間大小而不是空間使用了多少。比如,字符串緩沖區(qū)的容量在StringsDemo例程中被dest引用時,它是不能改變的,雖然它的長度在每次的循環(huán)中增長1。如圖15,給出了在dest里面已有9個字符之后的容量和長度。

(圖15)一個字符串緩沖區(qū)的長度是它包含的字符的個數(shù)。一個字符串緩沖區(qū)的容量是被分派的字符空間的數(shù)量。而String類沒有capacity方法,由于字符串不能改變。下面講講索引String或者StringBuffer得到字符:你可以通過使用charAt存取器來在一個特定的位置索引一個字符串或者字符串緩沖區(qū)以得到字符串。第一個字符的索引是0,最后一個字符的索引是length()-1。比如,下面的代碼在字符串中得到索引為9的字符:StringanotherPalindrome="Niagara.Oroaragain!";charaChar=anotherPalindrome.charAt(9);由于索引是從0開始的,所以索引為9的字符為'O',如圖16所示:(圖16)使用charAt方法來在特定的索引下得到字符。如圖16所示給處了計算字符串最后一個字符的索引的方法,你必須將length方法返回的數(shù)值減去1才得到最后一個字符的索引。(3)存取器函數(shù)假如你想從一個字符串或者字符串緩沖區(qū)得到多個字符,你可以使用substring方法。這個substring方法有兩個版本,如下表所示:方法描述Stringsubstring(int)返回一個新的字符串,它是這個字符串或者字符串緩沖區(qū)的一個子串。第一個整數(shù)參數(shù)指定了第一個字符的索引。第二個整數(shù)參數(shù)是最后字符-1的索引。這個子串的長度就是第二個整數(shù)減去第一個整數(shù)。假如第二個整數(shù)沒有,那么substring就擴展到整個字符串的結尾。Stringsubstring(int,int)下面的代碼是得到字符串"Niagara.Oroaragain!"從索引為11到索引為15之間的子串,結果得到單詞"roar":StringanotherPalindrome="Niagara.Oroaragain!";Stringroar=anotherPalindrome.substring(11,15);如圖17所示:(圖17)使用substring方法來得到字符串或者字符串緩沖區(qū)的一部分。這里一定要記住索引是從0開始的。(4)修改StringBuffersreverseIt方法使用StringBuffer的append方法來增長一個字符到dest字符串末尾:classReverseString{publicstaticStringreverseIt(Stringsource){inti,len=source.length();StringBufferdest=newStringBuffer(len);for(i=(len-1);i>=0;i--){dest.append(source.charAt(i));}returndest.toString();}}假如這個被增長的字符導致StringBuffer的大小超過當前的容量,這個StringBuffer就會為它分派更多的內存。由于內存分派示相對高級的操作,所以你可以同時初始化StringBuffer的容量為較合理的大小來使你的代碼更有效率。比如reverseIt方法以初始的容量來構造StringBuffer等于源字符串的長度,以只為dest分派一次內存。4)修改StringBuffers用在reverseIt的append方法只是一個StringBuffer方法的其中一種,它在StringBuffer末尾增補了一個數(shù)據(jù)。有幾種append方法來增補各個類型的數(shù)據(jù)(比如float、int、boolean以及對象)到StringBuffer末尾。但是在增補操作之前,數(shù)據(jù)都要先轉換為字符串。下面講講插入字符:有時候,你也許想插入數(shù)據(jù)到StringBuffer中間。你可以使用StringBuffer的insert方法來實現(xiàn)。以下的這個例子就是介紹如何將一個字符串插入到StringBuffer中去的:StringBuffersb=newStringBuffer("DrinkJava!");sb.insert(6,"Hot");System.out.println(sb.toString());這些代碼將輸出:DrinkHotJava!運用StringBuffer的許多insert方法,你可以在插入數(shù)據(jù)之前指定索引。在上面的例子中,"Hot"要插到"Java"的'J'之前。由于索引是從0開始的,所以'J'的索引為6。為了插入數(shù)據(jù)到StringBuffer之前,使用索引0.為了在StringBuffer的末尾插入數(shù)據(jù),你可以將所以等于StringBuffer的長度或者使用append方法來增補。下面討論設立字符:此外一個有用的StringBuffer修改量是setCharAt,它在StringBuffer的指定位置用參數(shù)列表中的指定字符來替換字符。SetCharAt在你想重新使用StringBuffer的時候是很有用的。(5)將對象轉換為Strings一方面介紹toString方法:經(jīng)常需要將一個對象轉換為String,由于你需要將它傳遞給方法,而這個方法只接受String數(shù)值。前面我們使用reverseIt方法使用了StringBuffer的toString方法來將StringBuffer轉換為String對象。classReverseString{publicstaticStringreverseIt(Stringsource){inti,len=source.length();StringBufferdest=newStringBuffer(len);for(i=(len-1);i>=0;i--){dest.append(source.charAt(i));}returndest.toString();}}所有的類從對象類繼承了toString,并且在java.lang包的許多類重載了這個方法來提供一個很故意義的方法下面說說valueOf方法:簡樸起見,String類提供了一個類方法valueOf。你可以使用valueOf來轉換不同類型的變量為String。比如,為了打印pi的數(shù)值,你可以這樣來編寫代碼:System.out.println(String.valueOf(Math.PI));6)將String轉換為數(shù)字String類自身沒有提供任何的方法來轉換String為浮點型、整型或者其它的數(shù)值類型。但是,"typewrapper"類的四種類型(integer、Double、Float和Long)提供了一個類方法valueOf來將String轉換為那個類型的對象。舉例如下:StringpiStr="3.14159";Floatpi=Float.valueOf(piStr);(7)Strings和JAVA編譯器JAVA編譯器使用了String和StringBuffer類來解決字符串和字符串的連接。下面先講講Strings:在JAVA種,你可以在雙引號之間指定字符串,如:"HelloWorld!"你可以在任何使用String對象的地方使用字符串。比如,System.out.println接受一個String參數(shù),所以你可以在這里使用字符串了。System.out.println("MightIaddthatyoulooklovelytoday.");同樣,你可以使用從字符串直接使用String方法,比如:intlen="GoodbyeCruelWorld".length();由于編譯器自動為字符串創(chuàng)建了一個新的String對象,你可以使用字符串來初始化一個String對象:Strings="HolaMundo";上面的這條語句等價于下面的語句:Strings=newString("HolaMundo");最后講講字符串的連接以及+運算符:在JAVA種,你可以使用+來連接字符串,比如:Stringcat="cat";System.out.println("con"+cat+"enation");這條語句看起來有點問題,由于我們直到Strings是不能改變的。但是,在這條語句的背后,編譯器卻使用了StringBuffers來執(zhí)行字符串的連接。上面的語句事實上編譯為:Stringcat="cat";System.out.println(newStringBuffer().append("con").append(cat).append("enation").toString());同樣你可以使用+運算符號來增不一個String:System.out.println("Java'sNumber"+1);在JAVA中,在執(zhí)行字符串連接操作之前編譯器講非String的數(shù)值(如本例的整數(shù)1)轉化為一個String對象。4.3數(shù)字為了解決數(shù)值類型,你可以使用Number類。這個Number類是所有在JAVA平臺中所有數(shù)字類的父類。它的子類涉及Float、Interger等等。本節(jié)教程將討論java.lang和它的子類中的Number類。特別地,這節(jié)教程要討論為什么你需要這些類,并指出通用的方法和類變量,以及向你介紹如何將實例轉換為字符串。此外,這節(jié)教程還討論你需要的其它類來解決數(shù)字。比如,假如你需要以某個特殊格式來顯示數(shù)字的時候,你可以使用在java.test中的NumberFormat和DecimalFormat類來格式化它。同時,java.lang中的Math包含了類方法來執(zhí)行數(shù)學函數(shù)。這個類尚有用于三角函數(shù)、指數(shù)函數(shù)等等的方法。如圖18所示:(圖18)數(shù)字類包含:1.

Number:這個抽象類Number是Byte、Double、Float、Integer、Long和Short的父類。Number的子類必須提供將數(shù)值轉換為byte、double、float、int、long以及short的方法。Byte:這個類是Number的子類,它是用于字節(jié)數(shù)值的標準wrapper。Double:這個Double類在對象中包裝了原始類型double。Double類的對象包含單一類型(double)的對象。此外,這個類提供了幾個用于將double轉換為String或者將String轉換為double的方法。Float:這個Float類在對象中包裝了原始類型Float。Float類的對象包含單一類型(Float)的對象。此外,這個類提供了幾個用于將Float轉換為String或者將String轉換為Float的方法。Integer:這個Integer類在對象中包裝了原始類型Integer。Integer類的對象包含單一類型(Integer)的對象。此外,這個類提供了幾個用于將Integer轉換為String或者將String轉換為Integer的方法。Long:這個Long類在對象中包裝了原始類型Long。Long類的對象包含單一類型(Long)的對象。此外,這個類提供了幾個用于將Long轉換為String或者將String轉換為Long的方法。Short:這個類是用于short數(shù)值的標準wrapper。4.3數(shù)字8.BigDecimal:不可變的、任意精度的有符號的十進制數(shù)字。BigDecimal包含了任意精度的整型數(shù)和非負的32位的整型數(shù),BigDecimal提供了用于基本算術運算、比較、格式轉換等等的操作。這個BigDecimal類給了用戶對舍入行為的完全控制,并且逼迫用戶為舍棄精度的操作顯性指定一個舍入行為?;谶@個目的有八種舍入模式。對BigDecimal有兩種類型的操作:比例/舍入操作和十進制點移動操作。比例/舍入操作返回一個BigDecimal,它的數(shù)值大約或者精確地等于運算對象,但是它的數(shù)值范圍要指定,也就是說,它們可以對它的數(shù)值最小的影響來增長或者減少數(shù)字的精度。十進制點移動操作(movePointLeft和movePointRight)返回一個由運算對象創(chuàng)建的BigDecima,它是通過在指定方向和指定距離來移動十進制點的。為了達成簡短和清楚的目的,偽代碼用在了BigDecimal方法的描述中。比如偽代碼表達式(ij)就代表了“BigDecimal的數(shù)值是由BigDecimali加上BigDecimalj的數(shù)值”。而偽代碼表達式(i="=j)代表“當且僅當BigDecimal"i的數(shù)值與BigDecimalj相同的時候才為true”。其它的偽代碼表達式也有類似的解釋。BigInteger:不可變任意精度的整型數(shù)。BigInteger為所有的Java原始整型操作以及所有在java.lang.Math中的相關方法提供相似的操作。此外BigInteger偽模數(shù)運算、GCD計算、位操作等等提供了運算。算術運算的語義模仿了定義在JAVA語言規(guī)范中的Java的整型算術運算。比如,假如除數(shù)為0就會導致ArithmeticException(算術異常)等等。所有在規(guī)范中的溢出都將被忽略,由于BigIntegers將盡量適應運算結果的需要。而移位操作擴展了Java的移位操作,它允許負方向的移位。以負的位距來往右移就相稱于往左移位。而無符號的右移運算符(>>>)這里就不再使用。而按位邏輯操作跟Java的按位操作是相似的。比較運算執(zhí)行有符號的整型比較,它跟Java的是相似的。模數(shù)算術運算提供計算余數(shù)、執(zhí)行乘冪等方法。這些方法總是返回一個非零的結果(介于0到-1之間)。為了簡潔和清楚的目的,偽代碼也用在BigInteger方法中。這個偽代碼表達式(ij)代表了“等于BigIntegeri加上BigIntegerj的BigInteger數(shù)值”。而偽代碼表達式(i="=j)代表了“當且僅當BigInteger"i等于BigIntegerj的時候才返回true”。4.3數(shù)字其它的數(shù)據(jù)類型:1.

Boolean:這個Boolean類在對象中包裝了原始類型Boolean。Boolean類的對象包含單一類型(double)的對象。此外,這個類提供了幾個用于將Boolean轉換為String或者將String轉換為Boolean的方法。Character:這個Character類在對象中包裝了原始類型Character。Character類的對象包含單一類型(Character)的對象。此外,這個類提供了幾個用于將字符由小寫轉換為大寫或者由大寫轉換為小寫的方法。Void:這個Void類是一個占位符類,它保存對代表原始JAVA類void的引用。非基本算術類型Math:這個Math類包含了用于執(zhí)行數(shù)值操作的方法,比如初步的指數(shù)、對數(shù)、平反根以及三角函數(shù)。不象StrictMath類中的有些數(shù)值函數(shù),這個Math類的所有函數(shù)不是定義為返回bit-for-bit相同的結果。這允許更好的執(zhí)行,由于嚴格的再現(xiàn)情已經(jīng)不需要了。缺省地,許多Math函數(shù)簡樸代表了在StrictMath中的等價函數(shù)。代碼發(fā)生器支持使用特殊平臺的本地庫或者微解決器指令以提供性能更高的Math函數(shù)實行。這樣高性能的執(zhí)行必須符合Math的規(guī)范。4.4數(shù)組在任何的編程語言中,數(shù)組都是一個重要的數(shù)據(jù)結構。數(shù)組是一個固定長度的結構,它存儲多個相同類型的數(shù)值。你可以在數(shù)組中集合相同類型的數(shù)值。數(shù)組直接被JAVA編程語言所支持,所以沒有一個數(shù)組類。數(shù)組是一個Object類的一個不明顯的擴展,所以你可以指定一個數(shù)組給一個類型定義為Object的變量。JAVA平臺集合了它的類到功能包中。不是編寫你自己的類,你可以使用有平臺提供的類。這節(jié)教程中要討論的絕大多數(shù)的類都是java.lang包的成員函數(shù)。所有java.lang中的類對你的程序都是有效的。數(shù)組的長度在數(shù)組創(chuàng)建的時候就已經(jīng)擬定。一旦創(chuàng)建以后,數(shù)組就有了固定長度的結構,如圖19所示:

(圖19)數(shù)組元素就是數(shù)組中的一個數(shù)值,可以通過數(shù)組中的位置來訪問它。假如你想在一個結構中存儲不同類型的數(shù)據(jù),或者假如你需要一個長度可以動態(tài)改變的結構,可以使用Collection,比如Vector而不用數(shù)組。本教程中將討論以下的幾個方法:1.

創(chuàng)建和使用數(shù)組合對象的數(shù)組數(shù)組的數(shù)組復制數(shù)組4.4.1創(chuàng)建和使用數(shù)組合以下是個簡樸的程序ArrayDemo,它創(chuàng)建了一個數(shù)組,并放置了一些數(shù)值在上面,然后進行顯示:publicclassArrayDemo{publicstaticvoidmain(String[]args){int[]anArray;//聲明一個整型數(shù)組anArray=newint[10];//創(chuàng)建一個整型數(shù)組//為每一個數(shù)組元素賦值并打印出來for(inti=0;i<anArray.length;i++){anArray[1]=i;System.out.print(anArray[1]+"");}System.out.println();}}這節(jié)教程覆蓋了以下這些內容:1.

聲明一個變量來引用一個數(shù)組創(chuàng)建一個數(shù)組訪問數(shù)組元素獲得數(shù)組的大小數(shù)組初始化程序下一頁將加以具體說明。4.4.1創(chuàng)建和使用數(shù)組合(1)聲明一個變量來引用一個數(shù)組以下的代碼是聲明一個數(shù)組變量:int[]anArray;//聲明整型的數(shù)組象聲明其它類型的變量,一個數(shù)組聲明有兩個組件:數(shù)組的類型和數(shù)組的名字。數(shù)組的類型是這樣來寫的type[],其中type可以是float、boolean、Object、String等,而[]代表了這是一個數(shù)組。這里記住在數(shù)組中的所有元素都是相同類型的。上面的例程中使用了int[],所以數(shù)組anArray就將容納整型數(shù)據(jù)了。以下是聲明其它類型的數(shù)組:float[]anArrayOfFloats;boolean[]anArrayOfBooleans;Object[]anArrayOfObjects;String[]anArrayOfStrings;就象聲明其它類型的變量,聲明數(shù)組變量也沒有為數(shù)組元素分派任何內存。所以必須在引用數(shù)組之前被數(shù)組賦值。4.4.1創(chuàng)建和使用數(shù)組合(2)創(chuàng)建一個數(shù)組你可以使用JAVA的new運算符來創(chuàng)建一個數(shù)組。下面的語句是為10個整型元素分派一個數(shù)組內存:anArray=newint[10];//createanarrayofintegers總得說來,當創(chuàng)建數(shù)組的時候,你可以使用new操作符,后面跟著數(shù)組元素的數(shù)據(jù)類型然后就是用方括號[和]括起來的元素的數(shù)目,格式如下所示:newelementType[arraySize]假如在上面的例程中new語句沒有的話,編譯器將打印除一個如下的錯誤是的編譯發(fā)生錯誤:ArrayDemo.java:4:VariableanArraymaynothavebeeninitialized(變量anArray也許還沒有初始化。)(3)訪問數(shù)組元素既然已經(jīng)給數(shù)組分派了內存,我們來為數(shù)組元素賦值吧:for(inti=0;i<anArray.length;i++){anArray[1]=i;System.out.print(anArray[1]+"");}這部分的代碼給出了如何引用一個數(shù)組元素,或者示為它賦予一個數(shù)值,或者訪問數(shù)值。在方括號之間的數(shù)值指示了要訪問的元素的索引。在JAVA中,數(shù)組的索引是從0開始的并且以-1結束。4.4.1創(chuàng)建和使用數(shù)組合(4)獲得數(shù)組的大小為了獲得數(shù)組的大小,你可以使用下面的代碼:arrayname.length這里還提醒一下:JAVA的新手也許會在length后面加一個圓括號(和)。這樣是否錯誤的,由于length不是一個方法。Length是由JAVA平臺為所有數(shù)組提供的一個屬性。在上面的例程中的for循環(huán)在anArray的每一個元素進行循環(huán),并給每個元素賦值。這個for循環(huán)使用了anArray.length來決定什么時候終止循環(huán)。(5)數(shù)組初始化程序JAVA編程語言為創(chuàng)建和初始化數(shù)組提供了簡捷的語法。一下是這個語法的例子:boolean[]answers={true,false,true,true,false};數(shù)組的length(長度)是由大括號{和}之間的數(shù)值的數(shù)目決定的。4.4.2對象的數(shù)組數(shù)組可以保存引用類型。你可以用創(chuàng)建原始類型數(shù)組的方法來創(chuàng)建這樣一個數(shù)組。以下是一個小的程序ArrayOfStringsDemo,它創(chuàng)建了一個數(shù)組包含了三個String對象并且將這三個字符串以小寫字母的形式打印出來:publicclassArrayOfStringsDemo{publicstaticvoidmain(String[]args){String[]anArray={"StringOne","StringTwo","StringThree"};for(inti=0;i<anArray.length;i++){System.out.println(anArray[1].toLowerCase());}}}這個程序中用單一的語句創(chuàng)建和操作了數(shù)組。但是,你可以創(chuàng)建一個數(shù)組而不用在里面放置任何元素。這對于JAVA新手將是一個容易犯錯的地方。假如有以下的代碼:String[]anArray=newString[5];一旦這條語句被執(zhí)行了,數(shù)組anArray就存在了并且有充足的空間來容納5個String對象。但是,數(shù)組并不包含任何的字符串,它是空的。程序必須顯性地創(chuàng)建字符串并將他們放置到數(shù)組中。這本來示很顯然的事情,但是許多JAVA的新手會認為上面的語句已經(jīng)創(chuàng)建了數(shù)組并創(chuàng)建了5和個空的字符串在里面了。這樣他們會象如下進行編寫代碼,結果只會導致一個NullPointerException的異常錯誤:Stri

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
  • 4. 未經(jīng)權益所有人同意不得將文件中的內容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內容本身不做任何修改或編輯,并不能對任何下載內容負責。
  • 6. 下載文件中如有侵權或不適當內容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論