Java期末复习基础知识整理(有点长)
平臺無關:
在一個計算機上編譯得到的字節碼文件可以復制到任何一個安裝了Java運行環境的計算機上直接使用。字節碼由Java虛擬機負責解釋運行,即Java虛擬機負責將字節碼翻譯成本地計算機的機器碼,并將機器碼交給本地的操作系統來運行。
Java程序的開發步驟 :
1.編寫源文件:擴展名必須是.java。
2.編譯Java源程序:用Java編譯器(javac.exe)編譯源文件,得到字節碼文件。
3.運行Java程序:使用Java解釋器(java.exe)來解釋執行字節碼文件。 ?
保存源文件:
如果源文件中有多個類,那么只能有一個類是public類;如果有一個類是public類,那么源文件的名字必須與這個類的名字完全相同,擴展名是java;如果源文件沒有public類,那么源文件的名字只要和某個類的名字相同,并且擴展名是java就可以了
標識符:
用來標識類名、變量名、方法名、類型名、數組名、文件名的有效字符序列稱為標識符,簡單地說,標識符就是一個名字 .
標識符由字母、下劃線、美元符號和數字組成,長度不受限制。
標識符的第一個字符不能是數字字符。
標識符不能是關鍵字(關鍵字見下面的2.1.3節)
標識符不能是true、false和null(盡管true、false和null不是關鍵字)
這8種基本數據類型習慣上可分為以下四大類型:
??邏輯類型:boolean
??整數類型:byte、short、int、long
??字符類型:char
??浮點類型:float、double
1.int 型
??????????對于int型變量,內存分配給4個字節(byte),占32位。
2.byte 型 ?
????????常量:Java中不存在byte型常量的表示法,但可以把一定范圍內的int型常量
??????????賦值給byte型變量。 ?
????????變量:使用關鍵字byte來聲明byte 型變量 ?
??????????例如: byte x= -12,tom=28,漂亮=98;
??????????對于byte型內存分配給1個字節,占8位 。
3 .short 型
????????常量:和byte型類似,Java中也不存在short型常量的表示法,但可以把一定
??????????范圍內的int型常量賦值給short型變量。
????????變量:使用關鍵字short來聲明short型變量
??????????例如: short x=12,y=1234;
??????????對于short型變量,內存分配給2個字節,占16位.
4. long 型
????????常量:long型常量用后綴L來表示,例如108L(十進制)、07123L(八進制)、
??????????0x3ABCL(十六進制) 。
????????變量:使用關鍵字long來聲明long型變量,
??????????例如: long width=12L,height=2005L,length;
??????????對于long型變量,內存分配給8個字節,占64位。
簡單數據類型的級別與類型轉換運算:
Java中數據的基本類型(不包括邏輯類型)按精度從“低”到“高”排列:
byte ?short ?char ?int ?long ?float ?double
★當把級別低的變量的值賦給級別高的變量時,系統自動完成數據類型的轉換
★當把級別高的變量的值賦給級別低的變量時,必須使用顯示類型轉換運算。顯示轉換的格式:(類型名)要轉換的值;
??例如
????int x=(int)34.89;
★當把一個int型常量賦值給一個byte和short型變量時,不可以超出這些變量的取值范圍,否則必須進行類型轉換運算;例如,常量128的屬于int型常量,超出byte變量的取值范圍,如果賦值給byte型變量,必須進行byte類型轉換運算(將導致精度的損失),如下所示:
?????byte a=(byte)128;
輸入基本型數據 :
??◆可以使用Scanner類創建一個對象:
???????????Scanner reader=new Scanner(System.in);
??◆reader對象調用下列方法,讀取用戶在命令行(例如,MS-DOS窗口)輸入的各種基本類型數據:
?nextBoolean()、 nextByte()、 nextShort()、 nextInt() ??
?nextLong()、nextFloat()、nextDouble()
輸出基本型數據:
JDK1.5新增了和C語言中printf函數類似的輸出數據的方法,格式如下:
?????System.out.printf("格式控制部分",表達式1,表達式2,…表達式n)
格式控制部分由格式控制符號:%d、%c、%f、%s和普通的字符組成,普通字符原樣輸出。格式符號用來輸出表達式的值。
輸出數據時也可以控制數據在命令行的位置,例如:%md輸出的int型數據占m列;%m.nf輸出的浮點型數據占m列,小數點保留n位。例如:System.out.printf("%d,%f",12, 23.78);
數組 :
1 聲明數組:
聲明一維數組有下列兩種格式:
數組的元素類型 數組名[];
數組的元素類型 [] 數組名;
例如:
float boy[];
char [] cat;
2 為數組分配元素 :
為數組分配元素的格式如下:
數組名 = new 數組元素的類型[數組元素的個數];
例如: boy = new float[4];
3數組的引用:
數組屬于引用型變量,兩個相同類型的數組如果具有相同的引用,它們就有完全相同的元素
?
instanceof 運算符是二目運算符,左面的操作元是一個對象;右面是一個類。當左面的對象是右面的類或子類創建的對象時,該運算符運算的結果是true ,否則是false。
Java里的語句可分為以下六種:
1.方法調用語句。如:System.out.println(" Hello");
2.表達式語句 ??表示式尾加上分號。比如賦值語句:x=23;
3.復合語句
??可以用{ ?}把一些語句括起來構成復合語句,如:
???????{ ??z=123+x;
???????????System.out.println("How are you");
????????}
4.空語句。 一個分號也是一條語句,稱做空語句。
5.控制語句。控制語句分為條件分支語句、開關語句和循環語句。
6.package語句和 import語句。它們和類、對象有關
for語句與數組 :
?JDK1.5后,對for語句的功能給予擴充、增強,以便更好地遍歷數組。語法格式如下:
for(聲明循環變量:數組的名字) {
…
}
其中,聲明的循環變量的類型必須和數組的類型相同。這種形式的for語句類似自然語言中的“for each”語句,為了便于理解上述for語句,可以將這種形式的for語句中翻譯成“對于循環變量依次取數組的每一個元素的值”。
?類體:
◆類體的內容由兩部分構:一部分是變量的聲明,用來刻畫屬性;另一部分是方法的定義,用來刻畫行為功能
類體中變量聲明部分所聲明的變量被稱作成員變量和類的成員變量不同的是,局部變量只在方法內有效,而且與其聲明的位置有關如果局部變量的名字與成員變量的名字相同,則成員變量被隱藏,即該成員變量在這個方法內暫時失效。如果想在該方法中使用被隱藏的成員變量,必須使用關鍵字this(在4.9節this關鍵字)
局部變量沒有默認值:
成員變量有默認值(見后面的4.3節),但局部變量沒有默認值,因此在使用局部變量之前,必須保證局部變量有具體的值
???對成員變量的操作只能放在方法中,方法可以對成員變量和該方法體中聲明的局部變量進行操作。在聲明成員變量時可以同時賦予初值,但是不可以在類體中有單獨的賦值語句(不可以有變量的聲明和方法的定義以外的其它語句)
構造方法與對象的創建 :
???類是面向對象語言中最重要的一種數據類型,那么就可以用它來聲明變量。在面向對象語言中,用類聲明的變量被稱作對象。和基本數據類型不同,在用類聲明對象后,還必須要創建對象,即為聲明的對象分配變量(確定對象所具有的屬性),當使用一個類創建一個對象時,也稱給出了這個類的一個實例。通俗的講,類是創建對象的“模板”,沒有類就沒有對象。構造方法和對象的創建密切相關
構造方法 : 構造方法是一種特殊方法,它的名字必須與它所在的類的名字完全相同,而且沒有類型。允許一個類中編寫若干個構造方法,但必須保證他們的參數不同,即參數的個數不同,或者是參數的類型不同。
創建對象 : ???
創建一個對象包括對象的聲明和為對象分配變量兩個步驟。
使用對象 :
1.對象操作自己的變量(體現對象的屬性)
???通過使用運算符“.” 對象操作自己的變量(對象的屬性)
2.對象調用類中的方法(體現對象的行為)
???對象創建之后,可以使用點運算符“.”調用創建它的類中的方法,從而產生一定的行為(功能).
3. 體現封裝
????當對象調用方法時,方法中出現的成員變量就是指分配給該對象的變量。在講述類的時候講過:類中的方法可以操作成員變量。當對象調用方法時,方法中出現的成員變量就是指分配給該對象的變量。
?對象的引用和實體 :
當用類創建一個對象時,類中的成員變量在分配內存空間,這些內存空間稱作該對象的實體或對象的變量,而對象中存放著引用。一個類創建的兩個對象,如果具有相同的引用,那么就具有完全相同的實體。
參數傳值:
?方法中最重要的部分之一就是方法的參數,參數屬于局部變量,當對象調用方法時,參數被分配內存空間,并要求調用者向參數專遞值,即方法被調用時,參數變量必須有具體的值。
?傳值機制 :
?在Java中,方法的所有參數都是“傳值”的,也就是說,方法中參數變量的值是調用者指定的值的拷貝。例如,如果向方法的int型參數x傳遞一個int值,那么參數x得到的值是傳遞的值的拷貝。
基本數據類型參數的傳值 :
對于基本數據類型的參數,向該參數傳遞的值的級別不可以高于該參數的級別 。
引用類型參數的傳值:
當參數是引用類型時,“傳值”傳遞的是變量中存放的“引用”,而不是變量所引用的實體
對象的組合 ?:
一個類可以把對象作為自己的成員變量,如果用這樣的類創建對象,那么該對象中就會有其它對象,也就是說該對象將其他對象作為自己的組成部分,或者說該對象是由幾個對象組合而成。
組合與復用 ?:
如果一個對象a組合了對象b,那么對象a就可以委托對象b調用其方法,即對象a以組合的方式復用對象b的方法。例如,圓錐對象在計算體積時,首先委托圓錐的底(一個Circle對象)bottom調用getArea()方法計算底的面積,然后圓錐對象再計算出自身的體積
實例變量和類變量的聲明:
在聲明成員變量時,用關鍵字static給予修飾的稱作類變量,否則稱作實例變量(類變量也稱為static變量,靜態變量)。
實例變量和類變量的區別:
1.不同對象的實例變量互不相同
2.所有對象共享類變量
3.通過類名直接訪問類變量
實例方法和類方法的定義:
類中的方法也可分為實例方法和類方法。方法聲明時,方法類型前面不加關鍵字static修飾的是實例方法、加static關鍵字修飾的是類方法(靜態方法)。
實例方法和類方法的區別 :
1.對象調用實例方法
???當對象調用實例方法時,該方法中出現的實例變量就是分配給該對象的實例變量;該方法中出現的類變量也是分配給該對象的變量,只不過這個變量和所有的其他對象共享而已。
2.類名調用類方法
從而類方法不僅可以被類創建的任何對象調用執行,也可以直接通過類名調用。和實例方法不同的是,類方法不可以操作實例變量,這是因為在類創建對象之前,實例成員變量還沒有分配內存。
方法重載的語法規則 :
方法重載的意思是:一個類中可以有多個方法具有相同的名字,但這些方法的參數必須不同,即或者是參數的個數不同,或者是參數的類型不同
this關鍵字 :
this是Java的一個關鍵字,表示某個對象。this可以出現在實例方法和構造方法中,但不可以出現在類方法中。this關鍵字出現在類的構造方法中時,代表使用該構造方法所創建的對象.當this關鍵字出現實例方法中時,this就代表正在調用該方法的當前對象。
在構造方法中使用this ?:
this關鍵字出現在類的構造方法中時,代表使用該構造方法所創建的對象。
在實例方法中使用this ?:
實例方法必須只能通過對象來調用,不能用類名來調用。當this關鍵字出現實例方法中時,代表正在調用該方法的當前對象。
實例方法可以操作類的成員變量,當實例成員變量在實例方法中出現時,默認的格式是:this.成員變量;
當static成員變量在實例方法中出現時,默認的格式是:
?????類名.成員變量;
包 :
包是Java語言中有效地管理類的一個機制。
包名的目的是有效的區分名字相同的類。不同Java源文件中兩個類名字相同時,它們可以通過隸屬不同的包來相互區分。
包語句 :
通過關鍵字package聲明包語句。
???????package語句作為Java源文件的第一條語句, 為該源文件中聲明的類指定包名。 ?import 語句 :
??一個類可能需要另一個類聲明的對象作為自己的成員或方法中的局部變量,如果這兩個類在同一個包中,當然沒有問題。
???如果一個類想要使用的那個類和它不在一個包中,要使用import語句完成使命。
引入自定義包中的類 :
用戶程序也可以使用import語句引入非類庫中有包名的類,如:
???import tom.jiafei.*;
訪問權限 :
??當用一個類創建了一個對象之后,該對象可以通過“.”運算符操作自己的變量、使用類中的方法,但對象操作自己的變量和使用類中的方法是有一定限制的。
何謂訪問權限 :
???所謂訪問權限是指對象是否可以通過“.”運算符操作自己的變量或通過“.”運算符使用類中的方法。訪問限制修飾符有private、protected和public,都是Java的關鍵字,用來修飾成員變量或方法。
私有變量和私有方法 :
用關鍵字private修飾的成員變量和方法稱為私有變量和私有方法。
對于私有成員變量或方法,只有在本類中創建該類的對象時,這個對象才能訪問自己的私有成員變量和類中的私有方法。
某個類在另外一個類中創建對象后,如果不希該對象直接訪問自己的變量,即通過“.”運算符來操作自己的成員變量,就應當將該成員變量訪問權限設置為private。面向對象編程提倡對象應當調用方法來改變自己的屬性,類應當提供操作數據的方法,這些方法可以經過精心的設計,使得對數據的操作更加合理
共有變量和共有方法 :
用public修飾的成員變量和方法被稱為共有變量和共有方法 。
我們在任何一個類中用類Tom 創建了一個對象后,該對象能訪問自己的public變量和類中的public方法(也可以通過類名來操作成員變量、方法) 。
友好變量和友好方法:
當在另外一個類中用類Tom 創建了一個對象后,如果這個類與Tom類在同一個包中,那么該對象能訪問自己的友好變量和友好方法。 在任何一個與Tom同一包中的類中,也可以通過Tom類的類名訪問Tom類的類友好成員變量和類友好方法。
受保護的成員變量和方法:
用protected修飾的成員變量和方法被稱為受保護的成員變量和受保護的方法
public類與友好類 :
類聲明時,如果在關鍵字class前面加上public關鍵字,就稱這樣的類是一個public 類 。
可以在任何另外一個類中,使用public類創建對象。
如果一個類不加public修飾,這樣的類被稱作友好類。
在另外一個類中使用友好類創建對象時,要保證它們是在同一包中。
基本類型的類封裝:
Java提供了基本數據類型相關的類,實現了對基本數據類型的封裝。這些類分別是:Byte、Integer、Short、Long、Float、Double和Character類。這些類在java.lang包中。
對象數組:
如果程序需要某個類的若干個對象,比如Student類的10個對象,顯然如下聲明10個Student對象是不可取的:
Student stu1,stu2, stu3,stu4,stu5,stu6,stu7,stu8, stu9,stu10;
正確的做法是使用對象數組,即數組的元素是對象,例如:
???????Student [] stu;
???????stu = new Student[10];
需要注意的是,上述代碼僅僅定義了數組stu有10個元素,并且每個元素都是一個Student類型的對象,但這些對象目前都是空對象,因此在使用數組stu中的對象之前,應當創建數組所包含的對象,例如: ???????????
stu[0] = new Student(); ?
反編譯和文檔生成器 :
◆反編譯器javap.exe可以將字節碼反編譯為源碼,以便查看源碼類中的public方法名字和public成員變量的名字,例如:
????javap java.awt.Button
使用javadoc.exe可以制做源文件類結構的html格式文檔
jar文件 :
可以使用jar.exe命令把一些類的字節碼文件壓縮成一個jar文件,然后將這個jar文件存放到Java運行環境的擴展中,即將該jar文件存放在JDK安裝目錄的jre\lib\ext文件夾中。這樣,Java應用程序就可以使用這個jar文件中的類來創建對象了
將C:\1000\moon\star目錄中的TestOne.class 和TestTwo.class(二者包名是moon.star)壓縮成一個jar文件:Jerry.jar的步驟:
1. 清單文件:hello.mf(保存到C:\1000)
Manifest-Version: 1.0
Class: moon.start.TestOne moon.star.TestTwo
Created-By: 1.6
??2. ?使用jar命令來生成一個名字為Jerry.jar的文件
C:\1000> jar cfm Jerry.jar hello.mf moon\star\TestOne.class moon\star\TestTwo.class
子類與父類 :
??利用繼承,可以先編寫一個共有屬性的一般類,根據該一般類再編寫具有特殊屬性的新類,新類繼承一般類的狀態和行為,并根據需要增加它自己的新的狀態和行為。
由繼承而得到的類稱為子類,被繼承的類稱為父類(超類)。
聲明子類 :
使用關鍵字extends來定義一個類的子類,格式如下:
?????class 子類名 ?extends ?父類名 {
???????????…
?????}
類的樹形結構:
?Java的類按繼承關系形成樹形結構這個樹形結構中,根節點是Object類
????(Object是java.lang包中的類),即Object是所有類的祖先類。
除了Object類每個類有且僅有一個父類,一個類可以有多個或零個子類。如果一個類(除了Object類)的聲明中沒有使用extends關鍵字,這個類被系統默認為是Object的子類,即類聲明“class A”與“class A extends Object”是等同的。
子類的繼承性 :
?所謂子類繼承父類的成員變量作為自己的一個成員變量,就好象它們是在子類中直接聲明一樣,可以被子類中自己定義的任何實例方法操作。
所謂子類繼承父類的方法作為子類中的一個方法,就好象它們是在子類中直接定義了一樣,可以被子類中自己定義的任何實例方法調用。
子類和父類在同一包中的繼承性 :
如果子類和父類在同一個包中,那么,子類自然地繼承了其父類中不是private的成員變量作為自己的成員變量,并且也自然地繼承了父類中不是private的方法作為自己的方法,繼承的成員變量或方法的訪問權限保持不變。
子類和父類不在同一包中的繼承性:
??如果子類和父類不在同一個包中,那么,子類繼承了父類的protected、public成員變量做為子類的成員變量,并且繼承了父類的protected、public方法為子類的方法,繼承的成員或方法的訪問權限保持不變。
子類與對象:
子類對象的特點
子類的構造方法創建一個子類的對象時,不僅子類中聲明的成員變量被分配了內存,而且父類的成員變量也都分配了內存空間,但只將子類繼承的那部分成員變量作為分配給子類對象的變量 。子類中有一部分方法是從父類繼承的,這部分方法可以操作子類未繼承的變量 。
成員變量的隱藏 :
?對于子類可以從父類繼承的成員變量,只要子類中聲明的成員變量和父類中的成員變量同名時,子類就隱藏了繼承的成員變量,子類自己聲明定義的方法操作與父類同名的成員變量是指子類重新聲明定義的這個成員變量。
方法重寫(Override):
??子類通過重寫可以隱藏已繼承的實例方法。
1.重寫的語法規則
如果子類可以繼承父類的某個實例方法,那么子類就有權利重寫這個方法。
方法重寫是指:子類中定義一個方法,這個方法的類型和父類的方法的類型一致或者是父類的方法的類型的子類型,并且這個方法的名字、參數個數、參數的類型和父類的方法完全相同。
2.重寫的目的
子類通過方法的重寫可以隱藏繼承的方法,子類通過方法的重寫可以把父類的狀態和行為改變為自身的狀態和行為。
重寫的注意事項 :
重寫父類的方法時,不允許降低方法的訪問權限,但可以提高訪問權限(訪問限制修飾符按訪問權限從高到低的排列順序是:public、protected、友好的、private。)
用super操作被隱藏的成員變量和方法:
子類可以隱藏從父類繼承的成員變量和方法,如果在子類中想使用被子類隱藏的成員變量或方法就可以使用關鍵字super。比如super.x、super.play()就是訪問和調用被子類隱藏的成員變量x和方法play().
使用super調用父類的構造方法:
子類不繼承父類的構造方法,因此,子類如果想使用父類的構造方法,必須在子類的構造方法中使用,并且必須使用關鍵字super來表示,而且super必須是子類構造方法中的頭一條語句。
final關鍵字可以修飾類、成員變量和方法中的局部變量。
可以使用final將類聲明為final類。final類不能被繼承,即不能有子類。如:
???final class A {
??????… …
???}
如果用final修飾父類中的一個方法,那么這個方法不允許子類重寫。
如果成員變量或局部變量被修飾為final的,就是常量。
對象的上轉型對象 :
?假設,A類是B類的父類,當用子類創建一個對象,并把這個對象的引用放到父類的對象中時,比如:
A a;
a=new B();
?或
A a;
B b=new B();
a=b;
這時,稱對象a是對象b的上轉型對象
1.上轉型對象不能操作子類新增的成員變量;不能調用子類新增的方法。
2.上轉型對象可以訪問子類繼承或隱藏的成員變量,也可以調用子類繼承的方法或子類重寫的實例方法。上轉型對象操作子類繼承的方法或子類重寫的實例方法,其作用等價于子類對象去調用這些方法。因此,如果子類重寫了父類的某個實例方法后,當對象的上轉型對象調用這個實例方法時一定是調用了子類重寫的實
繼承與多態:
多態性就是指父類的某個方法被其子類重寫時,可以各自產生自己的功能行為
用關鍵字abstract修飾的類/方法稱為abstract類/方法(抽象類)。如:
abstract class A {
??… …
}
注意:
1.abstract類中可以有abstract方法
2.abstract類不能用new運算創建對象
面向抽象編程 :
??在設計一個程序時,可以通過在abstract類中聲明若干個abstract方法,表明這些方法在整個系統設計中的重要性,方法體的內容細節由它的非abstract子類去完成。使用多態進行程序設計的核心技術之一是使用上轉型對象,即將abstract類聲明對象作為其子類的上轉型對象,那么這個上轉型對象就可以調用子類重寫的方法。所謂面向抽象編程,是指當設計某種重要的類時,不讓該類面向具體的類,而是面向抽象類,即所設計類中的重要數據是抽類聲明的對象,而不是具體類聲明的對象。Pillar類就是面向抽象類Geometry,Cirle和Rectangle 都是Geometry的子類.
?開-閉原則 :
所謂“開-閉原則”(Open-Closed Principle)就是讓設計的系統應當對擴展開放,對修改關閉。
在設計系統時,應當首先考慮到用戶需求的變化,將應對用戶變化的部分設計為對擴展開放,而設計的核心部分是經過精心考慮之后確定下來的基本結構,這部分應當是對修改關閉的,即不能因為用戶的需求變化而再發生變化,因為這部分不是用來應對需求變化的。
?如果系統的設計遵守了“開-閉原則”,那么這個系統一定是易維護的,因為在系統中增加新的模塊時,不必去修改系統中的核心模塊。
接口 :
??為了克服Java單繼承的缺點,Java使用了接口,一個類可以實現多個接口。
??使用關鍵字interface來定義一個接口。接口的定義和類的定義很相似,分為接口的聲明和接口體。
1.接口聲明
接口通過使用關鍵字interface來聲明,格式: interface 接口的名字
2.接口體
接口體中包含常量定義和方法定義兩部分。
實現接口 :
一個類通過使用關鍵字implements聲明自己實現一個或多個接口。
class A implements Printable,Addable
如果一個類實現了某個接口,那么這個類必須重寫該接口的所有方法。
?Java提供的接口都在相應的包中,通過import語句不僅可以引入包中的類,也可以引入包中的接口,例如:
import java.io.*;???不僅引入了java.io包中的類,也同時引入了該包中的接口
理解接口:
?接口的思想在于它可以要求某些類有相同名稱的方法,但方法的具體內容(方法體的內容)可以不同,即要求這些類實現接口,以保證這些類一定有接口中所聲明的方法(即所謂的方法綁定)。接口在要求一些類有相同名稱的方法的同時,并不強迫這些類具有相同的父類。比如,各式各樣的電器產品,它們可能歸屬不同的種類,但國家標準要求電器產品都必須提供一個名稱為on的功能(為達到此目的,只需要求它們實現同一接口,該接口中有名字為on的方法),但名稱為on的功能的具體行為由各個電器產品去實現。
接口回調是指:可以把實現某一接口的類創建的對象的引用賦給該接口聲明的接口變量中,那么該接口變量就可以調用被類重寫的接口方法。實際上,當接口變量調用被類重寫的接口方法時,就是通知相應的對象調用這個方法。
接口與多態:
??可以通過在接口中聲明若干個abstract方法,表明這些方法的重要性,方法體的內容細節由實現接口的類去完成。使用接口進行程序設計的核心思想是使用接口回調,即接口變量存放實現該接口的類的對象的引用,從而接口變量就可以回調類實現的接口方法。
接口參數 :
?如果一個方法的參數是接口類型,我們就可以將任何實現該接口的類的實例的引用傳遞給該接口參數,那么接口參數就可以回調類實現的接口方法。
?abstract類與接口的比較 :
接口和abstract類的比較如下:
1.abstract類和接口都可以有abstract方法。
2.接口中只可以有常量,不能有變量;而abstract類中即可以有常量也可以有變量。
3.abstract類中也可以有非abstract方法,接口不可以。
?面向接口編程:
面向接口去設計程序,可以通過在接口中聲明若干個abstract方法,表明這些方法的重要性,方法體的內容細節由實現接口的類去完成。
使用接口進行程序設計的核心思想是使用接口回調,即接口變量存放實現該接口的類的對象的引用,從而接口變量就可以回調類實現的接口方法。
內部類:
Java支持在一個類中聲明另一個類,這樣的類稱作內部類,而包含內部類的類成為內部類的外嵌類。某種類型的農場飼養了一種特殊種類的牛,但不希望其他農場飼養這種特殊種類的牛,那么這種類型的農場就可以將創建這種特殊種牛的類作為自己的內部類。
和子類有關的匿名類 :
?Java允許我們直接使用一個類的子類的類體創建一個子類對象。
創建子類對象時,除了使用父類的構造方法外還有類體,此類體被認為是一個子類去掉類聲明后的類體,稱作匿名類。
假設Bank是類,那么下列代碼就是用Bank的一個子類(匿名類)創建對象:
????new Bank () { ?????????
????????匿名類的類體
};
和接口有關的匿名類 :
假設Computable是一個接口,那么,Java允許直接用接口名和一個類體創建一個匿名對象,此類體被認為是實現了Computable接口的類去掉類聲明后的類體,稱作匿名類。
下列代碼就是用實現了Computable接口的類(匿名類)創建對象:
??????new Computable() {
????????????實現接口的匿名類的類體
???????} ; ???
異常類 :
所謂異常就是程序運行時可能出現一些錯誤,比如試圖打開一個根本不存在的文件等,異常處理將會改變程序的控制流程,讓程序有機會對錯誤作出處理。
異常對象可以調用如下方法得到或輸出有關異常的信息:
?public String getMessage();
?public void printStackTrace();
?public String toString(); ?
try~catch語句:
?Java使用try~catch語句來處理異常,將可能出現的異常操作放在try~catch語句的try部分,將發生異常后的處理放在catch部分。
?try~catch語句的格式如下:
??try {
??????包含可能發生異常的語句
?}
?catch(ExceptionSubClass1 ?e) {
????…
?}
?catch(ExceptionSubClass2 ?e) {
????…
?}
自定義異常類:
我們也可以擴展Exception類定義自己的異常類,然后規定哪些方法產生這樣的異常。
一個方法在聲明時可以使用throws關鍵字聲明要產生的若干個異常,并在該方法的方法體中具體給出產生異常的操作,即用相應的異常類創建對象,并使用throw關鍵字拋出該異常對象,導致該方法結束執行。
斷言:
?斷言語句用于調試代碼階段。在調試代碼階段讓斷言語句發揮作用,這樣就可以發現一些致命的錯誤,當程序正式運行時就可以關閉斷言語句,但仍把斷言語句保留在源代碼中,如果以后應用程又需要調試,可以重新啟用斷言語句。
使用關鍵字assert聲明一條斷言語句,斷言語句有以下兩種格式:
??assert booleanExpression;
??assert booleanExpression:messageException;
String類 :
??Java專門提供了用來處理字符序列的String類。String類在java.lang包中,由于java.lang包中的類被默認引入,因此程序可以直接使用String類。需要注意的是Java把String類聲明為final類,因此用戶不能擴展String類,即String類不可以有子類。
String 類的常用方法:
1.public int length():獲取一個字符串的長度
2.public boolean equals(String s):比較當前字符串對象的實體是否與參數s指定的字符串的實體相同 ????????????????
3.public boolean startsWith(String s)
???public boolean endsWith(String s)方法:判斷當前字符串對象的前綴(后綴)是否參數s指定的字符串
????String tom = "天氣預報,陰有小雨",jerry = "比賽結果,中國隊贏得勝利";
????tom.startsWith(“天氣”)的值是true;
????tom.endsWith("大雨")的值是false,
4. public int compareTo(String s):按字典序與參數s指定的字符串比較大小
?????如果當前字符串與s相同,該方法返回值0;
?????如果當前字符串對象大于s,該方法返回正值;
?????如果小于s,該方法返回負值。
?????例如,字符a在Unicode表中的排序位置是97、字符b是98,那么對于
????????String str = "abcde"; ??str.compareTo("boy")小于0;
其相關方法 public int compareToIgnoreCase(String s)
5.public boolean contains(String s):判斷當前字符串對象是否含有參數指定的字符串s?
????????例如 ?tom=“student”;那么tom.contains(“stu”)的值就是true;
???????????????????而tom.contains("ok")的值是false。
6. public int indexOf (String s):從當前字符串的頭開始檢索字符串s,并返回首次出現s的位置,其相關方法:
???indexOf(String s ,int startpoint)
???lastIndexOf (String s)
????例如 String tom = "I am a good cat";
??????????????tom.indexOf("a");//值是2
??????????????tom.indexOf("good",2);//值是7
??????????????tom.indexOf("a",7);//值是13
??????????????tom.indexOf("w",2);//值是-1
7. public String substring(int startpoint):獲得一個當前字符串的子串??
?????其相關方法:substring(int start ,int end)
????例如: ?String tom = "我喜歡籃球";
??????????????????String s = tom.substring(1,3);
??????????????????那么s是:"喜歡"
符串與基本數據的相互轉化:
java.lang包中的Integer類調用其類方法:
??????public static int parseInt(String s)
可以將由“數字”字符組成的字符串,如“876”,轉化為int型數據
可以使用String 類的類方法
????????public static String valueOf(byte n)
???????public static String valueOf(int n)
???????public static String valueOf(long n) ?
???????public static String valueOf(float n)
對象的字符串表示 :
?所有的類都默認是java.lang包中Object類的子類或間接子類。
Object類有一個public String toString()方法,一個對象通過調用該方法可以獲得該對象的字符串表示。一個對象調用toString()方法返回的字符串的一般形式為:創建對象的類的名字@對象的引用的字符串表示
字符串與字符、字節數組:
String 類的構造方法:
◆ String(char[])和String(char[],int offset,int length)分別用字符數組中的全部字符和部分字符創建字符串對象
◆ String類提供了將字符串存放到數組中的方法:
???public void getChars(int start,int end,char c[],int offset )
◆將字符串中的全部字符存放在一個字符數組中的方法:
public char[] toCharArray()
◆String(byte[])用指定的字節數組構造一個字符串對象。
???String(byte[],int offset,int length) 用指定的字節數組的一部分,即從數組起始位置offset開始取length個字節構造一個字符串對象。
◆public byte[] getBytes() 方法使用平臺默認的字符編碼,將當前字符串轉化為一個字節數組。
◆ public byte[] getBytes(String charsetName) 使用參數指定字符編碼,將當前字符串轉化為一個字節數組。 ?
字符串的加密算法 ?:
使用一個字符串password作為密碼對另一個字符串sourceString進行加密 。將密碼password存放到一個字符數組char [] p = password.toCharArray();
假設數組p的長度為n,那么就將待加密的字符串sourceString按順序以n個字符為一組,對每一組中的字符用數組a的對應字符做加法運算。
正則表達式及字符串的替換與分解:
?1.正則表達式
一個正則表達式是含有一些具有特殊意義字符的字符串,這些特殊字符稱作正則表達式中的元字符。比如,“\\dcat”中的\\d就是有特殊意義的元字符,代表0到9中的任何一個。字符串對象調用 public boolean matches(String regex)方法可以判斷當前字符串對象是否和參數regex指定的正則表達式匹配。
?2.字符串的替換
?字符串對象調用public String replaceAll(String regex,String replacement)方法返回一個字符串,該字符串是當前字符串中所有和參數regex指定的正則表達式匹配的子字符串被參數replacement指定的字符串替換后的字符串,例如:
?????String s ="12hello567bird".replaceAll("[a-zA-Z]+","你好");
字符串的分解
?3.字符串調用public String[] split(String regex)使用參數指定的正則表達式regex做為分隔標記分解出其中的單詞,并將分解出的單詞存放在字符串數組中。
??????例如,對于字符串str ?
?String str = "1949年10月1日是中華人民共和國成立的日子";
如果準備分解出全部由數字字符組成的單詞,就必須用非數字字符串做為分隔標記,因此,可以使用正則表達式:String regex="\\D+";
做為分隔標記分解出str中的單詞:String digitWord[]=str.split(regex);
那么,digitWord[0]、digitWord[1]和digitWord[2]就分別是“1949”、“10”和“1”。
StringTokenizer類 :
本節學習怎樣使用StringTokenizer對象分解字符串。
StringTokenizer類在java.util包中,有兩個常用的構造方法:
◆StringTokenizer(String s):為字符串s構造一個分析器。使用默認的分隔標記,即空格符(若干個空格被看做一個空格)、換行符、回車符、Tab符、進紙符。
◆ StringTokenizer(String s, String delim):為字符串s構造一個分析器。參數dilim中的字符被作為分隔標記 。
例如:
????StringTokenizer fenxi = new StringTokenizer("you are welcome");
????StringTokenizer fenxi = new StringTokenizer("you,are ; welcome", ?", ; ");
◆ StringTokenizer對象稱作一個字符串分析器可以使用下列方法:
?????nextToken():逐個獲取字符串中的語言符號(單詞),字符串分析器中的負責計數的變量的值就自動減一 ?。
hasMoreTokens():只要字符串中還有語言符號,即計數變量的值大于0,該方法就返回true,否則返回false。 countTokens():得到分析器中計數變量的值。
??Scanner類:
使用Scanner類從字符串中解析程序所需要的數據。
????1.使用默認分隔標記解析字符串
???????創建Scanner對象,并將要解析的字符串傳遞給所構造的對象,
?????例如 String NBA = "I Love This Game";
?????如下構造一個Scanner對象:
?????Scanner scanner = new Scanner(NBA);
那么scanner將空格做為分隔標記來解析字符串中的單詞,解析操作的特點如下:
◆ scanner調用next()方法依次返回NBA中的單詞,如果NBA最后一個單詞已被next()方法返回,scanner調用hasNext()將返回false,否則返回true。
◆ ?對于被解析的字符串中的數字型的單詞,比如618,168.98等,scanner可以用nextInt()或nextDouble()方法來代替next()方法,即scanner可以調用nextInt()或nextDouble()方法將數字型單詞轉化為int或double數據返回。
◆ 如果單詞不是數字型單詞,scanner調用nextInt()或nextDouble()方法將發生InputMismatchException異常,在處理異常時可以調用next()方法返回該非數字化單詞。
???????例題13 ???使用Scanner對象解析字符串"TV cost 876 dollar.Computer cost 2398 dollar.telephone cost 1278 dollar"中的全部價格數字(價格數字的前后需有空格),并計算了總消費。
??2.使用正則表達式作為分隔標記解析字符串
???????Scanner對象可以調用 useDelimiter(正則表達式); 方法將一個正則表達式作為分隔標記,即和正則表達式匹配的字符串都是分隔標記。
?Date類 :
???Date類在java.util包中。
1.使用Date類的無參數構造方法創建的對象可以獲取本地當前時間。 Date()
?????例: Date nowTime=new Date();
當前nowTime對象中含有的日期、時間就是創建nowTime對象時的本地計算機的日期和時間。例如,假設當前時間是:2011年3月10日23:05:32(CST時區),那么
System.out.println(nowTime); 輸出結果是:Thu Mar 10 23:05:32 CST 2011。
??????Date對象表示時間的默認順序是:星期、月、日、小時、分、秒、年
2.使用帶參數的構造方法 ?Date(long time)
計算機系統將其自身的時間的“公元”設置在1970年1月1日0時(格林威治時間),可以根據這個時間使用Date的帶參數的構造方法:Date(long time)來創建一個Date對象,例如:
????????Date date1=new Date(1000), date2=new Date(-1000);
其中的參數取正數表示公元后的時間,取負數表示公元前的時間,例如1000表示1000毫秒,那么,date1含有的日期、時間就是計算機系統公元后1秒時刻的日期、時間。如果運行Java程序的本地時區是北京時區(與格林威治時間相差8個小時),那么上述date1就是1970年01月01日08時00分01秒、date2就是1970年01月01日07時59分59秒。
3.System類的靜態方法 public long currentTimeMillis() 獲取系統當前時間
Calendar類:
1 ?Calendar類在java.util包中。使用Calendar類的static方法 getInstance()可以初始化一個日歷對象,如:
????Calendar calendar= Calendar.getInstance();
2 calendar對象可以調用方法:
???public final void set(int year,int month,int date)
???public final void set(int year,int month,int date,int hour,int minute)
???public final void set(int year,int month, int date, int hour, int minute,int second)
?????將日歷翻到任何一個時間
3 calendar對象常用方法
◆public int get(int field) :可以獲取有關年份、月份、小時、星期等信息
???例如:calendar.get(Calendar.MONTH); 返回一個整數,如果該整數是0表示當前日歷是在一月,該整數是1表示當前日歷是在二月等。
???例如:calendar.get(Calendar.DAY_OF_WEEK);返回一個整數,如果該整數是1表示星期日,如果是2表示是星期一,依次類推,如果是7表示是星期六。 ???
◆ public long getTimeInMillis() :可以將時間表示為毫秒。?
format方法 :
Formatter類的format方法:format(格式化模式, 日期列表)
按著“格式化模式”返回“日期列表”中所列各個日期中所含數據(年,月,日,小時等數據)的字符串表示。Java已經將format方法做為了String類的靜態方法,因此,程序可以直接使用String類調用format方法對日期進行格式化。
1.格式化模式
format方法中的“格式化模式”是一個用雙引號括起的字符序列(字符串),該字符序列中的字符由時間格式符和普通字符所構成。例如:"日期:%ty-%tm-%td"
String s = String.format("%tY年%tm月%td日",new Date(),new Date(),new Date()); 那么s就是"2011年02月10日
2.日期列表
format方法中的“日期列表”可以是用逗號分隔的Calendar對象或Date對象。 format方法默認按從左到右的順序使用“格式化模式”中的格式符來格式“日期列表”中對應的日期,而“格式化模式”中的普通字符保留原樣。
3.格式化同一日期 ????可以在“格式化模式”中使用“<”,比如:"%ty-%<tm-%<td"中的三個格式符將格式化同一日期,即含有“<”的格式符和它前面的格式符格式同一個日期,例如:String s = String.format("%ty年%<tm月%<td日",new Date());那么%<tm和%<td都格式化new Date(),因此字符串s就是:"11年02月10日"。
不同區域的星期格式 :
如果想用特定地區的星期格式來表示日期中的星期,可以用format的重載方法:
format (Locale locale,格式化模式,日期列表);
其中的參數locale是一個Locale類的實例,用于表示地域。
Locale類的static常量都是Locale對象,其中US是表示美國的static常量。
比如,假設當前時間是2011-02-10,對于(%ta表示簡稱的星期):
String s = String.format(Locale.US,"%ta(%<tF)",new Date());
那么s是"Thu(2011-02-10)",
對于(%tA表示全稱的星期)
String s = String.format(Locale.JAPAN,"%tA(%<tF)",new Date());
那么s是"木曜日(2011-02-10)"。
??Math類 :
?Math類在java.lang包中。Math類包含許多用來進行科學計算的類方法,這些方法可以直接通過類名調用。另外,Math類還有兩個靜態常量,它們分別是:
E ??2.7182828284590452354和PI ???3.14159265358979323846。
以下是Math類的常用類方法:
* public static long abs(double a) ?返回a的絕對值。
* public static double max(double a,double b) 返回a、b的最大值。
* public static double min(double a,double b) 返回a、b的最小值。
* public static double random() ?產生一個0到1之間的隨機數(不包括0和1)。
* public static double pow(double a,double b) 返回a的b次冪。
* public static double sqrt(double a) 返回a的平方根。
* public static double log(double a) ?返回a的對數。
* public static double sin(double a) 返回正弦值。
* public static double asin(double a) ?返回反正弦值。
?BigInteger類 :
1 java.math包中的BigInteger類提供任意精度的整數運算。可以使用構造方法:
??????public BigInteger(String val) ?構造一個十進制的BigInteger對象。
2 以下是BigInteger類的常用類方法:
*public BigInteger add(BigInteger val) ?返回當前大整數對象與參數指定的大整數對象的和。
*public BigInteger subtract(BigInteger val)返回當前大整數對象與參數指定的大整數對象的差。
* public BigInteger multiply(BigInteger val)返回當前大整數對象與參數指定的大整數對象的積。
*public BigInteger divide(BigInteger val)返回當前大整數對象與參數指定的大整數對象的商。
*public BigInteger remainder(BigInteger val)返回當前大整數對象與參數指定的大整數對象的余。
*public int compareTo(BigInteger val) 返回當前大整數對象與參數指定的大整數的比較結果,返回值是1、-1或0,分別表示當前大整數對象大于、小于或等于參數指定的大整數。
*public BigInteger abs() ?返回當前大整數對象的絕對值。
*public BigInteger pow(int a) ?返回當前大整數對象的a次冪。
*public String toString() ?返回當前大整數對象十進制的字符串表示。
*public String toString(int p) ?返回當前大整數對象p進制的字符串表示。
Random類 :
??Java提供了更為靈活的用于獲得隨機數的Random類(該類在java.util包中)。 Random類的如下構造方法:
?????public Random();
?????public Random(long seed);使用參數seek指定的種子創建一個Random對象
?????人們習慣地將Random對象稱為隨機數生成器。
◆?返回一個隨機整數 ??隨機數生成器random調用不帶參數的nextInt()方法:
??????Random random=new Random();
??????random.nextInt();
◆ 返回一個0至n之間(包括0,但不包括n)的隨機數 隨機數生成器random調用帶參數的nextInt(int m)方法(參數m必須取正整數值)
????例如,random.nextInt(100);返回一個0至100之間的隨機整數(包括0,但不包括100)。
◆ 隨機得到true和false兩個表示真和假的boolean值, 隨機數生成器random調用nextBoolean()方法
???例如 random.nextBoolean();返回一個隨機boolean值。
Formatter 類:
Formatter類提供了一個和C語言printf函數類似的format方法:
format(格式化模式,值列表)
該方法按著“格式化模式”返回“值列表”的字符串表示。
Java已經將format方法做為了String類的靜態方法,因此,程序可以直接使用String類調用format方法對數字進行格式化。
1.格式化模式 ?format方法中的“格式化模式”是一個用雙引號括起的字符序列(字符串),該字符序列中的字符由格式符和普通字符所構成。
例如:"輸出結果%d,%f,%d"中的%d和%f是格式符號 .
?????format方法返回的字符串就是“格式化模式”中的格式符被替換為它得到的格式化結果后的字符串。例如:String s = String.format(“%.2f”,3.141592);那么s就是“3.14”.
2.值列表 ??format方法中的“值列表”是用逗號分隔的變量、常量或表達式。 例如:
String s=format("%d元%0.3f公斤%d臺",888,999.777666,123); 那么,s就是"888元999.778公斤123臺"。
3.格式化順序
format方法默認按從左到右的順序使用“格式化模式”中的格式符來格式化“值列表”中對應的值,而“格式化模式”中的普通字符保留原樣。
例如,假設int型變量x和double型變量y的值分別是888和3.1415926,
那么對于String s = format("從左向右:%d,%.3f,%d",x,y,100);字符串s就是:從左向右:888,3.142,100
格式化整數:
1.%d,%o,%x和%格式符可格式化byte、Byte、short、Short、int、Integer、long和Long型數據,詳細說明見Page204. 例如,對于:
String s = String.format("%d,%o,%x,%X",703576,703576,703576,703576);
字符串s就是:703576,2536130,abc58,ABC58
2.修飾符
加號修飾符"+"格式化正整數時,強制添加上正號,例如,%+d將123格式化為"+123"。
逗號修飾符“,”格式化整數時,按"千"分組,例如,對于:
String s=String.format("按千分組:%,d。按千分組帶正號%+,d",1235678,9876);
字符串s就是:按千分組:1,235,678。按千分組帶正號+9,876
3.數據的寬度
數據的寬度就是format方法返回的字符串的長度。規定數據寬度的一般格式為“%md”,其效果是在數字的左面增加空格;或"%-md“,其效果是在數字的右面增加空格,
例如,將數字59格式化為寬度為8的字符串:String s=String.format("%8d",59);
字符串s就是:" ?????59",其長度(s.length())為8,即s在59左面添加了6個空格字符。
對于:String s=String.format(“%-8d”,59);字符串s就是:"59 ???????",其長度(s.length())為8。
對于:String s=String.format("%5d%5d%8d",59,60,90);字符串s就是:" ??59 ??60 ?????90"(長度為18
格式化浮點數 :
1.%f,%e(%E),%g(%G)和%a(%A)格式符可格式化float、Float、double和Double:
???%f 將值格式化為十進制浮點數,小數保留6位。
???%e(%E) 將值格式化為科學記數法的十進制的浮點數(%E在格式化時將其中的指數符號大寫,例如5E10)。
例如,對于:String s = String.format("%f,%e",13579.98,13579.98);
字符串s就是:13579.980000,1.357998e+04
2.修飾符
加號修飾符"+"格式化正數時,強制添加上正號,例如%+f將123.78格式化為"+123.78", %+E將123.78格式化為"+1.2378E+2"。 逗號修飾符“,”格式化浮點數時,將整數部分按“千”分組,
例如,對于:String s=String.format("整數部分按千分組: %+,f",1235678.9876);
字符串s就是:整數部分按千分組:+1,235,678.987600
3.限制小數位數與數據的“寬度”
?????◆ ?"%.nf"可以限制小數的位數,其中的n是保留的小數位數,例如%.3f將6.1256格式化為"6.126"(保留3位小數)。
?規定寬度的一般格式為“%mf”(在數字的左面增加空格),或“%-md”(在數字的右面增加空格)。
例如,將數字59.88格式化為寬度為11的字符串
String s=String.format(“%11f”,59.88); 字符串s就是:" ?59.880000",其長度(s.length())為11。
String s=String.format(“%-11f”,59.88);字符串s就是: "59.880000 ?",其長度(s.length())為11。
◆在指定寬度的同時也可以限制小數位數(%m.nf),
String s=String.format(“%11.2f”,59.88); ?字符串s就是:" ?????59.88",即s在59.88左面添加了6個空格字符。
◆ 在寬度的前面增加前綴0,表示用數字0(不用空格)來填充寬度左面的富裕部分,例如:
String s=String.format(“%011f”,59.88); 字符串s就是:"0059.880000",其長度(s.length())11
StringBuffer對象的創建:
StringBuffer類能創建可修改的字符串序列,該類的對象的實體的內存空間可以自動的改變大小,便于存放一個可變的字符序列。一個StringBuffer對象調用append方法可以追加字符序列,如圖819所示。例如:
StringBuffer s = new StringBuffer("我喜歡");
s.append("玩籃球"); ??
StringBuffer類有三個構造方法:
1.StringBuffer()
2.StringBuffer(int size)
3.StringBuffer(String s)
StringBuffer類的常用方法:
1.StringBuffer append(String s):將一個字符串對象追加到當前StringBuffer對象中 StringBuffer append(int n):將一個int型數據轉化為字符串對象后再追加到當前StringBuffer對象中StringBuffer append(Object o):將一個Object對象的字符串表示追加到當前StringBuffer對象中
類似的方法還有:
???StringBuffer append(long n),StringBuffer append(boolean n),
???StringBuffer append(float n),StringBuffer append(double n),
???StringBuffer append(char n)
2.public chat charAt(int n ):得到參數n指定的置上的單個字符
???public void setCharAt(int n ,char ch):將當前StringBuffer對象實體中的字符串位置n處的字符用參數ch指定的字符替換
3.StringBuffer insert(int index, String str) :將參數str指定的字符串插入到參數index指定的位置
4.public StringBuffer reverse() :將該對象實體中的字符翻轉
5.StringBuffer delete(int startIndex, int endIndex):從當前StringBuffer對象實體中的字符串中刪除一個子字符串
???其相關方法:deleteCharAt(int index) 刪除當前StringBuffer對象實體的字符串中index位置處的一個字符。
Pattern與Matcher類:
Java提供了專門用來進行模式匹配的Pattern類和Matcher類,這些類在java.util.regex包中。 ?以下結合具體問題來講解使用Pattern類和Matcher類的步驟。假設有字符串:
String input = "hello,good morning,this is a good idea"
我們想知道input從哪個位置開始至哪個位置結束曾出現了字符串good。
使用Pattern類和Matcher類檢索字符串str中的子字符串的步驟如下:
1.建立模式對象
使用正則表達式regex做參數得到一個稱為模式的Pattern類的實例pattern:
例如:String regex = "good";
?????Pattern pattern = Pattern.compile(regex);
模式對象是對正則表達式的封裝。Pattern類調用類方法compile(String regex)返回一個模式對象,其中的參數regex是一個正則表達式, 稱為模式對象使用的模式。
2.得到匹配對象
?????模式對象pattern調用matcher(CharSequence input)方法返回一個Matcher對象matcher,稱為匹配對象 ????????????
Matcher matcher = pattern.matcher(input);
Matcher對象matcher可以使用下列方法尋找字符串input中是否有和模式regex匹配的子序列(regex是創建模式對象pattern時使用的正則表達式)。
◆public boolean find():尋找input和regex匹配的下一子序列,如果成功該方法返回true,否則返回false。
◆ public boolean matches():matcher調用該方法判斷input是否完全和regex匹配。
◆ public boolean lookingAt():matcher調用該方法判斷從input的開始位置是否有和regex匹配的子序列。
◆ public boolean find(int start) : matcher調用該方法判斷input從參數start指定位置開始是否有和regex匹配的子序列 。
◆ public String replaceAll(String replacement) matcher調用該方法可以返回一個字符串,該字符串是通過把input中與模式regex匹配的子字符串全部替換為參數replacement指定的字符串得到的.
◆ public String replaceFirst(String replacement) matcher調用該方法可以返回一個字符串,該字符串是通過把input中第1個與模式regex匹配的子字符串替換為參數replacement指定的字符串得到的。
使用Class實例化一個對象 :
?Class是java.lang包中的類,該類的實例可以幫助程序創建其他類的實例或者取得其他類的對象的內部信息。
創建對象最常用的方式就是使用new運算符和類的構造方法,實際上也可以使用Class對象得到某個類的實例。步驟如下:
(1)使用Class的類方法得到一個和某類(參數className指定的類)相關的Class對象:
?public static Class forName(String className) throws ClassNotFoundException
?上述方法返回一個和參數className指定的類相關的Class對象。
(2)步驟(1)中獲得的Class對象調用
public Object newInstance() throws InstantiationException,IllegalAccessException
方法就可以得到一個className類的對象。要特別注意的是:使用Class對象調用newInstance()實例化一個className類的對象時,className類必須有無參數的構造方法。
獲取類的有關信息 :
Class對象經常調用的方法如下:
◆ String getName() 返回類的名字
◆ Constructor[] getDeclaredConstructors() ?返回類的全部構造方法。
◆ Field[] getDeclaredFields() ?返回類的全部成員變量。
◆ Method[] getDeclaredMethods() ?返回類的全部方法。
?Java Swing概述 :
?javax.swing包中JComponent類是java.awt包中Container類的一個直接子類、是java.awt包中Component類的一個間接子類,學習GUI編程主要是學習掌握使用Component類的一些重要的子類。以下是GUI編程經常提到的基本知識點 。
(1)Java把Component類的子類或間接子類創建的對象稱為一個組件。
(2)Java把Container的子類或間接子類創建的對象稱為一個容器。
(3)可以向容器添加組件。Container類提供了一個public方法:add( ),一個容器可以調用這個方法將組件添加到該容器中。
(4)容器調用removeAll()方法可以移掉容器中的全部組件;調用remove(Component c)方法可以移掉容器中參數c指定的組件。
(5)注意到容器本身也是一個組件,因此可以把一個容器添加到另一個容器中實現容器的嵌套。
(6)每當容器添加新的組件或移掉組件時,應當讓容器調用validate()方法,以保證容器中的組件能正確顯示出來
窗口 :
Java提供的JFrame類的實例是一個底層容器,即通常所稱的窗口。其他組件必須被添加到底層容器中,以便借助這個地層容器和操作系統進行信息交互。 JFrame類是Container類的間接子類。當需要一個窗口時,可使用JFrame或其子類創建一個對象
???JFrame常用方法 :
JFrame() 創建一個無標題的窗口。
JFrame(String s) 創建標題為s的窗口。
public void setBounds(int a,int b,int width,int height 設置窗口的初始位置是(a,b),即距屏幕左面a個像素、距屏幕上方b個像素;窗口的寬是width,高是height。
public void setSize(int width,int height) 設置窗口的大小。
public void setLocation(int x,int y) 設置窗口的位置,默認位置是(0,0)。
public void setVisible(boolean b) 設置窗口是否可見,窗口默認是不可見的。
public void setResizable(boolean b) 設置窗口是否可調整大小,默認可調整大小。
public void dispose() 撤消當前窗口,并釋放當前窗口所使用的資源。
public void setExtendedState(int state) 設置窗口的擴展狀態.
public void setDefaultCloseOperation(int operation) ?該方法用來設置單擊窗體右上角的關閉圖標后,程序會做出怎樣的處理。
菜單條、菜單、菜單項 :
1.菜單條
????JComponent類的子類JMenubar負責創建菜單條,JFrame類有一個將菜單條放置到窗口中的方法:setJMenuBar(JMenuBar bar);該方法將菜單條添加到窗口的頂端
2.菜單:JComponent類的子類JMenu負責創建菜單, JMenu類的主要方法有以下幾種
???public void add(JMenuItem item) 向菜單增加由參數item指定的菜單選項。
???public JMenuItem getItem(int n) 得到指定索引處的菜單選項。
???public int getItemCount() 得到菜單選項的數目。
3.菜單項
???JComponent類的子類JMenuItem負責創建菜單項,JMenuItem類的主要方法有以下幾種:
??JMenuItem(String s) 構造有標題的菜單項。
??JMenuItem(String text, Icon icon) 構造有標題和圖標的菜單項
??public void setAccelerator(KeyStroke keyStroke) 為菜單項設置快捷鍵。
常用組件 :
1.文本框:由JComponent的子類JTextField創建文本框。
2.文本區:由JComponent的子類JTexArea創建文本區。
3.按鈕:由JComponent的子類JButton類用來創建按鈕。
4.標簽:由JComponent的子類JLabel類用來創建標簽。
5.選擇框:由JComponent的子類JCheckBox類用來創建選擇框。
6.單選按鈕:由JComponent的子類JRadioButton類用來創建單項選擇框。
7.下拉列表:由JComponent的子類JComboBox類用來創建下拉列表。
8.密碼框:由JComponent的子類JPasswordField創建密碼框。
密碼框可以使用setEchoChar(char c)重新設置回顯字符 。
密碼框調用char[] getPassword()方法可以返回實際的密碼
常用容器:
?JComponent是Container的子類,因此JComponent子類創建的組件也都是容器。容器經常用來添加組件。Jframe是底層容器,本節提到的容器被習慣地稱做中間容器,中間容器必須被添加到底層容器中才能發揮作用。
1.JPanel 面板:使用JPanel創建面板,再向這個面板添加組件,然后把這個面板添加到其它容器中。JPanel面板的默認布局是FlowLayout布局。
2.滾動窗格JScrollPane:可以將文本區放到一個滾動窗格中。
?JScorollPane scroll=new JScorollPane(new JTextArea());
3.拆分窗格JSplitPane:窗格有兩種類型:水平拆分和垂直拆分
JSplitPane的兩個常用的構造方法:
??JSplitPane(int a,Component b,Component c)
??JSplitPane(int a, boolean b,Component c,Component d) ?
4.JLayeredPane分層窗格:分層窗格使用
add(Jcomponent com, int layer);添加組件com,并指定com所在的層
public void setLayer(Component c,int layer)可以重新設置組件c所在的層
public int getLayer(Component c)可以獲取組件c所在的層數。
常用布局:
?容器可以使用方法setLayout(布局對象);設置自己的布局,控制組件在容器中的位置。 ?
1.FlowLayout布局 :
1)創建布局對象 FlowLayout flow=new FlowLayout();
2)容器con使用布局對象con.setLayout(flow);
3)con可以使用Container類提供的add方法將組件順序地添加到容器中;
FlowLayout布局對象調用相應的方法可以重新設置布局的對齊方式等.
2.BorderLayout布局 :
BorderLayout 布局是Window型容器的默認布局 。
使用BorderLayout布局的容器con,可以使用add方法將一個組件b添加到中心區域:con.add(b,BorderLayout.CENTER);或 ?con.add(BorderLayour.CENTER,b);
3.CardLayout 布局 : ?使用CardLayout的一般步驟如下:
??1)創建CardLayout對象 CardLayout card=new CardLayout();
??2)為容器設置布局 con.setLayout(card);
??3)容器調用add(String s,Component b)將組件b加入容器,并給出了顯示該組件的代號s。
??4)布局對象card用CardLayout類提供的show()方法,顯示容器con中組件代號為s的組件:card.show(con,s);
4.GridLayout布局 :
GridLayout布局策略是把容器劃分成若干行乘若干列的網格區域,組件就位于這些劃分出來的小格中。 GridLayout布局編輯器的一般步驟如下:
1)創建布局對象,指定劃分網格的行數m和列數n GridLayout grid=new new GridLayout(10,8);
2)使用GridLayout布局的容器調用方法add(Component c)將組件c加入容器。
5.BoxLayout布局:
使用盒式布局的容器將組件排列在一行或一列 .BoxLayout布局的一般步驟如下:
1)創建布局對象,使用BoxLayou的構造方法BoxLayout(Container con,,int axis)可以創建一個盒式布局對象.
2)可以使用Box類的類(靜態)方法 createHorizontalBox()獲得一個具有行型盒式布局的盒式容器; ?使用Box類的類(靜態)方法 createVerticalBox()獲得一個具有列型盒式布局的盒式容器。
3)控制盒式布局容器中組件之間的距離
Box類調用靜態方法createHorizontalStrut(int width)可以得到一個不可見的水平Struct對象,稱做水平支撐。 Box類調用靜態方法createVertialStrut(int height)可以得到一個不可見的垂直Struct對象,稱做垂直支撐。
例子5 ?Example9_5.java ?WindowBoxLayout.java
兩個列型盒式容器boxV1、boxV2和一個行型盒式容器baseBox。
在列型盒式容器的組件之間添加垂直支撐,控制組件之間的距離,將boxV1、boxV2添加到baseBox中,并在它倆之間添加了水平支撐。程序運行效果如圖9.6。
6.null布局 :
空布局容器可以準確地定位組件在容器的位置和大小。組件調用setBounds(int a,int b,int width,int height)方法可以設置本身的大小和在容器中的位置。
處理事件:
學習組件除了要熟悉組件的屬性和功能外,一個更重要的方面是學習怎樣處理組件上發生的界面事件。當用戶在文本框中鍵入文本后按回車鍵、單擊按鈕、在一個下拉式列表中選擇一個條目等操作時,都發生界面事件。
程序有時需對發生的事件作出反應,來實現特定的任務,例如,用戶單擊一個名字叫“確定”或名字叫“取消”的按鈕,程序可能需要作出不同的處理。
?事件處理模式 :
1.事件源 :能夠產生事件的對象都可以成為事件源 .
2.監視器 :事件源通過調用相應的方法將某個對象注冊為自己的監視器。對于文本框,這個方法是:addActionListener(監視器);事件源注冊監視器之后,相應的操作就會導致相應的事件的發生,并通知監視器,監視器就會作出相應的處理。
3.處理事件的接口:
監視器負責處理事件源發生的事件。監視器是一個對象,為了處理事件源發生的事件,監視器這個對象會自動調用一個方法來處理事件。 Java規定:為了讓監視器這個對象能對事件源發生的事件進行處理,創建該監視器對象的類必須聲明實現相應的接口,那么當事件源發生事件時,監視器就自動調用被類重寫的某個接口方法
ActionEvent事件:
?1. ActionEvent事件源 :
文本框、按紐、菜單項、密碼框和單選按紐都可以觸發ActionEvent事件,即都可以成為ActionEvent事件的事件源。
2.注冊監視器: 能觸發ActionEvent事件的組件使用
addActionListener(ActionListener listen)
將實現ActionListener接口的類的實例注冊為事件源的監視器。
3.ActionListener接口 :
ActionListener接口在java.awt.event包中,該接口中只有一個方法:
public void actionPerformed(ActinEvent e)
事件源觸發ActionEvent事件后,監視器將發現觸發的ActionEvent事件,然后調用接口中的方法:actionPerformed(ActinEvent e)對發生的事件作出處理。ActionEvent類事先創建的事件對象就會傳遞給該方法的參數e。 ?
4.ActionEvent類中的方法 :
public Object getSource() 調用該方法可以獲取發生ActionEvent事件的事件源對象的引用。
public String getActionCommand() 調用該方法可以獲取發生ActionEvent事件時,和該事件相關的一個命令字符串。
ItemEvent事件:
1.ItemEvent事件源 :選擇框、下拉列表都可以觸發ItemEvent事件。
2.注冊監視器:能觸發ItemEvent事件的組件使用
addItemListener(ItemListener listen)
將實現ItemListener接口的類的實例注冊為事件源的監視器。
3.ItemListener接口 :
ItemListener接口在java.awt.event包中,該接口中只有一個方法:
public void itemStateChanged(ItemEvent e)
事件源觸發ItemEvent事件后,監視器將發現觸發的ItemEvent事件,然后調用接口中的itemStateChanged(ItemEvent ?e)方法對發生的事件作出處理。ItemEvent類事先創建的事件對象就會傳遞給該方法的參數e。
4. ItemEvent類中的方法 :
getSource()方法返回發生Itemevent事件的事件源外
getItemSelectable()方法返回發生Itemevent事件的事件源。
?DocumentEvent事件:
2.注冊監視器:能觸發DocumentEven事件的事件源使用
addDucumentListener(DocumentListener listen)
將實現DocumentListener接口的類的實例注冊為事件源的監視器。
3.DocumentListener接口 :
DocumentListener接口在javax.swing.event包中,該接口中有三個方法:
public void changedUpdate(DocumentEvent e) ???
public void removeUpdate(DocumentEvent e)
public void insertUpdate(DocumentEvent e)
MouseEvent事件:
任何組件上都可以發生鼠標事件,如:鼠標進入組件、退出組件、在組件上方單擊鼠標、拖動鼠標等都觸發鼠標事件,即導致MouseEvent類自動創建一個事件對象。
?1.使用MouseListener接口可以處理以下5種操作觸發的鼠標事件
????在事件源上按下鼠標鍵、在事件源上釋放鼠標鍵、在事件源上擊鼠標鍵、鼠標進入事件源、鼠標退出事件源。
?? MouseEvent 中有下列幾個重要的方法:
???getX() 獲取鼠標指針在事件源坐標系中的x-坐標。
???getY() 獲取鼠標指針在事件源坐標系中的y-坐標。
???getModifiers() 獲取鼠標的左鍵或右鍵。
???getClickCount() 獲取鼠標被單擊的次數。
???getSource() 獲取發生鼠標事件的事件源。
??事件源注冊監視器的方法是addMouseListener(MouseListener listener)。
?? MouseListener接口中有如下方法:
???mousePressed(MouseEvent) 負責處理在組件上按下鼠標鍵觸發的鼠標事件
???mouseReleased(MouseEvent) 負責處理在組件上釋放鼠標鍵觸發的鼠標事件
???mouseEntered(MouseEvent) 負責處理鼠標進入組件觸發的鼠標事件
???mouseExited(MouseEvent) 負責處理鼠標離開組件觸發的鼠標事件
???mouseClicked(MouseEvent) 負責處理在組件上單擊鼠標鍵觸發的
2.使用MouseMotionListener接口可以處理以下兩種操作觸發的鼠標事件, ?在事件源上拖動鼠標、在事件源上移動鼠標。
?? 事件源注冊監視器的方法是
????addMouseMotionListener(MouseMotionListener listener)。
?? MouseMotionListener接口中有如下方法:
????mouseDragged(MouseEvent) ?負責處理拖動鼠標觸發的鼠標事件。
mouseMoved(MouseEvent) ?負責處理移動鼠標觸發的鼠標事件。
??焦點事件:
1.焦點事件源 :組件可以觸發焦點事件。
2.注冊監視器:組件可以使用
????addFocusListener(FocusListener listener)
注冊焦點事件監視器。
3.FocusListener接口 :
???創建監視器的類必須要實現FocusListener接口,該接口有兩個方法:
??????public void focusGained(FocusEvent e)
??????public void focusLost(FocusEvent e)
???當發生FocusEvent事件時,監視器調用類實現的接口中的相應方法。
?4.組件也可調用
???????public boolean requestFocusInWindow()
方法可以獲得輸入焦點。
鍵盤事件:
當一個組件處于激活狀態時,敲擊鍵盤上一個鍵就導致這個組件觸發鍵盤事件。
1.某個組件使用addKeyListener方法注冊監視器。
2.接口KeyListener中有如下方法:
??public void keyPressed(KeyEvent e),
??public void keyTyped(KeyEvent e),
??public void KeyReleased(KeyEvent e) ?
3.相關方法:
???public int getKeyCode()判斷哪個鍵被按下、敲擊或釋放,返回一個鍵碼值 。 ?????
???getKeyChar()判斷哪個鍵被按下、敲擊或釋放,返回鍵上的字符。
?窗口事件:
JFrame及子類創建的窗口可以調用
setDefaultCloseOperation(int operation);
方法設置窗口的關閉方式(如前面各個例子所示).
但是setDefaultCloseOperation方式可能不能滿足程序的需要,比如,用戶單擊窗口上的關閉圖標時,可能程序需要提示用戶是否需要保存窗口中的有關數據到磁盤等 .
6) public void windowDeiconified(WindowEvent e) ?當窗口撤消圖標化時,窗口的監視器調用該方法。
7) public void windowOpened(WindowEvent e) ?當窗口打開時,窗口的監視器調用該方法。
2. WindowAdapter適配器 .
適配器可以代替接口來處理事件,當Java提供處理事件的接口中多于一個方法時,Java相應地就提供一個適配器類,比如WindowAdapter類。適配器已經實現了相應的接口,例如WindowAdapter類實現了WindowListener接口。因此,可以使用WindowAdapte的子類創建的對象做監視器,在子類中重寫所需要的接口方法即可。
匿名類實例或窗口做監視器:
匿名類的方便之處是匿名類的外嵌類的成員變量在匿名類中仍然有效,當發生事件時,監視器就比較容易操作事件源所在的外嵌類中的成員.當事件的處理比較簡單、系統也不復雜時,使用匿名類做監視器是一個不錯的選擇。
讓事件源所在的類的實例作為監視器,能讓事件的處理比較方便,這是因為,監視器可以方便的操作事件源所在的類中的其他成員。當事件的處理比較簡單,系統也不復雜時,讓事件源所在的類的實例作為監視器是一個不錯的選擇。
事件總結:
1.授權模式
Java的事件處理是基于授權模式,即事件源調用調用方法將某個對象注冊為自己的監視器。
2.接口回調
addXXXListener(XXXListener listener)方法中的參數是一個接口,listener可以引用任何實現了該接口的類所創建的對象,當事件源發生事件時,接口listener立刻回調被類實現的接口中的某個方法。
3.方法綁定
當事件源觸發事件發生后,監視器準確知道去調用哪個方法。
4.保持松耦合
當事件源觸發事件發生后,系統知道某個方法會被執行,但無須關心到底是哪個對象去調用了這個方法,因為任何實現接口的類的實例(做為監視器)都可以調用這個方法來處理事件
?
?使用MVC結構 :
?模型-視圖-控制器(Model-View-Controller),簡稱為MVC。
???MVC是一種先進的設計結構,其目的是以會話形式提供方便的GUI支持。
???MVC是一種通過三個不同部分構造一個軟件或組件的理想辦法:
?模型(model) ?用于存儲數據的對象。
?視圖(view) ??為模型提供數據顯示的對象。
?控制器(controller)處理用戶的交互操作,對于用戶的操作作出響應,讓模型和視圖進行必要的交互,即通過視圖修改、獲取模型中的數據;當模型中的數據變化時,讓視圖更新顯示。
對話框 :
JDialog類和JFrame都是Window的子類,二者的實例都是底層容器。
JDialog類創建的對話框必須要依賴于某個窗口。
對話框分為無模式和有模式兩種。
有模式的對話框:當這個對話框處于激活狀態時,只讓程序響應對話框內部的事件,而且將堵塞其它線程的執行,用戶不能再激活對話框所在程序中的其它窗口,直到該對話框消失不可見。
無模式對話框:當這個對話框處于激活狀態時,能再激活其它窗口,也不堵塞其它線程的執行。
消息對話框 :
消息對話框是有模式對話框,進行一個重要的操作動作之前,最好能彈出一個消息對話框。可以用javax.swing包中的JOptionPane類的靜態方法:
????public static void showMessageDialog(
???????????????????????Component parentComponent,
???????????????????????String message,
???????????????????????String title,
???????????????????????int messageType)
創建一個消息對話框。
輸入對話框 :
輸入對話框含有供用戶輸入文本的文本框、一個確認和取消按鈕,是有模式對話框 。
可以用javax.swing包中的JOptionPane類的靜態方法:
??public static String showInputDialog(Component parentComponent,
??????????????????????????????????????Object message,
??????????????????????????????????????String title,
??????????????????????????????????????int messageType)
??創建一個輸入對話框。
確認對話框 :
確認對話框是有模式對話框。
可以用javax.swing包中的JOptionPane類的靜態方法:
public static int showConfirmDialog(Component parentComponent,
????????????????????????????????????Object message,
????????????????????????????????????String title,
????????????????????????????????????int optionType)
?得到一個確認對話框。
顏色對話框:
?可以用javax.swing包中的JColorChooser類的靜態方法: public static Color showDialog(Component component, ???????
????????????????????????????????????????String title,
????????????????????????????????????????Color initialColor)
創建一個有模式的顏色對話框 ?。
自定義對話框:
創建對話框與創建窗口類似,通過建立JDialog的子類來建立一個對話框類,然后這個類的一個實例,即這個子類創建的一個對象,就是一個對話框。對話框是一個容器,它的默認布局是BorderLayout,對話框可以添加組件,實現與用戶的交互操作。
構造對話框的2個常用構造方法
JDialog() 構造一個無標題的初始不可見的對話框,對話框依賴一個默認的不可見的窗口,該窗口由Java運行環境提供。
JDialog(JFrame owner) 構造一個無標題的初始不可見的無模式的對話框,owner是對話框所依賴的窗口,如果owner取null,對話框依賴一個默認的不可見的窗口,該窗口由Java運行環境提供。
樹組件與表格組件:
樹組件:
DefaultMutableTreeNode類的兩個常用的構造方法是:
DefaultMutableTreeNode(Object userObject)
DefaultMutableTreeNode(Object userObject,boolean allowChildren)
2.樹上的TreeSelectionEvent事件
使用addTreeSelectionListener(TreeSelectionListener listener)方法獲得一個監視器。
表格組件:
表格組件以行和列的形式顯示數據,允許對表格中的數據進行編輯。表格的模型功能強大、靈活并易于執行。表格是最復雜的組件,對于初學者,這里只介紹默認的表格模型。
JTable有7個構造方法,這里介紹常用的三個。
?????JTable() 創建默認的表格模型。
?????JTable(int a,int b) 創建a行,b列的默認模型表格
?????JTable (Object data[][],Object ?columnName[]) 創建默認表格模型對象,并且顯示由data指定的二維數組的值,其列名由數組columnName指定。
通過對表格中的數據進行編輯,可以修改表格中二維數組data中對應的數據數據。在表格中輸入或修改數據后,需按回車或用鼠標單擊表格的單元格確定所輸入或修改的結果。當表格需要刷新顯示時,讓表格調用repaint方法。
按鈕綁定到鍵盤 :
(1) 獲取輸入映射. ??按鈕首先調用
???public final InputMap getInputMap(int condition) ?
???方法返回一個InputMap對象.
(2)綁定按鈕的鍵盤操作. ??步驟(1)返回的輸入映射首先調用方法
???public void put(KeyStroke keyStroke,Object actionMapKey)
??將敲擊鍵盤上的某鍵指定為按鈕的鍵盤操作.
(3)為按鈕的鍵盤操作指定監視器. ???按鈕調用方法
????public final ActionMap getActionMap()
????返回一個ActionMap對象:
????ActionMap actionmap = button.getActionMap();
????然后,該對象actionmap調用方法:
????public void put(Object key,Action action)
????為按鈕的鍵盤操作指定監視器
打印組件:
步驟如下:
1.獲取ToolKit對象
讓組件調用getToolkit()方法返回系統提供的Toolkit對象。
2.獲得PrintJob對象
Toolkit對象調用getPrintJob()方法返回一個PrintJob對象。
3.獲取Graphics對象
PrintJob對象使用getGraphics()方法獲得一個Graphics對象。
4.打印組件
步驟3獲取的Graphics對象是g,組件調用
paintAll(g)
將打印出該組件及其子組件。如果調用方法:
pain(g)
平臺無關:
在一個計算機上編譯得到的字節碼文件可以復制到任何一個安裝了Java運行環境的計算機上直接使用。字節碼由Java虛擬機負責解釋運行,即Java虛擬機負責將字節碼翻譯成本地計算機的機器碼,并將機器碼交給本地的操作系統來運行。
Java程序的開發步驟 :
1.編寫源文件:擴展名必須是.java。
2.編譯Java源程序:用Java編譯器(javac.exe)編譯源文件,得到字節碼文件。
3.運行Java程序:使用Java解釋器(java.exe)來解釋執行字節碼文件。 ?
保存源文件:
如果源文件中有多個類,那么只能有一個類是public類;如果有一個類是public類,那么源文件的名字必須與這個類的名字完全相同,擴展名是java;如果源文件沒有public類,那么源文件的名字只要和某個類的名字相同,并且擴展名是java就可以了
標識符:
用來標識類名、變量名、方法名、類型名、數組名、文件名的有效字符序列稱為標識符,簡單地說,標識符就是一個名字 .
標識符由字母、下劃線、美元符號和數字組成,長度不受限制。
標識符的第一個字符不能是數字字符。
標識符不能是關鍵字(關鍵字見下面的2.1.3節)
標識符不能是true、false和null(盡管true、false和null不是關鍵字)
這8種基本數據類型習慣上可分為以下四大類型:
??邏輯類型:boolean
??整數類型:byte、short、int、long
??字符類型:char
??浮點類型:float、double
1.int 型
??????????對于int型變量,內存分配給4個字節(byte),占32位。
2.byte 型 ?
????????常量:Java中不存在byte型常量的表示法,但可以把一定范圍內的int型常量
??????????賦值給byte型變量。 ?
????????變量:使用關鍵字byte來聲明byte 型變量 ?
??????????例如: byte x= -12,tom=28,漂亮=98;
??????????對于byte型內存分配給1個字節,占8位 。
3 .short 型
????????常量:和byte型類似,Java中也不存在short型常量的表示法,但可以把一定
??????????范圍內的int型常量賦值給short型變量。
????????變量:使用關鍵字short來聲明short型變量
??????????例如: short x=12,y=1234;
??????????對于short型變量,內存分配給2個字節,占16位.
4. long 型
????????常量:long型常量用后綴L來表示,例如108L(十進制)、07123L(八進制)、
??????????0x3ABCL(十六進制) 。
????????變量:使用關鍵字long來聲明long型變量,
??????????例如: long width=12L,height=2005L,length;
??????????對于long型變量,內存分配給8個字節,占64位。
簡單數據類型的級別與類型轉換運算:
Java中數據的基本類型(不包括邏輯類型)按精度從“低”到“高”排列:
byte ?short ?char ?int ?long ?float ?double
★當把級別低的變量的值賦給級別高的變量時,系統自動完成數據類型的轉換
★當把級別高的變量的值賦給級別低的變量時,必須使用顯示類型轉換運算。顯示轉換的格式:(類型名)要轉換的值;
??例如
????int x=(int)34.89;
★當把一個int型常量賦值給一個byte和short型變量時,不可以超出這些變量的取值范圍,否則必須進行類型轉換運算;例如,常量128的屬于int型常量,超出byte變量的取值范圍,如果賦值給byte型變量,必須進行byte類型轉換運算(將導致精度的損失),如下所示:
?????byte a=(byte)128;
輸入基本型數據 :
??◆可以使用Scanner類創建一個對象:
???????????Scanner reader=new Scanner(System.in);
??◆reader對象調用下列方法,讀取用戶在命令行(例如,MS-DOS窗口)輸入的各種基本類型數據:
?nextBoolean()、 nextByte()、 nextShort()、 nextInt() ??
?nextLong()、nextFloat()、nextDouble()
輸出基本型數據:
JDK1.5新增了和C語言中printf函數類似的輸出數據的方法,格式如下:
?????System.out.printf("格式控制部分",表達式1,表達式2,…表達式n)
格式控制部分由格式控制符號:%d、%c、%f、%s和普通的字符組成,普通字符原樣輸出。格式符號用來輸出表達式的值。
輸出數據時也可以控制數據在命令行的位置,例如:%md輸出的int型數據占m列;%m.nf輸出的浮點型數據占m列,小數點保留n位。例如:System.out.printf("%d,%f",12, 23.78);
數組 :
1 聲明數組:
聲明一維數組有下列兩種格式:
數組的元素類型 數組名[];
數組的元素類型 [] 數組名;
例如:
float boy[];
char [] cat;
2 為數組分配元素 :
為數組分配元素的格式如下:
數組名 = new 數組元素的類型[數組元素的個數];
例如: boy = new float[4];
3數組的引用:
數組屬于引用型變量,兩個相同類型的數組如果具有相同的引用,它們就有完全相同的元素
?
instanceof 運算符是二目運算符,左面的操作元是一個對象;右面是一個類。當左面的對象是右面的類或子類創建的對象時,該運算符運算的結果是true ,否則是false。
Java里的語句可分為以下六種:
1.方法調用語句。如:System.out.println(" Hello");
2.表達式語句 ??表示式尾加上分號。比如賦值語句:x=23;
3.復合語句
??可以用{ ?}把一些語句括起來構成復合語句,如:
???????{ ??z=123+x;
???????????System.out.println("How are you");
????????}
4.空語句。 一個分號也是一條語句,稱做空語句。
5.控制語句。控制語句分為條件分支語句、開關語句和循環語句。
6.package語句和 import語句。它們和類、對象有關
for語句與數組 :
?JDK1.5后,對for語句的功能給予擴充、增強,以便更好地遍歷數組。語法格式如下:
for(聲明循環變量:數組的名字) {
…
}
其中,聲明的循環變量的類型必須和數組的類型相同。這種形式的for語句類似自然語言中的“for each”語句,為了便于理解上述for語句,可以將這種形式的for語句中翻譯成“對于循環變量依次取數組的每一個元素的值”。
?類體:
◆類體的內容由兩部分構:一部分是變量的聲明,用來刻畫屬性;另一部分是方法的定義,用來刻畫行為功能
類體中變量聲明部分所聲明的變量被稱作成員變量和類的成員變量不同的是,局部變量只在方法內有效,而且與其聲明的位置有關如果局部變量的名字與成員變量的名字相同,則成員變量被隱藏,即該成員變量在這個方法內暫時失效。如果想在該方法中使用被隱藏的成員變量,必須使用關鍵字this(在4.9節this關鍵字)
局部變量沒有默認值:
成員變量有默認值(見后面的4.3節),但局部變量沒有默認值,因此在使用局部變量之前,必須保證局部變量有具體的值
???對成員變量的操作只能放在方法中,方法可以對成員變量和該方法體中聲明的局部變量進行操作。在聲明成員變量時可以同時賦予初值,但是不可以在類體中有單獨的賦值語句(不可以有變量的聲明和方法的定義以外的其它語句)
構造方法與對象的創建 :
???類是面向對象語言中最重要的一種數據類型,那么就可以用它來聲明變量。在面向對象語言中,用類聲明的變量被稱作對象。和基本數據類型不同,在用類聲明對象后,還必須要創建對象,即為聲明的對象分配變量(確定對象所具有的屬性),當使用一個類創建一個對象時,也稱給出了這個類的一個實例。通俗的講,類是創建對象的“模板”,沒有類就沒有對象。構造方法和對象的創建密切相關
構造方法 : 構造方法是一種特殊方法,它的名字必須與它所在的類的名字完全相同,而且沒有類型。允許一個類中編寫若干個構造方法,但必須保證他們的參數不同,即參數的個數不同,或者是參數的類型不同。
創建對象 : ???
創建一個對象包括對象的聲明和為對象分配變量兩個步驟。
使用對象 :
1.對象操作自己的變量(體現對象的屬性)
???通過使用運算符“.” 對象操作自己的變量(對象的屬性)
2.對象調用類中的方法(體現對象的行為)
???對象創建之后,可以使用點運算符“.”調用創建它的類中的方法,從而產生一定的行為(功能).
3. 體現封裝
????當對象調用方法時,方法中出現的成員變量就是指分配給該對象的變量。在講述類的時候講過:類中的方法可以操作成員變量。當對象調用方法時,方法中出現的成員變量就是指分配給該對象的變量。
?對象的引用和實體 :
當用類創建一個對象時,類中的成員變量在分配內存空間,這些內存空間稱作該對象的實體或對象的變量,而對象中存放著引用。一個類創建的兩個對象,如果具有相同的引用,那么就具有完全相同的實體。
參數傳值:
?方法中最重要的部分之一就是方法的參數,參數屬于局部變量,當對象調用方法時,參數被分配內存空間,并要求調用者向參數專遞值,即方法被調用時,參數變量必須有具體的值。
?傳值機制 :
?在Java中,方法的所有參數都是“傳值”的,也就是說,方法中參數變量的值是調用者指定的值的拷貝。例如,如果向方法的int型參數x傳遞一個int值,那么參數x得到的值是傳遞的值的拷貝。
基本數據類型參數的傳值 :
對于基本數據類型的參數,向該參數傳遞的值的級別不可以高于該參數的級別 。
引用類型參數的傳值:
當參數是引用類型時,“傳值”傳遞的是變量中存放的“引用”,而不是變量所引用的實體
對象的組合 ?:
一個類可以把對象作為自己的成員變量,如果用這樣的類創建對象,那么該對象中就會有其它對象,也就是說該對象將其他對象作為自己的組成部分,或者說該對象是由幾個對象組合而成。
組合與復用 ?:
如果一個對象a組合了對象b,那么對象a就可以委托對象b調用其方法,即對象a以組合的方式復用對象b的方法。例如,圓錐對象在計算體積時,首先委托圓錐的底(一個Circle對象)bottom調用getArea()方法計算底的面積,然后圓錐對象再計算出自身的體積
實例變量和類變量的聲明:
在聲明成員變量時,用關鍵字static給予修飾的稱作類變量,否則稱作實例變量(類變量也稱為static變量,靜態變量)。
實例變量和類變量的區別:
1.不同對象的實例變量互不相同
2.所有對象共享類變量
3.通過類名直接訪問類變量
實例方法和類方法的定義:
類中的方法也可分為實例方法和類方法。方法聲明時,方法類型前面不加關鍵字static修飾的是實例方法、加static關鍵字修飾的是類方法(靜態方法)。
實例方法和類方法的區別 :
1.對象調用實例方法
???當對象調用實例方法時,該方法中出現的實例變量就是分配給該對象的實例變量;該方法中出現的類變量也是分配給該對象的變量,只不過這個變量和所有的其他對象共享而已。
2.類名調用類方法
從而類方法不僅可以被類創建的任何對象調用執行,也可以直接通過類名調用。和實例方法不同的是,類方法不可以操作實例變量,這是因為在類創建對象之前,實例成員變量還沒有分配內存。
方法重載的語法規則 :
方法重載的意思是:一個類中可以有多個方法具有相同的名字,但這些方法的參數必須不同,即或者是參數的個數不同,或者是參數的類型不同
this關鍵字 :
this是Java的一個關鍵字,表示某個對象。this可以出現在實例方法和構造方法中,但不可以出現在類方法中。this關鍵字出現在類的構造方法中時,代表使用該構造方法所創建的對象.當this關鍵字出現實例方法中時,this就代表正在調用該方法的當前對象。
在構造方法中使用this ?:
this關鍵字出現在類的構造方法中時,代表使用該構造方法所創建的對象。
在實例方法中使用this ?:
實例方法必須只能通過對象來調用,不能用類名來調用。當this關鍵字出現實例方法中時,代表正在調用該方法的當前對象。
實例方法可以操作類的成員變量,當實例成員變量在實例方法中出現時,默認的格式是:this.成員變量;
當static成員變量在實例方法中出現時,默認的格式是:
?????類名.成員變量;
包 :
包是Java語言中有效地管理類的一個機制。
包名的目的是有效的區分名字相同的類。不同Java源文件中兩個類名字相同時,它們可以通過隸屬不同的包來相互區分。
包語句 :
通過關鍵字package聲明包語句。
???????package語句作為Java源文件的第一條語句, 為該源文件中聲明的類指定包名。 ?import 語句 :
??一個類可能需要另一個類聲明的對象作為自己的成員或方法中的局部變量,如果這兩個類在同一個包中,當然沒有問題。
???如果一個類想要使用的那個類和它不在一個包中,要使用import語句完成使命。
引入自定義包中的類 :
用戶程序也可以使用import語句引入非類庫中有包名的類,如:
???import tom.jiafei.*;
訪問權限 :
??當用一個類創建了一個對象之后,該對象可以通過“.”運算符操作自己的變量、使用類中的方法,但對象操作自己的變量和使用類中的方法是有一定限制的。
何謂訪問權限 :
???所謂訪問權限是指對象是否可以通過“.”運算符操作自己的變量或通過“.”運算符使用類中的方法。訪問限制修飾符有private、protected和public,都是Java的關鍵字,用來修飾成員變量或方法。
私有變量和私有方法 :
用關鍵字private修飾的成員變量和方法稱為私有變量和私有方法。
對于私有成員變量或方法,只有在本類中創建該類的對象時,這個對象才能訪問自己的私有成員變量和類中的私有方法。
某個類在另外一個類中創建對象后,如果不希該對象直接訪問自己的變量,即通過“.”運算符來操作自己的成員變量,就應當將該成員變量訪問權限設置為private。面向對象編程提倡對象應當調用方法來改變自己的屬性,類應當提供操作數據的方法,這些方法可以經過精心的設計,使得對數據的操作更加合理
共有變量和共有方法 :
用public修飾的成員變量和方法被稱為共有變量和共有方法 。
我們在任何一個類中用類Tom 創建了一個對象后,該對象能訪問自己的public變量和類中的public方法(也可以通過類名來操作成員變量、方法) 。
友好變量和友好方法:
當在另外一個類中用類Tom 創建了一個對象后,如果這個類與Tom類在同一個包中,那么該對象能訪問自己的友好變量和友好方法。 在任何一個與Tom同一包中的類中,也可以通過Tom類的類名訪問Tom類的類友好成員變量和類友好方法。
受保護的成員變量和方法:
用protected修飾的成員變量和方法被稱為受保護的成員變量和受保護的方法
public類與友好類 :
類聲明時,如果在關鍵字class前面加上public關鍵字,就稱這樣的類是一個public 類 。
可以在任何另外一個類中,使用public類創建對象。
如果一個類不加public修飾,這樣的類被稱作友好類。
在另外一個類中使用友好類創建對象時,要保證它們是在同一包中。
基本類型的類封裝:
Java提供了基本數據類型相關的類,實現了對基本數據類型的封裝。這些類分別是:Byte、Integer、Short、Long、Float、Double和Character類。這些類在java.lang包中。
對象數組:
如果程序需要某個類的若干個對象,比如Student類的10個對象,顯然如下聲明10個Student對象是不可取的:
Student stu1,stu2, stu3,stu4,stu5,stu6,stu7,stu8, stu9,stu10;
正確的做法是使用對象數組,即數組的元素是對象,例如:
???????Student [] stu;
???????stu = new Student[10];
需要注意的是,上述代碼僅僅定義了數組stu有10個元素,并且每個元素都是一個Student類型的對象,但這些對象目前都是空對象,因此在使用數組stu中的對象之前,應當創建數組所包含的對象,例如: ???????????
stu[0] = new Student(); ?
反編譯和文檔生成器 :
◆反編譯器javap.exe可以將字節碼反編譯為源碼,以便查看源碼類中的public方法名字和public成員變量的名字,例如:
????javap java.awt.Button
使用javadoc.exe可以制做源文件類結構的html格式文檔
jar文件 :
可以使用jar.exe命令把一些類的字節碼文件壓縮成一個jar文件,然后將這個jar文件存放到Java運行環境的擴展中,即將該jar文件存放在JDK安裝目錄的jre\lib\ext文件夾中。這樣,Java應用程序就可以使用這個jar文件中的類來創建對象了
將C:\1000\moon\star目錄中的TestOne.class 和TestTwo.class(二者包名是moon.star)壓縮成一個jar文件:Jerry.jar的步驟:
1. 清單文件:hello.mf(保存到C:\1000)
Manifest-Version: 1.0
Class: moon.start.TestOne moon.star.TestTwo
Created-By: 1.6
??2. ?使用jar命令來生成一個名字為Jerry.jar的文件
C:\1000> jar cfm Jerry.jar hello.mf moon\star\TestOne.class moon\star\TestTwo.class
子類與父類 :
??利用繼承,可以先編寫一個共有屬性的一般類,根據該一般類再編寫具有特殊屬性的新類,新類繼承一般類的狀態和行為,并根據需要增加它自己的新的狀態和行為。
由繼承而得到的類稱為子類,被繼承的類稱為父類(超類)。
聲明子類 :
使用關鍵字extends來定義一個類的子類,格式如下:
?????class 子類名 ?extends ?父類名 {
???????????…
?????}
類的樹形結構:
?Java的類按繼承關系形成樹形結構這個樹形結構中,根節點是Object類
????(Object是java.lang包中的類),即Object是所有類的祖先類。
除了Object類每個類有且僅有一個父類,一個類可以有多個或零個子類。如果一個類(除了Object類)的聲明中沒有使用extends關鍵字,這個類被系統默認為是Object的子類,即類聲明“class A”與“class A extends Object”是等同的。
子類的繼承性 :
?所謂子類繼承父類的成員變量作為自己的一個成員變量,就好象它們是在子類中直接聲明一樣,可以被子類中自己定義的任何實例方法操作。
所謂子類繼承父類的方法作為子類中的一個方法,就好象它們是在子類中直接定義了一樣,可以被子類中自己定義的任何實例方法調用。
子類和父類在同一包中的繼承性 :
如果子類和父類在同一個包中,那么,子類自然地繼承了其父類中不是private的成員變量作為自己的成員變量,并且也自然地繼承了父類中不是private的方法作為自己的方法,繼承的成員變量或方法的訪問權限保持不變。
子類和父類不在同一包中的繼承性:
??如果子類和父類不在同一個包中,那么,子類繼承了父類的protected、public成員變量做為子類的成員變量,并且繼承了父類的protected、public方法為子類的方法,繼承的成員或方法的訪問權限保持不變。
子類與對象:
子類對象的特點
子類的構造方法創建一個子類的對象時,不僅子類中聲明的成員變量被分配了內存,而且父類的成員變量也都分配了內存空間,但只將子類繼承的那部分成員變量作為分配給子類對象的變量 。子類中有一部分方法是從父類繼承的,這部分方法可以操作子類未繼承的變量 。
成員變量的隱藏 :
?對于子類可以從父類繼承的成員變量,只要子類中聲明的成員變量和父類中的成員變量同名時,子類就隱藏了繼承的成員變量,子類自己聲明定義的方法操作與父類同名的成員變量是指子類重新聲明定義的這個成員變量。
方法重寫(Override):
??子類通過重寫可以隱藏已繼承的實例方法。
1.重寫的語法規則
如果子類可以繼承父類的某個實例方法,那么子類就有權利重寫這個方法。
方法重寫是指:子類中定義一個方法,這個方法的類型和父類的方法的類型一致或者是父類的方法的類型的子類型,并且這個方法的名字、參數個數、參數的類型和父類的方法完全相同。
2.重寫的目的
子類通過方法的重寫可以隱藏繼承的方法,子類通過方法的重寫可以把父類的狀態和行為改變為自身的狀態和行為。
重寫的注意事項 :
重寫父類的方法時,不允許降低方法的訪問權限,但可以提高訪問權限(訪問限制修飾符按訪問權限從高到低的排列順序是:public、protected、友好的、private。)
用super操作被隱藏的成員變量和方法:
子類可以隱藏從父類繼承的成員變量和方法,如果在子類中想使用被子類隱藏的成員變量或方法就可以使用關鍵字super。比如super.x、super.play()就是訪問和調用被子類隱藏的成員變量x和方法play().
使用super調用父類的構造方法:
子類不繼承父類的構造方法,因此,子類如果想使用父類的構造方法,必須在子類的構造方法中使用,并且必須使用關鍵字super來表示,而且super必須是子類構造方法中的頭一條語句。
final關鍵字可以修飾類、成員變量和方法中的局部變量。
可以使用final將類聲明為final類。final類不能被繼承,即不能有子類。如:
???final class A {
??????… …
???}
如果用final修飾父類中的一個方法,那么這個方法不允許子類重寫。
如果成員變量或局部變量被修飾為final的,就是常量。
對象的上轉型對象 :
?假設,A類是B類的父類,當用子類創建一個對象,并把這個對象的引用放到父類的對象中時,比如:
A a;
a=new B();
?或
A a;
B b=new B();
a=b;
這時,稱對象a是對象b的上轉型對象
1.上轉型對象不能操作子類新增的成員變量;不能調用子類新增的方法。
2.上轉型對象可以訪問子類繼承或隱藏的成員變量,也可以調用子類繼承的方法或子類重寫的實例方法。上轉型對象操作子類繼承的方法或子類重寫的實例方法,其作用等價于子類對象去調用這些方法。因此,如果子類重寫了父類的某個實例方法后,當對象的上轉型對象調用這個實例方法時一定是調用了子類重寫的實
繼承與多態:
多態性就是指父類的某個方法被其子類重寫時,可以各自產生自己的功能行為
用關鍵字abstract修飾的類/方法稱為abstract類/方法(抽象類)。如:
abstract class A {
??… …
}
注意:
1.abstract類中可以有abstract方法
2.abstract類不能用new運算創建對象
面向抽象編程 :
??在設計一個程序時,可以通過在abstract類中聲明若干個abstract方法,表明這些方法在整個系統設計中的重要性,方法體的內容細節由它的非abstract子類去完成。使用多態進行程序設計的核心技術之一是使用上轉型對象,即將abstract類聲明對象作為其子類的上轉型對象,那么這個上轉型對象就可以調用子類重寫的方法。所謂面向抽象編程,是指當設計某種重要的類時,不讓該類面向具體的類,而是面向抽象類,即所設計類中的重要數據是抽類聲明的對象,而不是具體類聲明的對象。Pillar類就是面向抽象類Geometry,Cirle和Rectangle 都是Geometry的子類.
?開-閉原則 :
所謂“開-閉原則”(Open-Closed Principle)就是讓設計的系統應當對擴展開放,對修改關閉。
在設計系統時,應當首先考慮到用戶需求的變化,將應對用戶變化的部分設計為對擴展開放,而設計的核心部分是經過精心考慮之后確定下來的基本結構,這部分應當是對修改關閉的,即不能因為用戶的需求變化而再發生變化,因為這部分不是用來應對需求變化的。
?如果系統的設計遵守了“開-閉原則”,那么這個系統一定是易維護的,因為在系統中增加新的模塊時,不必去修改系統中的核心模塊。
接口 :
??為了克服Java單繼承的缺點,Java使用了接口,一個類可以實現多個接口。
??使用關鍵字interface來定義一個接口。接口的定義和類的定義很相似,分為接口的聲明和接口體。
1.接口聲明
接口通過使用關鍵字interface來聲明,格式: interface 接口的名字
2.接口體
接口體中包含常量定義和方法定義兩部分。
實現接口 :
一個類通過使用關鍵字implements聲明自己實現一個或多個接口。
class A implements Printable,Addable
如果一個類實現了某個接口,那么這個類必須重寫該接口的所有方法。
?Java提供的接口都在相應的包中,通過import語句不僅可以引入包中的類,也可以引入包中的接口,例如:
import java.io.*;???不僅引入了java.io包中的類,也同時引入了該包中的接口
理解接口:
?接口的思想在于它可以要求某些類有相同名稱的方法,但方法的具體內容(方法體的內容)可以不同,即要求這些類實現接口,以保證這些類一定有接口中所聲明的方法(即所謂的方法綁定)。接口在要求一些類有相同名稱的方法的同時,并不強迫這些類具有相同的父類。比如,各式各樣的電器產品,它們可能歸屬不同的種類,但國家標準要求電器產品都必須提供一個名稱為on的功能(為達到此目的,只需要求它們實現同一接口,該接口中有名字為on的方法),但名稱為on的功能的具體行為由各個電器產品去實現。
接口回調是指:可以把實現某一接口的類創建的對象的引用賦給該接口聲明的接口變量中,那么該接口變量就可以調用被類重寫的接口方法。實際上,當接口變量調用被類重寫的接口方法時,就是通知相應的對象調用這個方法。
接口與多態:
??可以通過在接口中聲明若干個abstract方法,表明這些方法的重要性,方法體的內容細節由實現接口的類去完成。使用接口進行程序設計的核心思想是使用接口回調,即接口變量存放實現該接口的類的對象的引用,從而接口變量就可以回調類實現的接口方法。
接口參數 :
?如果一個方法的參數是接口類型,我們就可以將任何實現該接口的類的實例的引用傳遞給該接口參數,那么接口參數就可以回調類實現的接口方法。
?abstract類與接口的比較 :
接口和abstract類的比較如下:
1.abstract類和接口都可以有abstract方法。
2.接口中只可以有常量,不能有變量;而abstract類中即可以有常量也可以有變量。
3.abstract類中也可以有非abstract方法,接口不可以。
?面向接口編程:
面向接口去設計程序,可以通過在接口中聲明若干個abstract方法,表明這些方法的重要性,方法體的內容細節由實現接口的類去完成。
使用接口進行程序設計的核心思想是使用接口回調,即接口變量存放實現該接口的類的對象的引用,從而接口變量就可以回調類實現的接口方法。
內部類:
Java支持在一個類中聲明另一個類,這樣的類稱作內部類,而包含內部類的類成為內部類的外嵌類。某種類型的農場飼養了一種特殊種類的牛,但不希望其他農場飼養這種特殊種類的牛,那么這種類型的農場就可以將創建這種特殊種牛的類作為自己的內部類。
和子類有關的匿名類 :
?Java允許我們直接使用一個類的子類的類體創建一個子類對象。
創建子類對象時,除了使用父類的構造方法外還有類體,此類體被認為是一個子類去掉類聲明后的類體,稱作匿名類。
假設Bank是類,那么下列代碼就是用Bank的一個子類(匿名類)創建對象:
????new Bank () { ?????????
????????匿名類的類體
};
和接口有關的匿名類 :
假設Computable是一個接口,那么,Java允許直接用接口名和一個類體創建一個匿名對象,此類體被認為是實現了Computable接口的類去掉類聲明后的類體,稱作匿名類。
下列代碼就是用實現了Computable接口的類(匿名類)創建對象:
??????new Computable() {
????????????實現接口的匿名類的類體
???????} ; ???
異常類 :
所謂異常就是程序運行時可能出現一些錯誤,比如試圖打開一個根本不存在的文件等,異常處理將會改變程序的控制流程,讓程序有機會對錯誤作出處理。
異常對象可以調用如下方法得到或輸出有關異常的信息:
?public String getMessage();
?public void printStackTrace();
?public String toString(); ?
try~catch語句:
?Java使用try~catch語句來處理異常,將可能出現的異常操作放在try~catch語句的try部分,將發生異常后的處理放在catch部分。
?try~catch語句的格式如下:
??try {
??????包含可能發生異常的語句
?}
?catch(ExceptionSubClass1 ?e) {
????…
?}
?catch(ExceptionSubClass2 ?e) {
????…
?}
自定義異常類:
我們也可以擴展Exception類定義自己的異常類,然后規定哪些方法產生這樣的異常。
一個方法在聲明時可以使用throws關鍵字聲明要產生的若干個異常,并在該方法的方法體中具體給出產生異常的操作,即用相應的異常類創建對象,并使用throw關鍵字拋出該異常對象,導致該方法結束執行。
斷言:
?斷言語句用于調試代碼階段。在調試代碼階段讓斷言語句發揮作用,這樣就可以發現一些致命的錯誤,當程序正式運行時就可以關閉斷言語句,但仍把斷言語句保留在源代碼中,如果以后應用程又需要調試,可以重新啟用斷言語句。
使用關鍵字assert聲明一條斷言語句,斷言語句有以下兩種格式:
??assert booleanExpression;
??assert booleanExpression:messageException;
String類 :
??Java專門提供了用來處理字符序列的String類。String類在java.lang包中,由于java.lang包中的類被默認引入,因此程序可以直接使用String類。需要注意的是Java把String類聲明為final類,因此用戶不能擴展String類,即String類不可以有子類。
String 類的常用方法:
1.public int length():獲取一個字符串的長度
2.public boolean equals(String s):比較當前字符串對象的實體是否與參數s指定的字符串的實體相同 ????????????????
3.public boolean startsWith(String s)
???public boolean endsWith(String s)方法:判斷當前字符串對象的前綴(后綴)是否參數s指定的字符串
????String tom = "天氣預報,陰有小雨",jerry = "比賽結果,中國隊贏得勝利";
????tom.startsWith(“天氣”)的值是true;
????tom.endsWith("大雨")的值是false,
4. public int compareTo(String s):按字典序與參數s指定的字符串比較大小
?????如果當前字符串與s相同,該方法返回值0;
?????如果當前字符串對象大于s,該方法返回正值;
?????如果小于s,該方法返回負值。
?????例如,字符a在Unicode表中的排序位置是97、字符b是98,那么對于
????????String str = "abcde"; ??str.compareTo("boy")小于0;
其相關方法 public int compareToIgnoreCase(String s)
5.public boolean contains(String s):判斷當前字符串對象是否含有參數指定的字符串s?
????????例如 ?tom=“student”;那么tom.contains(“stu”)的值就是true;
???????????????????而tom.contains("ok")的值是false。
6. public int indexOf (String s):從當前字符串的頭開始檢索字符串s,并返回首次出現s的位置,其相關方法:
???indexOf(String s ,int startpoint)
???lastIndexOf (String s)
????例如 String tom = "I am a good cat";
??????????????tom.indexOf("a");//值是2
??????????????tom.indexOf("good",2);//值是7
??????????????tom.indexOf("a",7);//值是13
??????????????tom.indexOf("w",2);//值是-1
7. public String substring(int startpoint):獲得一個當前字符串的子串??
?????其相關方法:substring(int start ,int end)
????例如: ?String tom = "我喜歡籃球";
??????????????????String s = tom.substring(1,3);
??????????????????那么s是:"喜歡"
符串與基本數據的相互轉化:
java.lang包中的Integer類調用其類方法:
??????public static int parseInt(String s)
可以將由“數字”字符組成的字符串,如“876”,轉化為int型數據
可以使用String 類的類方法
????????public static String valueOf(byte n)
???????public static String valueOf(int n)
???????public static String valueOf(long n) ?
???????public static String valueOf(float n)
對象的字符串表示 :
?所有的類都默認是java.lang包中Object類的子類或間接子類。
Object類有一個public String toString()方法,一個對象通過調用該方法可以獲得該對象的字符串表示。一個對象調用toString()方法返回的字符串的一般形式為:創建對象的類的名字@對象的引用的字符串表示
字符串與字符、字節數組:
String 類的構造方法:
◆ String(char[])和String(char[],int offset,int length)分別用字符數組中的全部字符和部分字符創建字符串對象
◆ String類提供了將字符串存放到數組中的方法:
???public void getChars(int start,int end,char c[],int offset )
◆將字符串中的全部字符存放在一個字符數組中的方法:
public char[] toCharArray()
◆String(byte[])用指定的字節數組構造一個字符串對象。
???String(byte[],int offset,int length) 用指定的字節數組的一部分,即從數組起始位置offset開始取length個字節構造一個字符串對象。
◆public byte[] getBytes() 方法使用平臺默認的字符編碼,將當前字符串轉化為一個字節數組。
◆ public byte[] getBytes(String charsetName) 使用參數指定字符編碼,將當前字符串轉化為一個字節數組。 ?
字符串的加密算法 ?:
使用一個字符串password作為密碼對另一個字符串sourceString進行加密 。將密碼password存放到一個字符數組char [] p = password.toCharArray();
假設數組p的長度為n,那么就將待加密的字符串sourceString按順序以n個字符為一組,對每一組中的字符用數組a的對應字符做加法運算。
正則表達式及字符串的替換與分解:
?1.正則表達式
一個正則表達式是含有一些具有特殊意義字符的字符串,這些特殊字符稱作正則表達式中的元字符。比如,“\\dcat”中的\\d就是有特殊意義的元字符,代表0到9中的任何一個。字符串對象調用 public boolean matches(String regex)方法可以判斷當前字符串對象是否和參數regex指定的正則表達式匹配。
?2.字符串的替換
?字符串對象調用public String replaceAll(String regex,String replacement)方法返回一個字符串,該字符串是當前字符串中所有和參數regex指定的正則表達式匹配的子字符串被參數replacement指定的字符串替換后的字符串,例如:
?????String s ="12hello567bird".replaceAll("[a-zA-Z]+","你好");
字符串的分解
?3.字符串調用public String[] split(String regex)使用參數指定的正則表達式regex做為分隔標記分解出其中的單詞,并將分解出的單詞存放在字符串數組中。
??????例如,對于字符串str ?
?String str = "1949年10月1日是中華人民共和國成立的日子";
如果準備分解出全部由數字字符組成的單詞,就必須用非數字字符串做為分隔標記,因此,可以使用正則表達式:String regex="\\D+";
做為分隔標記分解出str中的單詞:String digitWord[]=str.split(regex);
那么,digitWord[0]、digitWord[1]和digitWord[2]就分別是“1949”、“10”和“1”。
StringTokenizer類 :
本節學習怎樣使用StringTokenizer對象分解字符串。
StringTokenizer類在java.util包中,有兩個常用的構造方法:
◆StringTokenizer(String s):為字符串s構造一個分析器。使用默認的分隔標記,即空格符(若干個空格被看做一個空格)、換行符、回車符、Tab符、進紙符。
◆ StringTokenizer(String s, String delim):為字符串s構造一個分析器。參數dilim中的字符被作為分隔標記 。
例如:
????StringTokenizer fenxi = new StringTokenizer("you are welcome");
????StringTokenizer fenxi = new StringTokenizer("you,are ; welcome", ?", ; ");
◆ StringTokenizer對象稱作一個字符串分析器可以使用下列方法:
?????nextToken():逐個獲取字符串中的語言符號(單詞),字符串分析器中的負責計數的變量的值就自動減一 ?。
hasMoreTokens():只要字符串中還有語言符號,即計數變量的值大于0,該方法就返回true,否則返回false。 countTokens():得到分析器中計數變量的值。
??Scanner類:
使用Scanner類從字符串中解析程序所需要的數據。
????1.使用默認分隔標記解析字符串
???????創建Scanner對象,并將要解析的字符串傳遞給所構造的對象,
?????例如 String NBA = "I Love This Game";
?????如下構造一個Scanner對象:
?????Scanner scanner = new Scanner(NBA);
那么scanner將空格做為分隔標記來解析字符串中的單詞,解析操作的特點如下:
◆ scanner調用next()方法依次返回NBA中的單詞,如果NBA最后一個單詞已被next()方法返回,scanner調用hasNext()將返回false,否則返回true。
◆ ?對于被解析的字符串中的數字型的單詞,比如618,168.98等,scanner可以用nextInt()或nextDouble()方法來代替next()方法,即scanner可以調用nextInt()或nextDouble()方法將數字型單詞轉化為int或double數據返回。
◆ 如果單詞不是數字型單詞,scanner調用nextInt()或nextDouble()方法將發生InputMismatchException異常,在處理異常時可以調用next()方法返回該非數字化單詞。
???????例題13 ???使用Scanner對象解析字符串"TV cost 876 dollar.Computer cost 2398 dollar.telephone cost 1278 dollar"中的全部價格數字(價格數字的前后需有空格),并計算了總消費。
??2.使用正則表達式作為分隔標記解析字符串
???????Scanner對象可以調用 useDelimiter(正則表達式); 方法將一個正則表達式作為分隔標記,即和正則表達式匹配的字符串都是分隔標記。
?Date類 :
???Date類在java.util包中。
1.使用Date類的無參數構造方法創建的對象可以獲取本地當前時間。 Date()
?????例: Date nowTime=new Date();
當前nowTime對象中含有的日期、時間就是創建nowTime對象時的本地計算機的日期和時間。例如,假設當前時間是:2011年3月10日23:05:32(CST時區),那么
System.out.println(nowTime); 輸出結果是:Thu Mar 10 23:05:32 CST 2011。
??????Date對象表示時間的默認順序是:星期、月、日、小時、分、秒、年
2.使用帶參數的構造方法 ?Date(long time)
計算機系統將其自身的時間的“公元”設置在1970年1月1日0時(格林威治時間),可以根據這個時間使用Date的帶參數的構造方法:Date(long time)來創建一個Date對象,例如:
????????Date date1=new Date(1000), date2=new Date(-1000);
其中的參數取正數表示公元后的時間,取負數表示公元前的時間,例如1000表示1000毫秒,那么,date1含有的日期、時間就是計算機系統公元后1秒時刻的日期、時間。如果運行Java程序的本地時區是北京時區(與格林威治時間相差8個小時),那么上述date1就是1970年01月01日08時00分01秒、date2就是1970年01月01日07時59分59秒。
3.System類的靜態方法 public long currentTimeMillis() 獲取系統當前時間
Calendar類:
1 ?Calendar類在java.util包中。使用Calendar類的static方法 getInstance()可以初始化一個日歷對象,如:
????Calendar calendar= Calendar.getInstance();
2 calendar對象可以調用方法:
???public final void set(int year,int month,int date)
???public final void set(int year,int month,int date,int hour,int minute)
???public final void set(int year,int month, int date, int hour, int minute,int second)
?????將日歷翻到任何一個時間
3 calendar對象常用方法
◆public int get(int field) :可以獲取有關年份、月份、小時、星期等信息
???例如:calendar.get(Calendar.MONTH); 返回一個整數,如果該整數是0表示當前日歷是在一月,該整數是1表示當前日歷是在二月等。
???例如:calendar.get(Calendar.DAY_OF_WEEK);返回一個整數,如果該整數是1表示星期日,如果是2表示是星期一,依次類推,如果是7表示是星期六。 ???
◆ public long getTimeInMillis() :可以將時間表示為毫秒。?
format方法 :
Formatter類的format方法:format(格式化模式, 日期列表)
按著“格式化模式”返回“日期列表”中所列各個日期中所含數據(年,月,日,小時等數據)的字符串表示。Java已經將format方法做為了String類的靜態方法,因此,程序可以直接使用String類調用format方法對日期進行格式化。
1.格式化模式
format方法中的“格式化模式”是一個用雙引號括起的字符序列(字符串),該字符序列中的字符由時間格式符和普通字符所構成。例如:"日期:%ty-%tm-%td"
String s = String.format("%tY年%tm月%td日",new Date(),new Date(),new Date()); 那么s就是"2011年02月10日
2.日期列表
format方法中的“日期列表”可以是用逗號分隔的Calendar對象或Date對象。 format方法默認按從左到右的順序使用“格式化模式”中的格式符來格式“日期列表”中對應的日期,而“格式化模式”中的普通字符保留原樣。
3.格式化同一日期 ????可以在“格式化模式”中使用“<”,比如:"%ty-%<tm-%<td"中的三個格式符將格式化同一日期,即含有“<”的格式符和它前面的格式符格式同一個日期,例如:String s = String.format("%ty年%<tm月%<td日",new Date());那么%<tm和%<td都格式化new Date(),因此字符串s就是:"11年02月10日"。
不同區域的星期格式 :
如果想用特定地區的星期格式來表示日期中的星期,可以用format的重載方法:
format (Locale locale,格式化模式,日期列表);
其中的參數locale是一個Locale類的實例,用于表示地域。
Locale類的static常量都是Locale對象,其中US是表示美國的static常量。
比如,假設當前時間是2011-02-10,對于(%ta表示簡稱的星期):
String s = String.format(Locale.US,"%ta(%<tF)",new Date());
那么s是"Thu(2011-02-10)",
對于(%tA表示全稱的星期)
String s = String.format(Locale.JAPAN,"%tA(%<tF)",new Date());
那么s是"木曜日(2011-02-10)"。
??Math類 :
?Math類在java.lang包中。Math類包含許多用來進行科學計算的類方法,這些方法可以直接通過類名調用。另外,Math類還有兩個靜態常量,它們分別是:
E ??2.7182828284590452354和PI ???3.14159265358979323846。
以下是Math類的常用類方法:
* public static long abs(double a) ?返回a的絕對值。
* public static double max(double a,double b) 返回a、b的最大值。
* public static double min(double a,double b) 返回a、b的最小值。
* public static double random() ?產生一個0到1之間的隨機數(不包括0和1)。
* public static double pow(double a,double b) 返回a的b次冪。
* public static double sqrt(double a) 返回a的平方根。
* public static double log(double a) ?返回a的對數。
* public static double sin(double a) 返回正弦值。
* public static double asin(double a) ?返回反正弦值。
?BigInteger類 :
1 java.math包中的BigInteger類提供任意精度的整數運算。可以使用構造方法:
??????public BigInteger(String val) ?構造一個十進制的BigInteger對象。
2 以下是BigInteger類的常用類方法:
*public BigInteger add(BigInteger val) ?返回當前大整數對象與參數指定的大整數對象的和。
*public BigInteger subtract(BigInteger val)返回當前大整數對象與參數指定的大整數對象的差。
* public BigInteger multiply(BigInteger val)返回當前大整數對象與參數指定的大整數對象的積。
*public BigInteger divide(BigInteger val)返回當前大整數對象與參數指定的大整數對象的商。
*public BigInteger remainder(BigInteger val)返回當前大整數對象與參數指定的大整數對象的余。
*public int compareTo(BigInteger val) 返回當前大整數對象與參數指定的大整數的比較結果,返回值是1、-1或0,分別表示當前大整數對象大于、小于或等于參數指定的大整數。
*public BigInteger abs() ?返回當前大整數對象的絕對值。
*public BigInteger pow(int a) ?返回當前大整數對象的a次冪。
*public String toString() ?返回當前大整數對象十進制的字符串表示。
*public String toString(int p) ?返回當前大整數對象p進制的字符串表示。
Random類 :
??Java提供了更為靈活的用于獲得隨機數的Random類(該類在java.util包中)。 Random類的如下構造方法:
?????public Random();
?????public Random(long seed);使用參數seek指定的種子創建一個Random對象
?????人們習慣地將Random對象稱為隨機數生成器。
◆?返回一個隨機整數 ??隨機數生成器random調用不帶參數的nextInt()方法:
??????Random random=new Random();
??????random.nextInt();
◆ 返回一個0至n之間(包括0,但不包括n)的隨機數 隨機數生成器random調用帶參數的nextInt(int m)方法(參數m必須取正整數值)
????例如,random.nextInt(100);返回一個0至100之間的隨機整數(包括0,但不包括100)。
◆ 隨機得到true和false兩個表示真和假的boolean值, 隨機數生成器random調用nextBoolean()方法
???例如 random.nextBoolean();返回一個隨機boolean值。
Formatter 類:
Formatter類提供了一個和C語言printf函數類似的format方法:
format(格式化模式,值列表)
該方法按著“格式化模式”返回“值列表”的字符串表示。
Java已經將format方法做為了String類的靜態方法,因此,程序可以直接使用String類調用format方法對數字進行格式化。
1.格式化模式 ?format方法中的“格式化模式”是一個用雙引號括起的字符序列(字符串),該字符序列中的字符由格式符和普通字符所構成。
例如:"輸出結果%d,%f,%d"中的%d和%f是格式符號 .
?????format方法返回的字符串就是“格式化模式”中的格式符被替換為它得到的格式化結果后的字符串。例如:String s = String.format(“%.2f”,3.141592);那么s就是“3.14”.
2.值列表 ??format方法中的“值列表”是用逗號分隔的變量、常量或表達式。 例如:
String s=format("%d元%0.3f公斤%d臺",888,999.777666,123); 那么,s就是"888元999.778公斤123臺"。
3.格式化順序
format方法默認按從左到右的順序使用“格式化模式”中的格式符來格式化“值列表”中對應的值,而“格式化模式”中的普通字符保留原樣。
例如,假設int型變量x和double型變量y的值分別是888和3.1415926,
那么對于String s = format("從左向右:%d,%.3f,%d",x,y,100);字符串s就是:從左向右:888,3.142,100
格式化整數:
1.%d,%o,%x和%格式符可格式化byte、Byte、short、Short、int、Integer、long和Long型數據,詳細說明見Page204. 例如,對于:
String s = String.format("%d,%o,%x,%X",703576,703576,703576,703576);
字符串s就是:703576,2536130,abc58,ABC58
2.修飾符
加號修飾符"+"格式化正整數時,強制添加上正號,例如,%+d將123格式化為"+123"。
逗號修飾符“,”格式化整數時,按"千"分組,例如,對于:
String s=String.format("按千分組:%,d。按千分組帶正號%+,d",1235678,9876);
字符串s就是:按千分組:1,235,678。按千分組帶正號+9,876
3.數據的寬度
數據的寬度就是format方法返回的字符串的長度。規定數據寬度的一般格式為“%md”,其效果是在數字的左面增加空格;或"%-md“,其效果是在數字的右面增加空格,
例如,將數字59格式化為寬度為8的字符串:String s=String.format("%8d",59);
字符串s就是:" ?????59",其長度(s.length())為8,即s在59左面添加了6個空格字符。
對于:String s=String.format(“%-8d”,59);字符串s就是:"59 ???????",其長度(s.length())為8。
對于:String s=String.format("%5d%5d%8d",59,60,90);字符串s就是:" ??59 ??60 ?????90"(長度為18
格式化浮點數 :
1.%f,%e(%E),%g(%G)和%a(%A)格式符可格式化float、Float、double和Double:
???%f 將值格式化為十進制浮點數,小數保留6位。
???%e(%E) 將值格式化為科學記數法的十進制的浮點數(%E在格式化時將其中的指數符號大寫,例如5E10)。
例如,對于:String s = String.format("%f,%e",13579.98,13579.98);
字符串s就是:13579.980000,1.357998e+04
2.修飾符
加號修飾符"+"格式化正數時,強制添加上正號,例如%+f將123.78格式化為"+123.78", %+E將123.78格式化為"+1.2378E+2"。 逗號修飾符“,”格式化浮點數時,將整數部分按“千”分組,
例如,對于:String s=String.format("整數部分按千分組: %+,f",1235678.9876);
字符串s就是:整數部分按千分組:+1,235,678.987600
3.限制小數位數與數據的“寬度”
?????◆ ?"%.nf"可以限制小數的位數,其中的n是保留的小數位數,例如%.3f將6.1256格式化為"6.126"(保留3位小數)。
?規定寬度的一般格式為“%mf”(在數字的左面增加空格),或“%-md”(在數字的右面增加空格)。
例如,將數字59.88格式化為寬度為11的字符串
String s=String.format(“%11f”,59.88); 字符串s就是:" ?59.880000",其長度(s.length())為11。
String s=String.format(“%-11f”,59.88);字符串s就是: "59.880000 ?",其長度(s.length())為11。
◆在指定寬度的同時也可以限制小數位數(%m.nf),
String s=String.format(“%11.2f”,59.88); ?字符串s就是:" ?????59.88",即s在59.88左面添加了6個空格字符。
◆ 在寬度的前面增加前綴0,表示用數字0(不用空格)來填充寬度左面的富裕部分,例如:
String s=String.format(“%011f”,59.88); 字符串s就是:"0059.880000",其長度(s.length())11
StringBuffer對象的創建:
StringBuffer類能創建可修改的字符串序列,該類的對象的實體的內存空間可以自動的改變大小,便于存放一個可變的字符序列。一個StringBuffer對象調用append方法可以追加字符序列,如圖819所示。例如:
StringBuffer s = new StringBuffer("我喜歡");
s.append("玩籃球"); ??
StringBuffer類有三個構造方法:
1.StringBuffer()
2.StringBuffer(int size)
3.StringBuffer(String s)
StringBuffer類的常用方法:
1.StringBuffer append(String s):將一個字符串對象追加到當前StringBuffer對象中 StringBuffer append(int n):將一個int型數據轉化為字符串對象后再追加到當前StringBuffer對象中StringBuffer append(Object o):將一個Object對象的字符串表示追加到當前StringBuffer對象中
類似的方法還有:
???StringBuffer append(long n),StringBuffer append(boolean n),
???StringBuffer append(float n),StringBuffer append(double n),
???StringBuffer append(char n)
2.public chat charAt(int n ):得到參數n指定的置上的單個字符
???public void setCharAt(int n ,char ch):將當前StringBuffer對象實體中的字符串位置n處的字符用參數ch指定的字符替換
3.StringBuffer insert(int index, String str) :將參數str指定的字符串插入到參數index指定的位置
4.public StringBuffer reverse() :將該對象實體中的字符翻轉
5.StringBuffer delete(int startIndex, int endIndex):從當前StringBuffer對象實體中的字符串中刪除一個子字符串
???其相關方法:deleteCharAt(int index) 刪除當前StringBuffer對象實體的字符串中index位置處的一個字符。
Pattern與Matcher類:
Java提供了專門用來進行模式匹配的Pattern類和Matcher類,這些類在java.util.regex包中。 ?以下結合具體問題來講解使用Pattern類和Matcher類的步驟。假設有字符串:
String input = "hello,good morning,this is a good idea"
我們想知道input從哪個位置開始至哪個位置結束曾出現了字符串good。
使用Pattern類和Matcher類檢索字符串str中的子字符串的步驟如下:
1.建立模式對象
使用正則表達式regex做參數得到一個稱為模式的Pattern類的實例pattern:
例如:String regex = "good";
?????Pattern pattern = Pattern.compile(regex);
模式對象是對正則表達式的封裝。Pattern類調用類方法compile(String regex)返回一個模式對象,其中的參數regex是一個正則表達式, 稱為模式對象使用的模式。
2.得到匹配對象
?????模式對象pattern調用matcher(CharSequence input)方法返回一個Matcher對象matcher,稱為匹配對象 ????????????
Matcher matcher = pattern.matcher(input);
Matcher對象matcher可以使用下列方法尋找字符串input中是否有和模式regex匹配的子序列(regex是創建模式對象pattern時使用的正則表達式)。
◆public boolean find():尋找input和regex匹配的下一子序列,如果成功該方法返回true,否則返回false。
◆ public boolean matches():matcher調用該方法判斷input是否完全和regex匹配。
◆ public boolean lookingAt():matcher調用該方法判斷從input的開始位置是否有和regex匹配的子序列。
◆ public boolean find(int start) : matcher調用該方法判斷input從參數start指定位置開始是否有和regex匹配的子序列 。
◆ public String replaceAll(String replacement) matcher調用該方法可以返回一個字符串,該字符串是通過把input中與模式regex匹配的子字符串全部替換為參數replacement指定的字符串得到的.
◆ public String replaceFirst(String replacement) matcher調用該方法可以返回一個字符串,該字符串是通過把input中第1個與模式regex匹配的子字符串替換為參數replacement指定的字符串得到的。
使用Class實例化一個對象 :
?Class是java.lang包中的類,該類的實例可以幫助程序創建其他類的實例或者取得其他類的對象的內部信息。
創建對象最常用的方式就是使用new運算符和類的構造方法,實際上也可以使用Class對象得到某個類的實例。步驟如下:
(1)使用Class的類方法得到一個和某類(參數className指定的類)相關的Class對象:
?public static Class forName(String className) throws ClassNotFoundException
?上述方法返回一個和參數className指定的類相關的Class對象。
(2)步驟(1)中獲得的Class對象調用
public Object newInstance() throws InstantiationException,IllegalAccessException
方法就可以得到一個className類的對象。要特別注意的是:使用Class對象調用newInstance()實例化一個className類的對象時,className類必須有無參數的構造方法。
獲取類的有關信息 :
Class對象經常調用的方法如下:
◆ String getName() 返回類的名字
◆ Constructor[] getDeclaredConstructors() ?返回類的全部構造方法。
◆ Field[] getDeclaredFields() ?返回類的全部成員變量。
◆ Method[] getDeclaredMethods() ?返回類的全部方法。
?Java Swing概述 :
?javax.swing包中JComponent類是java.awt包中Container類的一個直接子類、是java.awt包中Component類的一個間接子類,學習GUI編程主要是學習掌握使用Component類的一些重要的子類。以下是GUI編程經常提到的基本知識點 。
(1)Java把Component類的子類或間接子類創建的對象稱為一個組件。
(2)Java把Container的子類或間接子類創建的對象稱為一個容器。
(3)可以向容器添加組件。Container類提供了一個public方法:add( ),一個容器可以調用這個方法將組件添加到該容器中。
(4)容器調用removeAll()方法可以移掉容器中的全部組件;調用remove(Component c)方法可以移掉容器中參數c指定的組件。
(5)注意到容器本身也是一個組件,因此可以把一個容器添加到另一個容器中實現容器的嵌套。
(6)每當容器添加新的組件或移掉組件時,應當讓容器調用validate()方法,以保證容器中的組件能正確顯示出來
窗口 :
Java提供的JFrame類的實例是一個底層容器,即通常所稱的窗口。其他組件必須被添加到底層容器中,以便借助這個地層容器和操作系統進行信息交互。 JFrame類是Container類的間接子類。當需要一個窗口時,可使用JFrame或其子類創建一個對象
???JFrame常用方法 :
JFrame() 創建一個無標題的窗口。
JFrame(String s) 創建標題為s的窗口。
public void setBounds(int a,int b,int width,int height 設置窗口的初始位置是(a,b),即距屏幕左面a個像素、距屏幕上方b個像素;窗口的寬是width,高是height。
public void setSize(int width,int height) 設置窗口的大小。
public void setLocation(int x,int y) 設置窗口的位置,默認位置是(0,0)。
public void setVisible(boolean b) 設置窗口是否可見,窗口默認是不可見的。
public void setResizable(boolean b) 設置窗口是否可調整大小,默認可調整大小。
public void dispose() 撤消當前窗口,并釋放當前窗口所使用的資源。
public void setExtendedState(int state) 設置窗口的擴展狀態.
public void setDefaultCloseOperation(int operation) ?該方法用來設置單擊窗體右上角的關閉圖標后,程序會做出怎樣的處理。
菜單條、菜單、菜單項 :
1.菜單條
????JComponent類的子類JMenubar負責創建菜單條,JFrame類有一個將菜單條放置到窗口中的方法:setJMenuBar(JMenuBar bar);該方法將菜單條添加到窗口的頂端
2.菜單:JComponent類的子類JMenu負責創建菜單, JMenu類的主要方法有以下幾種
???public void add(JMenuItem item) 向菜單增加由參數item指定的菜單選項。
???public JMenuItem getItem(int n) 得到指定索引處的菜單選項。
???public int getItemCount() 得到菜單選項的數目。
3.菜單項
???JComponent類的子類JMenuItem負責創建菜單項,JMenuItem類的主要方法有以下幾種:
??JMenuItem(String s) 構造有標題的菜單項。
??JMenuItem(String text, Icon icon) 構造有標題和圖標的菜單項
??public void setAccelerator(KeyStroke keyStroke) 為菜單項設置快捷鍵。
常用組件 :
1.文本框:由JComponent的子類JTextField創建文本框。
2.文本區:由JComponent的子類JTexArea創建文本區。
3.按鈕:由JComponent的子類JButton類用來創建按鈕。
4.標簽:由JComponent的子類JLabel類用來創建標簽。
5.選擇框:由JComponent的子類JCheckBox類用來創建選擇框。
6.單選按鈕:由JComponent的子類JRadioButton類用來創建單項選擇框。
7.下拉列表:由JComponent的子類JComboBox類用來創建下拉列表。
8.密碼框:由JComponent的子類JPasswordField創建密碼框。
密碼框可以使用setEchoChar(char c)重新設置回顯字符 。
密碼框調用char[] getPassword()方法可以返回實際的密碼
常用容器:
?JComponent是Container的子類,因此JComponent子類創建的組件也都是容器。容器經常用來添加組件。Jframe是底層容器,本節提到的容器被習慣地稱做中間容器,中間容器必須被添加到底層容器中才能發揮作用。
1.JPanel 面板:使用JPanel創建面板,再向這個面板添加組件,然后把這個面板添加到其它容器中。JPanel面板的默認布局是FlowLayout布局。
2.滾動窗格JScrollPane:可以將文本區放到一個滾動窗格中。
?JScorollPane scroll=new JScorollPane(new JTextArea());
3.拆分窗格JSplitPane:窗格有兩種類型:水平拆分和垂直拆分
JSplitPane的兩個常用的構造方法:
??JSplitPane(int a,Component b,Component c)
??JSplitPane(int a, boolean b,Component c,Component d) ?
4.JLayeredPane分層窗格:分層窗格使用
add(Jcomponent com, int layer);添加組件com,并指定com所在的層
public void setLayer(Component c,int layer)可以重新設置組件c所在的層
public int getLayer(Component c)可以獲取組件c所在的層數。
常用布局:
?容器可以使用方法setLayout(布局對象);設置自己的布局,控制組件在容器中的位置。 ?
1.FlowLayout布局 :
1)創建布局對象 FlowLayout flow=new FlowLayout();
2)容器con使用布局對象con.setLayout(flow);
3)con可以使用Container類提供的add方法將組件順序地添加到容器中;
FlowLayout布局對象調用相應的方法可以重新設置布局的對齊方式等.
2.BorderLayout布局 :
BorderLayout 布局是Window型容器的默認布局 。
使用BorderLayout布局的容器con,可以使用add方法將一個組件b添加到中心區域:con.add(b,BorderLayout.CENTER);或 ?con.add(BorderLayour.CENTER,b);
3.CardLayout 布局 : ?使用CardLayout的一般步驟如下:
??1)創建CardLayout對象 CardLayout card=new CardLayout();
??2)為容器設置布局 con.setLayout(card);
??3)容器調用add(String s,Component b)將組件b加入容器,并給出了顯示該組件的代號s。
??4)布局對象card用CardLayout類提供的show()方法,顯示容器con中組件代號為s的組件:card.show(con,s);
4.GridLayout布局 :
GridLayout布局策略是把容器劃分成若干行乘若干列的網格區域,組件就位于這些劃分出來的小格中。 GridLayout布局編輯器的一般步驟如下:
1)創建布局對象,指定劃分網格的行數m和列數n GridLayout grid=new new GridLayout(10,8);
2)使用GridLayout布局的容器調用方法add(Component c)將組件c加入容器。
5.BoxLayout布局:
使用盒式布局的容器將組件排列在一行或一列 .BoxLayout布局的一般步驟如下:
1)創建布局對象,使用BoxLayou的構造方法BoxLayout(Container con,,int axis)可以創建一個盒式布局對象.
2)可以使用Box類的類(靜態)方法 createHorizontalBox()獲得一個具有行型盒式布局的盒式容器; ?使用Box類的類(靜態)方法 createVerticalBox()獲得一個具有列型盒式布局的盒式容器。
3)控制盒式布局容器中組件之間的距離
Box類調用靜態方法createHorizontalStrut(int width)可以得到一個不可見的水平Struct對象,稱做水平支撐。 Box類調用靜態方法createVertialStrut(int height)可以得到一個不可見的垂直Struct對象,稱做垂直支撐。
例子5 ?Example9_5.java ?WindowBoxLayout.java
兩個列型盒式容器boxV1、boxV2和一個行型盒式容器baseBox。
在列型盒式容器的組件之間添加垂直支撐,控制組件之間的距離,將boxV1、boxV2添加到baseBox中,并在它倆之間添加了水平支撐。程序運行效果如圖9.6。
6.null布局 :
空布局容器可以準確地定位組件在容器的位置和大小。組件調用setBounds(int a,int b,int width,int height)方法可以設置本身的大小和在容器中的位置。
處理事件:
學習組件除了要熟悉組件的屬性和功能外,一個更重要的方面是學習怎樣處理組件上發生的界面事件。當用戶在文本框中鍵入文本后按回車鍵、單擊按鈕、在一個下拉式列表中選擇一個條目等操作時,都發生界面事件。
程序有時需對發生的事件作出反應,來實現特定的任務,例如,用戶單擊一個名字叫“確定”或名字叫“取消”的按鈕,程序可能需要作出不同的處理。
?事件處理模式 :
1.事件源 :能夠產生事件的對象都可以成為事件源 .
2.監視器 :事件源通過調用相應的方法將某個對象注冊為自己的監視器。對于文本框,這個方法是:addActionListener(監視器);事件源注冊監視器之后,相應的操作就會導致相應的事件的發生,并通知監視器,監視器就會作出相應的處理。
3.處理事件的接口:
監視器負責處理事件源發生的事件。監視器是一個對象,為了處理事件源發生的事件,監視器這個對象會自動調用一個方法來處理事件。 Java規定:為了讓監視器這個對象能對事件源發生的事件進行處理,創建該監視器對象的類必須聲明實現相應的接口,那么當事件源發生事件時,監視器就自動調用被類重寫的某個接口方法
ActionEvent事件:
?1. ActionEvent事件源 :
文本框、按紐、菜單項、密碼框和單選按紐都可以觸發ActionEvent事件,即都可以成為ActionEvent事件的事件源。
2.注冊監視器: 能觸發ActionEvent事件的組件使用
addActionListener(ActionListener listen)
將實現ActionListener接口的類的實例注冊為事件源的監視器。
3.ActionListener接口 :
ActionListener接口在java.awt.event包中,該接口中只有一個方法:
public void actionPerformed(ActinEvent e)
事件源觸發ActionEvent事件后,監視器將發現觸發的ActionEvent事件,然后調用接口中的方法:actionPerformed(ActinEvent e)對發生的事件作出處理。ActionEvent類事先創建的事件對象就會傳遞給該方法的參數e。 ?
4.ActionEvent類中的方法 :
public Object getSource() 調用該方法可以獲取發生ActionEvent事件的事件源對象的引用。
public String getActionCommand() 調用該方法可以獲取發生ActionEvent事件時,和該事件相關的一個命令字符串。
ItemEvent事件:
1.ItemEvent事件源 :選擇框、下拉列表都可以觸發ItemEvent事件。
2.注冊監視器:能觸發ItemEvent事件的組件使用
addItemListener(ItemListener listen)
將實現ItemListener接口的類的實例注冊為事件源的監視器。
3.ItemListener接口 :
ItemListener接口在java.awt.event包中,該接口中只有一個方法:
public void itemStateChanged(ItemEvent e)
事件源觸發ItemEvent事件后,監視器將發現觸發的ItemEvent事件,然后調用接口中的itemStateChanged(ItemEvent ?e)方法對發生的事件作出處理。ItemEvent類事先創建的事件對象就會傳遞給該方法的參數e。
4. ItemEvent類中的方法 :
getSource()方法返回發生Itemevent事件的事件源外
getItemSelectable()方法返回發生Itemevent事件的事件源。
?DocumentEvent事件:
2.注冊監視器:能觸發DocumentEven事件的事件源使用
addDucumentListener(DocumentListener listen)
將實現DocumentListener接口的類的實例注冊為事件源的監視器。
3.DocumentListener接口 :
DocumentListener接口在javax.swing.event包中,該接口中有三個方法:
public void changedUpdate(DocumentEvent e) ???
public void removeUpdate(DocumentEvent e)
public void insertUpdate(DocumentEvent e)
MouseEvent事件:
任何組件上都可以發生鼠標事件,如:鼠標進入組件、退出組件、在組件上方單擊鼠標、拖動鼠標等都觸發鼠標事件,即導致MouseEvent類自動創建一個事件對象。
?1.使用MouseListener接口可以處理以下5種操作觸發的鼠標事件
????在事件源上按下鼠標鍵、在事件源上釋放鼠標鍵、在事件源上擊鼠標鍵、鼠標進入事件源、鼠標退出事件源。
?? MouseEvent 中有下列幾個重要的方法:
???getX() 獲取鼠標指針在事件源坐標系中的x-坐標。
???getY() 獲取鼠標指針在事件源坐標系中的y-坐標。
???getModifiers() 獲取鼠標的左鍵或右鍵。
???getClickCount() 獲取鼠標被單擊的次數。
???getSource() 獲取發生鼠標事件的事件源。
??事件源注冊監視器的方法是addMouseListener(MouseListener listener)。
?? MouseListener接口中有如下方法:
???mousePressed(MouseEvent) 負責處理在組件上按下鼠標鍵觸發的鼠標事件
???mouseReleased(MouseEvent) 負責處理在組件上釋放鼠標鍵觸發的鼠標事件
???mouseEntered(MouseEvent) 負責處理鼠標進入組件觸發的鼠標事件
???mouseExited(MouseEvent) 負責處理鼠標離開組件觸發的鼠標事件
???mouseClicked(MouseEvent) 負責處理在組件上單擊鼠標鍵觸發的
2.使用MouseMotionListener接口可以處理以下兩種操作觸發的鼠標事件, ?在事件源上拖動鼠標、在事件源上移動鼠標。
?? 事件源注冊監視器的方法是
????addMouseMotionListener(MouseMotionListener listener)。
?? MouseMotionListener接口中有如下方法:
????mouseDragged(MouseEvent) ?負責處理拖動鼠標觸發的鼠標事件。
mouseMoved(MouseEvent) ?負責處理移動鼠標觸發的鼠標事件。
??焦點事件:
1.焦點事件源 :組件可以觸發焦點事件。
2.注冊監視器:組件可以使用
????addFocusListener(FocusListener listener)
注冊焦點事件監視器。
3.FocusListener接口 :
???創建監視器的類必須要實現FocusListener接口,該接口有兩個方法:
??????public void focusGained(FocusEvent e)
??????public void focusLost(FocusEvent e)
???當發生FocusEvent事件時,監視器調用類實現的接口中的相應方法。
?4.組件也可調用
???????public boolean requestFocusInWindow()
方法可以獲得輸入焦點。
鍵盤事件:
當一個組件處于激活狀態時,敲擊鍵盤上一個鍵就導致這個組件觸發鍵盤事件。
1.某個組件使用addKeyListener方法注冊監視器。
2.接口KeyListener中有如下方法:
??public void keyPressed(KeyEvent e),
??public void keyTyped(KeyEvent e),
??public void KeyReleased(KeyEvent e) ?
3.相關方法:
???public int getKeyCode()判斷哪個鍵被按下、敲擊或釋放,返回一個鍵碼值 。 ?????
???getKeyChar()判斷哪個鍵被按下、敲擊或釋放,返回鍵上的字符。
?窗口事件:
JFrame及子類創建的窗口可以調用
setDefaultCloseOperation(int operation);
方法設置窗口的關閉方式(如前面各個例子所示).
但是setDefaultCloseOperation方式可能不能滿足程序的需要,比如,用戶單擊窗口上的關閉圖標時,可能程序需要提示用戶是否需要保存窗口中的有關數據到磁盤等 .
6) public void windowDeiconified(WindowEvent e) ?當窗口撤消圖標化時,窗口的監視器調用該方法。
7) public void windowOpened(WindowEvent e) ?當窗口打開時,窗口的監視器調用該方法。
2. WindowAdapter適配器 .
適配器可以代替接口來處理事件,當Java提供處理事件的接口中多于一個方法時,Java相應地就提供一個適配器類,比如WindowAdapter類。適配器已經實現了相應的接口,例如WindowAdapter類實現了WindowListener接口。因此,可以使用WindowAdapte的子類創建的對象做監視器,在子類中重寫所需要的接口方法即可。
匿名類實例或窗口做監視器:
匿名類的方便之處是匿名類的外嵌類的成員變量在匿名類中仍然有效,當發生事件時,監視器就比較容易操作事件源所在的外嵌類中的成員.當事件的處理比較簡單、系統也不復雜時,使用匿名類做監視器是一個不錯的選擇。
讓事件源所在的類的實例作為監視器,能讓事件的處理比較方便,這是因為,監視器可以方便的操作事件源所在的類中的其他成員。當事件的處理比較簡單,系統也不復雜時,讓事件源所在的類的實例作為監視器是一個不錯的選擇。
事件總結:
1.授權模式
Java的事件處理是基于授權模式,即事件源調用調用方法將某個對象注冊為自己的監視器。
2.接口回調
addXXXListener(XXXListener listener)方法中的參數是一個接口,listener可以引用任何實現了該接口的類所創建的對象,當事件源發生事件時,接口listener立刻回調被類實現的接口中的某個方法。
3.方法綁定
當事件源觸發事件發生后,監視器準確知道去調用哪個方法。
4.保持松耦合
當事件源觸發事件發生后,系統知道某個方法會被執行,但無須關心到底是哪個對象去調用了這個方法,因為任何實現接口的類的實例(做為監視器)都可以調用這個方法來處理事件
?
?使用MVC結構 :
?模型-視圖-控制器(Model-View-Controller),簡稱為MVC。
???MVC是一種先進的設計結構,其目的是以會話形式提供方便的GUI支持。
???MVC是一種通過三個不同部分構造一個軟件或組件的理想辦法:
?模型(model) ?用于存儲數據的對象。
?視圖(view) ??為模型提供數據顯示的對象。
?控制器(controller)處理用戶的交互操作,對于用戶的操作作出響應,讓模型和視圖進行必要的交互,即通過視圖修改、獲取模型中的數據;當模型中的數據變化時,讓視圖更新顯示。
對話框 :
JDialog類和JFrame都是Window的子類,二者的實例都是底層容器。
JDialog類創建的對話框必須要依賴于某個窗口。
對話框分為無模式和有模式兩種。
有模式的對話框:當這個對話框處于激活狀態時,只讓程序響應對話框內部的事件,而且將堵塞其它線程的執行,用戶不能再激活對話框所在程序中的其它窗口,直到該對話框消失不可見。
無模式對話框:當這個對話框處于激活狀態時,能再激活其它窗口,也不堵塞其它線程的執行。
消息對話框 :
消息對話框是有模式對話框,進行一個重要的操作動作之前,最好能彈出一個消息對話框。可以用javax.swing包中的JOptionPane類的靜態方法:
????public static void showMessageDialog(
???????????????????????Component parentComponent,
???????????????????????String message,
???????????????????????String title,
???????????????????????int messageType)
創建一個消息對話框。
輸入對話框 :
輸入對話框含有供用戶輸入文本的文本框、一個確認和取消按鈕,是有模式對話框 。
可以用javax.swing包中的JOptionPane類的靜態方法:
??public static String showInputDialog(Component parentComponent,
??????????????????????????????????????Object message,
??????????????????????????????????????String title,
??????????????????????????????????????int messageType)
??創建一個輸入對話框。
確認對話框 :
確認對話框是有模式對話框。
可以用javax.swing包中的JOptionPane類的靜態方法:
public static int showConfirmDialog(Component parentComponent,
????????????????????????????????????Object message,
????????????????????????????????????String title,
????????????????????????????????????int optionType)
?得到一個確認對話框。
顏色對話框:
?可以用javax.swing包中的JColorChooser類的靜態方法: public static Color showDialog(Component component, ???????
????????????????????????????????????????String title,
????????????????????????????????????????Color initialColor)
創建一個有模式的顏色對話框 ?。
自定義對話框:
創建對話框與創建窗口類似,通過建立JDialog的子類來建立一個對話框類,然后這個類的一個實例,即這個子類創建的一個對象,就是一個對話框。對話框是一個容器,它的默認布局是BorderLayout,對話框可以添加組件,實現與用戶的交互操作。
構造對話框的2個常用構造方法
JDialog() 構造一個無標題的初始不可見的對話框,對話框依賴一個默認的不可見的窗口,該窗口由Java運行環境提供。
JDialog(JFrame owner) 構造一個無標題的初始不可見的無模式的對話框,owner是對話框所依賴的窗口,如果owner取null,對話框依賴一個默認的不可見的窗口,該窗口由Java運行環境提供。
樹組件與表格組件:
樹組件:
DefaultMutableTreeNode類的兩個常用的構造方法是:
DefaultMutableTreeNode(Object userObject)
DefaultMutableTreeNode(Object userObject,boolean allowChildren)
2.樹上的TreeSelectionEvent事件
使用addTreeSelectionListener(TreeSelectionListener listener)方法獲得一個監視器。
表格組件:
表格組件以行和列的形式顯示數據,允許對表格中的數據進行編輯。表格的模型功能強大、靈活并易于執行。表格是最復雜的組件,對于初學者,這里只介紹默認的表格模型。
JTable有7個構造方法,這里介紹常用的三個。
?????JTable() 創建默認的表格模型。
?????JTable(int a,int b) 創建a行,b列的默認模型表格
?????JTable (Object data[][],Object ?columnName[]) 創建默認表格模型對象,并且顯示由data指定的二維數組的值,其列名由數組columnName指定。
通過對表格中的數據進行編輯,可以修改表格中二維數組data中對應的數據數據。在表格中輸入或修改數據后,需按回車或用鼠標單擊表格的單元格確定所輸入或修改的結果。當表格需要刷新顯示時,讓表格調用repaint方法。
按鈕綁定到鍵盤 :
(1) 獲取輸入映射. ??按鈕首先調用
???public final InputMap getInputMap(int condition) ?
???方法返回一個InputMap對象.
(2)綁定按鈕的鍵盤操作. ??步驟(1)返回的輸入映射首先調用方法
???public void put(KeyStroke keyStroke,Object actionMapKey)
??將敲擊鍵盤上的某鍵指定為按鈕的鍵盤操作.
(3)為按鈕的鍵盤操作指定監視器. ???按鈕調用方法
????public final ActionMap getActionMap()
????返回一個ActionMap對象:
????ActionMap actionmap = button.getActionMap();
????然后,該對象actionmap調用方法:
????public void put(Object key,Action action)
????為按鈕的鍵盤操作指定監視器
打印組件:
步驟如下:
1.獲取ToolKit對象
讓組件調用getToolkit()方法返回系統提供的Toolkit對象。
2.獲得PrintJob對象
Toolkit對象調用getPrintJob()方法返回一個PrintJob對象。
3.獲取Graphics對象
PrintJob對象使用getGraphics()方法獲得一個Graphics對象。
4.打印組件
步驟3獲取的Graphics對象是g,組件調用
paintAll(g)
將打印出該組件及其子組件。如果調用方法:
pain(g)
將打印出該組件本身,但不打印子組件。
?發布GUI程序:
可以使用jar.exe把一些文件壓縮成一個JAR文件,來發布我們的應用程序。
生成一個Jar文件的步驟如下:
1.首先用文本編輯器(比如Windows下的記事本)編寫一個清單文件 ,擴展名為.mf,如Mymoon.mf 。
2.生成JAR文件
如果目錄test下的字節碼文件剛好是應用程序需要的全部字節碼文件,也可以如下生成JAR文件:
??D:\test\jar cfm Tom.jar Mymoon.mf ?*.class
可以將Tom.jar文件復制到任何一個安裝了java運行環境的計算機上,只要用鼠標雙擊該文件就可以運行該java應用程序了
將打印出該組件本身,但不打印子組件。
?發布GUI程序:
可以使用jar.exe把一些文件壓縮成一個JAR文件,來發布我們的應用程序。
生成一個Jar文件的步驟如下:
1.首先用文本編輯器(比如Windows下的記事本)編寫一個清單文件 ,擴展名為.mf,如Mymoon.mf 。
2.生成JAR文件
如果目錄test下的字節碼文件剛好是應用程序需要的全部字節碼文件,也可以如下生成JAR文件:
??D:\test\jar cfm Tom.jar Mymoon.mf ?*.class
可以將Tom.jar文件復制到任何一個安裝了java運行環境的計算機上,只要用鼠標雙擊該文件就可以運行該java應用程序了
總結
以上是生活随笔為你收集整理的Java期末复习基础知识整理(有点长)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: python+yolov3 输出中文标签
- 下一篇: python中pass与break区别