




版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領
文檔簡介
1、java實用教程(第3版)第第6章章 數組、枚舉及注解數組、枚舉及注解t6.1 一維數組一維數組t6.2 多維數組多維數組t6.3 訪問數組訪問數組t6.5 枚舉枚舉t6.6 enum的構造方法的構造方法t6.7 使用使用enummapt6.8 注解注解t6.9 內置注解內置注解t6.10 元注解元注解t6.11 綜合實例綜合實例t6.4 數組實用類數組實用類arraysjava實用教程(第3版)6.1 一維數組一維數組1一維數組的定義一維數組的定義一維數組的定義格式有如下兩種:方式1:;方式2: ;其中:可以是java中任意的數據類型,為用戶自定義的一個合法的變量名,指明該變量是一個數組類型
2、變量。java在定義數組時并不為數組元素分配內存,僅為分配一個引用變量的空間。例如下面的語句:int a; string person;int b100;/ 錯誤,聲明數組時不能指定其長度2創建一維數組對象創建一維數組對象和創建其他java對象一樣,同樣使用new關鍵字創建一維數組對象,格式為:數組名 = new 元素類型 元素個數;例如下面的語句: int array = new int100;/ 創建一個int型數組,存放100個int類型的數據java實用教程(第3版)6.1 一維數組一維數組java虛擬機首先在堆區中為數組分配內存空間,如圖6.1所示,創建了一個包含100個元素的int
3、型數組,數組成員都是int類型,占4個字節,因此整個數組對象在堆區中占用400個字節。之后,就要給每個數組成員賦予其數據類型的默認值,int型的默認值是0。圖圖6.1 一維數組的內存布局一維數組的內存布局java實用教程(第3版)6.1 一維數組一維數組3. 一維數組初始化一維數組初始化定義數組的同時也可對數組元素進行顯式初始化,有動態初始化和靜態初始化。靜態初始化指的是在定義數組的同時就為數組元素分配空間并賦值,它的格式如下: = ,;或者 = ,;java編譯程序會自動根據個數算出整個數組的長度,并分配相應的空間,例如下面的語句:int array = 1,2,3,4;java實用教程(第
4、3版)6.1 一維數組一維數組數組成員是引用類型的也可靜態初始化,如圖6.2所示。point pa = new point(1,4),new point(3,9),new point(15,18);class point int x,y;point(int a,int b)x = a;y = b;圖圖6.2 引用類型數組的內存布局引用類型數組的內存布局java實用教程(第3版)6.1 一維數組一維數組動態初始化指的是數組定義與為數組分配空間和賦值的操作分開進行,例如下面的語句:int a = new int3;a0 = 1; a1 = 5; a2 = 9;同樣,數組成員是引用類型的也可動態初始
5、化,例如下面的語句:point pa = new point3 ;pa0= new point(1,4);pa1= new point(3,9);pa2= new point(15,18);/ 或采用匿名數組寫法/ point pa = new point(1,4),new point(3,9),new point(15,18);class point int x,y;point(int a,int b)x = a;y = b;java實用教程(第3版)6.1 一維數組一維數組【例例6.1】 輸入一組非0整數到一維數組中,設計一個java程序,求出這一組數的平均值,并分別統計出這一組數中正數和
6、負數的個數。testaverage.javapackage org.arrays;public class testaverage public static void main(string args)int i = args.length;/ 獲取命令行參數的長度int arr = new int10;int num =0;int k =0; int p =0;for(int j =0;ji;j+)arrj= integer.parseint(argsj);if (arrj 0)k+;/ 負數的個數加一elsep+;/ 正數的個數加一num = num + arrj;/ 計算累加和syst
7、em.out.println(正數的個數+p);system.out.println(負數的個數+k);system.out.println(平均值是+num/i);/ 計算平均值java實用教程(第3版)6.1 一維數組一維數組右擊“testaverage.java”,選擇“run as”“run configurations”,如圖6.3所示,選擇main標簽頁,在“project”欄中選擇“myproject_06”,在“main class”欄中選擇“recurrence”, 選擇“arguments”標簽頁,在“program argumentds”欄中輸入“3 8 4 -5 6 7
8、 8 -4 11 12”,然后單擊“run”按鈕,運行程序。程序運行結果:正數的個數8負數的個數2平均值是5圖圖6.3 計算平均值計算平均值java實用教程(第3版)6.2 多維數組多維數組如前所述,在java語言中,多維數組實際上是數組的數組。一個二維數組可以看成是一維數組,其中的每個成員又是一維數組。1二維數組的定義二維數組的定義二維數組的定義格式如下:格式1: ;格式2: ;與一維數組的情形相類似,定義二維數組時不需要給出數組大小。int a; string names;int b100100;/ 錯誤,聲明數組時不能指定其長度2創建二維數組對象創建二維數組對象和創建一維數組一樣,創建二
9、維數組同樣使用new關鍵字,格式如下:數組名 = new 數組元素類型 數組元素個數 數組元素個數;例如下面的語句:int a = new int2 3;/ 創建一個int型的二維數組java實用教程(第3版)6.2 多維數組多維數組和一維數組一樣,若沒有對二維數組成員進行顯式初始化,則會進行隱式初始化,會根據創建的數組類型初始化對象,內存布局如圖6.4所示。圖圖6.4 二維數組的內存布局二維數組的內存布局java實用教程(第3版)6.2 多維數組多維數組3. 二維數組初始化二維數組初始化和一維數組一樣,定義二維數組的同時也可對數組成員進行顯式初始化,有動態初始化和靜態初始化。在下面的語句中,
10、定義string類型數組alphabet的同時初始化數組成員,即靜態初始化。string alphabet = a,b,c,d,e,f,g,h,i,j,k,l;注意:注意:無論是初始化一維數組還是二維數組,都不能指定其長度。例如下面的語句:string43 alphabet = a,b,c,d,e,f,g,h,i,j,k,l;/ 錯誤二維數組的第二維的長度可以各不相同,例如下面的語句:string alphabet = a,b,c,d,e,f,g,h,i,j,k;java實用教程(第3版)6.2 多維數組多維數組和一維數組一樣,二維數組成員是引用類型的,也可靜態初始化。下面的代碼片段創建的引用
11、類型的二維數組的內存布局如圖6.5所示。point pt = new point(1, 2), new point(3, 4), new point(5, 6),new point(7, 8), new point(9, 10),new point(11, 12);class point int x, y;point(int a, int b) x = a;y = b;圖圖6.5 二維數組引用類型的內存布局二維數組引用類型的內存布局 java實用教程(第3版)6.2 多維數組多維數組二維數組的動態初始化有兩種方式:方式1: = new ;例如:int arr = new int35;方式2:從
12、高維向低維依次進行空間分配,此時分配的數組空間可以是任意的形狀。(1) 由于二維數組首先是一個一維數組,故先對該一維數組進行空間分配,也就是說,先對最高維進行空間分配。 = new ;例如:int c = new int3;(2) 每一個元素又是一個一維數組,故對每一個元素再用new語句進行空間分配,格式與一維數組相同。例如下面的語句:c0 = new int4;c1 = new int3;c2 = new int5;java實用教程(第3版)6.2 多維數組多維數組(3)若最終元素是引用類型,則還需對每一個最終元素進行對象的空間分配。例如下面的語句:point p;/ 定義一個二維數組的引用
13、變量p = new point3; / 先作為一維數組,進行最高維空間的分配p0 = new point2;/ 每一個元素又是一個一維數組,再進行一維數組空間分配p1 = new point1;p2 = new point2;p00 = new point(1,1);p01 = new point(2,2);/ 最后對每一個元素進行point對象空間的分配p10 = new point(3,3);p20 = new point(4,4);p21 = new point(5,5);class point int x, y;point(int a, int b) x = a;y = b;【例例6.
14、2】 設計一個java程序,從低到高將從命令行中讀取的一組數字進行升序排列。java實用教程(第3版)6.2 多維數組多維數組右擊“numsort.java”,選擇“run as”“run configurations”,如圖6.6所示,選擇main標簽頁,在“project”欄中選擇“myproject_06”,在“main class”欄中選擇“numsort”, 選擇“arguments”標簽頁,在“program argumentds”欄中輸入“12 5 78 45 17 6 8 13 32 14”,然后單擊“run”按鈕,運行程序。圖圖6.6 對數值按從小到大排序對數值按從小到大排序
15、java實用教程(第3版)6.3 訪問數組訪問數組數組中的每個元素都有一個索引,或者稱為下標。數組中的第一個元素的索引為0,第二個元素的索引為1,依次類推。數組的length屬性表示數組的長度,它的聲明形式如下:public final int length;length屬性被public和final修飾,因此在程序中可以讀取數組的長度,但不能修改數組的長度。【例例6.3】求出4階矩陣的最大元素以及其所在的行號和列號?!纠?.4】將一個3 4階矩陣轉置。矩陣轉置就是將一個矩陣的行、列互換。java實用教程(第3版)6.4 數組實用類數組實用類:arrays6.4.1 復制數組復制數組java
16、.lang.system類提供了一個很有用的靜態方法arraycopy()用來復制數組,其語法格式如下:static void arraycopy(object src, int srcpos, object dest, int destpos, int length) 功能:從指定源數組中復制一個數組,復制從指定的位置開始,復制到目標數組的指定位置。從 src引用的源數組到dest引用的目標數組,數組組件的一個子序列被復制下來。被復制的組件的數量等于 length 參數。源數組中位置在 srcpos 到 srcpos+length-1之間的組件被分別復制到目標數組中的destpos到dest
17、pos+length-1位置。【例例6.5】使用arraycopy()方法把數組的內容復制到另一個數組。java實用教程(第3版)6.4.2 數組排序數組排序使用內置的排序方法,就可以對任意基本類型數組排序,也可以對任意的對象數組進行排序,只要該對象實現了comparable接口或具有相關聯的comparator。當然,可以對數組按指定的排序方法進行排序?!纠?.6】隨機生成10個整數值,并使用內置的排序方法對數組排序。java實用教程(第3版)6.4.3 數組元素的查找數組元素的查找如果數組已經排好序了,就可以使用array.binarysearch()執行快速查找?!纠?.7】對無序的
18、10個整數值進行排序,再用二叉查找法進行檢索。java實用教程(第3版)6.5 枚舉枚舉jdk5.0引入了一個新的關鍵字enum表示枚舉類型。定義一個枚舉類型很簡單,下面是一個枚舉類型的示例。public enum season spring, summer, autumn, winter;上面創建了一個名為season的枚舉類型,它具有4個成員。由于枚舉類型的實例是常量,因此按照命名習慣它們都用大寫字母表示。為了使用enum,需要創建一個該類型的引用,將其賦值給某個實例。例如下面的語句:season season = season. summer;在創建一個enum的實例后,編譯器會自動創建
19、一些有用的方法。ordinal()方法用來表示某個特定enum常量的聲明順序,values()方法用來按照enum常量的聲明順序,產生由這些常量值構成的數組。例如下面的代碼:for (season season : season.values() system.out.println(season+,ordinal +season.ordinal();輸出:spring, ordinal 0summer, ordinal 1autumn, ordinal 2winter, ordinal 3java實用教程(第3版)6.5 枚舉枚舉定義枚舉類型本質上就是在定義一個final類型的class,該
20、類從java.lang.enum類繼承。這些工作由編譯器來完成,所以enum象類一樣可以具有自己的成員方法、數據成員、自己的構造方法、自己的初始化代碼塊,以及內部類?!纠?.8】用enum模擬交通信號燈。java實用教程(第3版)6.6 enum的構造方法的構造方法使用enum定義枚舉類型時,實質上定義出來的類繼承自 java.lang.enum 類,而每個枚舉的成員其實就是定義的枚舉類型的一個實例。在定義一個枚舉類型時,像定義類一樣,可以定義枚舉類型的構造方法,這樣在定義枚舉類型的成員變量時,利用構造方法進行初始化。在定義枚舉類型時,必須將枚舉常量定義在最前面,并以分號“;”與其他成員隔開
21、。若enum是public類型,且在類外部定義,則文件名必須與enum名字相同,且文件中不能再定義其他public類型的類。注意:enum的構造方法必須是private,否則出錯?!纠?.9】在enum中定義enum的構造方法和普通方法。java實用教程(第3版)6.7 使用使用enummapenummap是一種特殊的map,它要求所有的鍵(key)都必須來自同一個枚舉類型。該枚舉類型在創建enummap時顯式或隱式地指定。enummap在內部表示為數組,這種表示形式非常緊湊且高效,所以可以放心地使用enum實例在enummap中進行查找。不過,只能將enum的實例作為鍵來調用put()方法
22、,其他操作與使用一般的map差不多。關于map對象的詳細介紹請參考第7章的第7.6節?!纠?.10】通過使用enummap的鍵對象來取得值對象。java實用教程(第3版)6.8 注解注解注解(也稱元數據)是眾多引入到java se5中的重要的語言變化之一。注解類型的主要目的是,以標準化和結構化的方式來表示信息。這些信息可由自動化處理工具來讀取與處理,也可以增加程序員的理解。因而提供了一種結構化的,并且具有類型檢查能力的新途徑,使得程序員能夠為代碼加入元數據,而不會導致代碼雜亂且難以閱讀。注解采用能被java編譯器進行檢查、驗證的格式,存儲有關程序的額外信息。通過使用注解,可以將這些元數據保存
23、在java源代碼中,同時,注解的優點還包括:附屬文件的自動生成,例如部署描述符或者bean信息類;測試、日志、事務語義等代碼的自動生成。java語言本身提供的注解不多,但它提供了一個強大的機制,用于定義自己的注解。程序員更多的是使用開發環境或開發工具中自定義的注解,這些自定義的注解數量眾多,功能強大,是程序員的有力工具。java實用教程(第3版)6.9 內置注解內置注解內置注解是指java語言內部已定義好的注解,可直接使用。java se預定義了三種標準注解(在java.lang包中)和四種元注解(在java.lang.annotation包中)。定義在java.lang包中的三種標準注解如下
24、:override:表示當前的方法定義將重寫父類中的方法。如果不小心拼寫錯誤,或者簽名對不上重寫的方法,編譯器就會發出錯誤提示。deprecated:如果使用了用它注解的程序元素,那么編譯器會發出警告信息。suppresswarnings:關閉指定的編譯器警告信息annotation并不直接影響代碼語義,但是它工作的方式被看作類似程序的工具或者類庫,它會反過來對正在運行的程序語義有所影響。java實用教程(第3版)6.9.1 overridejava.lang.override是j2se 5.0中標準的annotation類型之一,它告訴編譯器某個方法必須是重寫父類中的方法,編譯器得知這項信息
25、后,在編譯程序時如果發現該方法并非重寫父類中的方法,就會報告錯誤。該注解只能應用于方法?!纠?.11】使用override注解?,F在對equals()方法加上override注解,要求編譯器必須檢查這個方法是不是重寫父類的某個方法,但編譯器發現父類object類中并沒有這個方法,所以它會報告如下錯誤:overridetest.java:8: method does not override a method from its superclassoverride1 errorjava實用教程(第3版)6.9.2 deprecatedjava.lang.deprecated是j2se 5.0中
26、標準的annotation類型之一,它告訴編譯器某個程序元素已經不建議使用,如果試圖使用或重新定義該方法,則發出警告信息。【例例6.12】使用deprecated注解。deprecatedtest.javapackage org.annotations;public class deprecatedtest extends service overridepublic void dosomething() system.out.println(do something in deprecatedtest class);public static void main(string args) d
27、eprecatedtest sub = new deprecatedtest();sub.dosomething();class service deprecatedpublic void dosomething() system.out.println(do something);java實用教程(第3版)6.9.2 deprecated說明說明:在程序中定義一個service類,并在其中定義dosomething()方法,經過一段時間之后,考慮不建議使用這個方法,因而將這個方法注解為deprecated,deprecatedtest類試圖在繼承這個類后重新定義dosomething()方法
28、,程序編譯時,就會出現如圖6.7所示的報告信息。圖圖6.7 使用使用deprecated注解注解java實用教程(第3版)6.9.3 suppresswarnings下面的方法f()中定義了一個arraylist類,但同時會出現警告信息。public void f() list list = new arraylist(); list.add(hello); 警告信息表示list類必須使用泛型才是安全的,才可以進行類型檢查。如果想不顯示這個警告信息有兩種方法。一個是將這個方法進行如下改寫: public void f() list list = new arraylist(); list.ad
29、d(hello);另外一種方法就是使用suppresswarnings,如下所示:suppresswarnings (value = unchecked)public void f() list list = new arraylist(); list.add(hello);java實用教程(第3版)6.9.3 suppresswarnings要注意的是suppresswarnings和前兩個注解不一樣。前兩個注解是沒有元素的。因而可寫成:override 或 override(),而suppresswarnings注解有一個元素,類型為string。按注解定義的約定,單一元素(即只有一個元素
30、)的名字建議取為value。這樣在使用注解時可簡化。annotation語法允許在annotation名后跟括號,括號中是使用逗號分割的“name = value”對,用于為annotation的成員賦值。例如下面的代碼片段:suppresswarnings(unchecked,deprecation)public void f() list list = new arraylist(); list.add(hello);suppresswarnings 類型只定義了一個單一的成員,所以只有一個簡單的value = .作為“name = value”對。又由于成員值是一個數組,故使用大括號來聲
31、明數組值。注意:可以在下面的情況中縮寫annotation:當annotation只有單一成員,并且成員命名為“value =”。這時可以省去“value =”。比如將上面的suppresswarnings 進行縮寫:suppresswarnings (unchecked , deprecation)如果suppresswarnings所聲明的被禁止警告個數為一個時,可以省去大括號:suppresswarnings(unchecked)java實用教程(第3版)6.9.3 suppresswarnings【例例6.13】使用suppresswarnings注解。suppresswarnings
32、test.javapackage org.annotations;import java.util.*;public class suppresswarningstest suppresswarnings(unchecked)public static void main(string args) map map = new treemap();map.put(hello, new date();system.out.println(map.get(hello);list list = new arraylist();list.add(annotation);system.out.printl
33、n(list);程序運行結果:thu dec 04 15:24:02 cst 2008annotationjava實用教程(第3版)6.10 元注解元注解6.10.1 自定義注解自定義注解注解的強大之處是它不僅可以使java程序變成自描述的,而且允許程序員自定義注解。注解類型的定義,是一種特殊的接口定義,只是在interface關鍵字前面加了一個符號。編譯程序在編譯注解定義時,自動將注解從java.lang.annotation.annotation接口繼承,因而不允許在注解后邊再加上extends子句。要注意:程序員人為地定義一個接口,從annotation接口繼承,這個不會被編譯程序當作注
34、解。因此,注解的定義只能使用interface定義。在任何可能定義接口的地方,都可以定義注解。接口的修飾符都可以修飾注解。訪問權限范圍也一樣。例如下面的語句:public interface myannotation 上面的代碼是一個最簡單的注解。這個注解沒有任何元素,也可以理解為是一個標記注解。當然,也可以定義有元素的注解。例如下面的語句:public interface myannotation public int id();public string value() default “java world”;id和value類似方法定義,value元素有一個缺省值,如果在注解某個方法時
35、沒有給出value值,則該注解的處理器就會使用此元素的默認值??梢园慈缦赂袷绞褂米远x注解myannotation。myannotation(id =12, value = java) public void f() java實用教程(第3版)6.10.2 元注解元注解1. target作為元注解類型的target,它描述了注解所適用的程序元素的種類。當一個注解類型沒有target時,則表明該注解可適用于所有程序元素上。當存在target時,編譯程序將強制實施指定的使用限制。它將被作為普通的annotation看待。當它修飾一個特定的成員時,它將發揮其應用的作用。target(elementt
36、ype.method) interface myannotation myannotation / 不正確,不能為類注解public class comment myannotation / 正確,可以為方法注解public void method() target所指的目標就是java的語言元素如類接口方法等。當然,target還可以對其他的元素進行限制,如構造方法字段參數等。若只允許對方法和構造方法進行注解可以寫成: target(elementtype.method,elementtype.constructor)interface myannotation java實用教程(第3版)6.10.2 元注解
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯系上傳者。文件的所有權益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網頁內容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
- 4. 未經權益所有人同意不得將文件中的內容挪作商業或盈利用途。
- 5. 人人文庫網僅提供信息存儲空間,僅對用戶上傳內容的表現方式做保護處理,對用戶上傳分享的文檔內容本身不做任何修改或編輯,并不能對任何下載內容負責。
- 6. 下載文件中如有侵權或不適當內容,請與我們聯系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 文件存儲柜使用表格
- 2025年藝術與設計專業綜合素質考試試卷及答案
- 2025年系統分析與設計能力考試題及答案
- 2025年社會心理學基礎知測試卷及答案
- 2025年輕工業制造工藝基礎考試試題及答案
- 2025年建筑技術與管理專業考試試題及答案
- 2025年傳統醫學與現代科技在健康管理中的應用考試試卷及答案
- 物資公司收購管理制度
- 特殊體質教育管理制度
- 特殊病人液體管理制度
- 專題四第1課二、《智能家居系統》說課稿 2023-2024學年青島版(2018)初中信息技術八年級上冊
- 江西省贛州市興國三中重點達標名校2025屆中考試題猜想生物試卷含解析
- 2025海南省交通投資控股限公司招聘30人高頻重點提升(共500題)附帶答案詳解
- 湖北瀾圖工程設計有限公司招聘筆試沖刺題2025
- 《中國文化導論》課程考試復習題庫及答案
- 《江蘇省民用建筑工程消防驗收常見問題解析及防治指南》2023版
- DB3701T 29-2022 智慧中藥房建設與運行規范
- 2024-2025學年上學期廣州六年級英語期末模擬卷1
- 2024新滬教版英語(五四學制)七年級上單詞表 (英譯漢)
- 金蝶KIS專業版完整操作手冊
- 2025年社區工作者考試試題庫及答案
評論
0/150
提交評論