版權說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權,請進行舉報或認領
文檔簡介
第2章Java基本語法2.1
Java語言的基本組成2.2變量和直接量2.3數(shù)據(jù)類型2.4運算符與表達式2.5
Java語句及其控制結構2.6
數(shù)
組2.1
Java語言的基本組成2.1.1標識符2.1.2關鍵字2.2變量和直接量變量是一塊取了名字的用來存儲Java程序信息的內(nèi)存區(qū)域,它是一些有意義的數(shù)據(jù)。在程序中,定義的每塊被命名的內(nèi)存區(qū)域只能存儲一種特定類型的數(shù)據(jù)。在程序中直接給出的數(shù)值被稱作直接量,直接量可以是一個具體的數(shù)值或字符串,每個直接量也屬于一個特定的類型。2.3數(shù)據(jù)類型2.3.1
integer數(shù)據(jù)類型(1)字節(jié)(byte)型(2)短整(short)型(3)整(int)型(4)長整(long)型2.3.2浮點數(shù)據(jù)類型(1)單精度浮點型(float)(2)雙精度浮點型(double)2.3.3變量類型的轉換2.4運算符與表達式?2.4.1賦值運算符?2.4.2算術運算符?2.4.3關系運算符?2.4.4條件運算符?2.4.5邏輯運算符2.5
Java語句及其控制結構2.5.1
Java語句
Java語句是Java標識符的集合,由關鍵字、常量、變量和表達式構成,是成員方法的主要成分,必須包含在類的方法體之中。Java語句
有表達式語句、復合語句、選擇語句和循環(huán)語句等。語句以分號“;”作為結束標志,單獨的一個分號被看作一個空語句,空語句不做任何事情。在表達式后邊加上分號“;”就是一個表達式語句。經(jīng)常使用的表達式語句有賦值語句
和方法調(diào)用語句。表達式語句是最簡單的語句,它們被順序執(zhí)行,完成相應的操作。
復合語句也稱為塊(block)語句,是包含在一對大括號“{}”中的任意語句序列。與其他語句用分號作結束符不同,復合語句右括號
“}”后面不需要分號。盡管復合語句含有任意多個語句,但從語法上講,一個復合語句被看作一個簡單語句。例2-2:public
class
Block{public
static
void
main(String
args[]){int
k,i=3,j=4;k=i
+
j;System.out.println("k="+k);{float
f;f=j+4.5F;i++;System.out.println("f="+f);}System.out.println("i="+i);}}運行結果見圖2-2。圖2-2程序說明:在main方法中有兩個復合語句嵌套在一起,復合語句內(nèi)包含的是表達式語句。第1個復合語句中說明了3個整型變量k、i、j,它們不僅在第1個復合語句中起作用,還在被嵌套的第2個復合語句中起作用。而在第2個復合
語句中說明的變量f僅在第2個復合語句中起作
用。在這個例子中,人為地加入了一個復合語句,在實際編程中并不多見。復合語句更廣泛的應用是在結構式語句中,如選擇語句和循環(huán)語句。當結構式語句中包含的表達式語句超過一條時,就要用大括號把它們括起來。2.5.2選擇語句
在復合語句中必須逐行執(zhí)行每條命令。能
否改變程序執(zhí)行的順序呢?利用if...else結構就可以根據(jù)條件控制程序流程。1.if語句if語句的語法結構如下:if(條件表達式)s1語句;這是最簡單的單分支結構。條件表達式的值為true,就執(zhí)行s1語句,否則就忽略s1語句。
s1語句可以是復合語句。2.if...else語句
if選擇結構僅當條件為真時才執(zhí)行某一動作,否則忽略這一動作。而if...else選擇結構允許程序員指定在條件為真或者條件為假時的不同動作。if語句通常都與else語句配套使用,形成二分支結構。它的語法結構如下:if(條件表達式)s1語句;elses2語句;當條件表達式的值為true,就執(zhí)行s1語句,忽略else和s2語句;否則,條件表達式的值為
false,程序忽略s1語句,執(zhí)行else后面的s2語句。
s1和s2都可以是復合語句。3.if...else復合結構對于復雜的情況,我們可以嵌套使用
if...else語句。它的語法結構如下:if(條件表達式1)s1語句;else
if(條件表達式2)s2語句;elses3語句;
在這里依次計算條件表達式,如果某個條件表達式的值為true,就執(zhí)行它后面的語句,其余部分被忽略。所有表達式的值都為false,就執(zhí)行最后一個else后的s3語句。s1、s2和s3都可以是復合語句。4.switch開關語句
雖然嵌套的條件語句可實現(xiàn)多個分支處理,但嵌套太多時容易出錯和混亂,這時可以使用
開關語句switch處理。實際上開關語句switch也是一種if...else結構,不過它使你在編程時很容易寫出判斷條件,特別是有很多條件選項的時
候。開關語句switch的語法結構如下:switch(表達式){
case常量1;語句1;break;case常量2;語句2;break;……default:?語句n;
}其中switch、case、default是關鍵字,
default子句可以省略。開關語句先計算表達式,然后將表達式值與各個常量比較,如果表達式值與某個常量相
等,就執(zhí)行該常量后面的語句。如果都不相等,就執(zhí)行default下面的語句,如果無default子句,就什么都不執(zhí)行,直接跳出開關語句。使用開關語句時,注意以下問題。(1)case后面的常量必須是整數(shù)或字符型,而且不能有相同的值。(2)通常在每一個case中都應使用break語句提供一個出口,使流程跳出開關語句。否則,在第一個滿足條件case后面的所有語句都會被執(zhí)行,這種情況叫做落空。(3)有些case標號列在一起(如“case1:case2:”,中間沒有語句),這表示對所列情況將進行同樣的操作。2.5.3循環(huán)語句1.for循環(huán)語句for循環(huán)的語法結構為:for(表達式1;表達式2;表達式3)循環(huán)體2.while循環(huán)語句while循環(huán)的語法結構為如下形式:while
(條件表達式)循環(huán)體???3.do...while循環(huán)
如不用大括號,循環(huán)體中只含一條語句的
do...while結構如下:do語句while(條件);只有一條語句的do...while結構也常常寫成如下形式:do{語句}while(條件);4.循環(huán)語句的嵌套5.循環(huán)語句小結一個循環(huán)一般應包括以下4部分內(nèi)容。(1)初始化部分用來設置循環(huán)的一些初始條件,計數(shù)器清零等。(2)循環(huán)體部分這是反復被執(zhí)行的一段代碼,可以是單語句,也可以是復合語句。(3)迭代部分這是在當前循環(huán)結束,下一次循環(huán)開始時執(zhí)行的語句,常用來使計數(shù)器加1或減1。(4)終止部分通常是一個布爾表達式,每一次循環(huán)要對該表達式求值,以驗證是否滿足循環(huán)終止條件。2.5.4跳轉語句1.break和continue語句2.帶標號的break和continue語句2.6數(shù)組2.6.1數(shù)組的聲明和建立數(shù)組按如下格式定義:type
arrayname[
];
type是數(shù)組類型,它指出數(shù)組中各元素的類型,arrayname為數(shù)組名。2.6.2多維數(shù)組以二維數(shù)組為例,其格式為:?type
arrayname[
][
];第3章面向?qū)ο蟮某绦蛟O計3.1簡介3.2類3.3對象3.4實例研究(無)3.5類的繼承和類的多態(tài)性3.6接口與包3.1
簡
介Java是面向?qū)ο蟮某绦蛟O計語言,從面向?qū)ο筮@個角度看,體現(xiàn)了如下3個特點。1.封裝性2.繼承性3.通信相關性3.2類1.類的說明(1)指出特性(2)指出父類(extends部分)(3)指出接口(implements部分)2.類體3.2.1類的成員變量1.變量的訪問權限(1)公用(public)變量(2)專用(private)變量(3)保護型(protected)變量
(4)專用保護型(private
protected)變量(5)默認型變量2.是否為靜態(tài)變量3.是否為常量3.2.2類的方法其格式如下所示:methodDeclaration{methodBody}3.2.3
this和super
this和super是Java的兩個關鍵字,它們用在方法體中作為兩個特殊的變量前綴和方法前綴。
this用來指明當前對象的成員變量或方法,以區(qū)分于同名的局部變量和其它同名的方法,而
super則用于指出父類的變量和方法。1.this的使用場合一個對象中的方法一般可以直接訪問同一對象的成員變量。但是,有時候方法體內(nèi)部定義的變量和成員變量名字相同,還有時方法的入口參數(shù)和對象的成員變量名字相同,那么就需要將三者區(qū)別清楚。因此,專門用this來指明當前對象的成員變量或當前對象的方法。2.super的使用場合在Java中,由父類派生子類,這樣,子類的成員變量可能和父類的成員變量名字相同,
子類的方法也可能和父類的方法一樣。當需要
調(diào)用父類的同名方法或使用父類的同名變量時,在子類中可用關鍵字super作前綴來指明父類的成員變量和方法。3.2.4構造函數(shù)3.2.5
main方法3.3對象3.3.1對象的創(chuàng)建?
一個對象往往經(jīng)歷創(chuàng)建、運行和釋放3個階段,這稱為對象的典型生命周期。創(chuàng)建對象包括定義對象、建立對象和初始化對象3步。3.3.2對象的使用
對象使用就是指通過某種手段使一個對象產(chǎn)生它的效能。有兩種途徑來使用對象:一種是通過對象變量的引用來使用對象,另一種是通過調(diào)用對象的方法來使用對象。下面我們結合具體例子來說明。1.通過對象變量的引用來使用對象實際上,對象變量的引用就是用語句訪問對象的變量,通過這種引用可以檢測和修改變量。引用對象變量須按如下格式:ObjectReference.variable
;其中,ObjectReference是對象名,variable是所引用的變量。比如,已經(jīng)由Rectangle建立了名為
myRectangle的對象,它有4個可以訪問的變量x,y,width和height,那么:myRectangle.x=2;myRectangle.y=4;這兩個語句將矩形myRectangle的原點定位于X軸方向為2,Y軸方向為4的位置上,而語句:rnyRectangle.width
=20;myRectangle.height=40;則將矩形的寬定為20,長定為40。對象變量的引用不僅能夠檢測和修改變量,也可以通過表達式來對幾個變量進行合成,得到新的復合型變量。比如,用如下表達式引用對象變量:areaMyRectangle=myRectangle.width
*myRectangle.height
;就獲得了矩形的面積,它用變量
areaMyRectangle表示。要提到的是,對象變量的引用有時會使某個變量改得不符合要求,從而使一個對象處于不規(guī)范狀態(tài)。因為這一點,在類的設計中,有些變量被設置為禁止被操作狀態(tài),從而使這些變量不允許其他對象訪問。這時,對象變量引用就不可行了。2.通過調(diào)用對象的方法來使用對象
每個對象在創(chuàng)建的時候,一方面用變量確定了它的狀態(tài),由創(chuàng)建過程為它分配內(nèi)存空間,另一方面也創(chuàng)建了與它有關的方法,每個方法
都是和行為有關的。所以通過調(diào)用對象的某個
方法來使用對象,從而產(chǎn)生某種行為,這是最
符合邏輯思維習慣的。實際上,這也是更為安全可靠地使用對象的一種手段,因為這避免了
對變量的直接操作。
調(diào)用一個對象中的某個方法要遵照如下格式:ObjectReference.methodName(paramlist);或者:ObjectReference.methodName();比如,從Rectangle類中創(chuàng)建的對象
myRectangle含有一個方法叫move(),下面的語句就是用方法move()將對象myRectangle移動到一個新的位置:myRectangle.move
(5,
10);這個語句產(chǎn)生的效果等同于下面兩個語句:myRectangle.x=5;myRectangle.y=10;3.3.3對象的釋放
所謂釋放對象,實質(zhì)上就是釋放掉分配給此對象的內(nèi)存空間。Java中,對象的釋放是自
動完成的,不需要程序員在編程時關注這一點。
Java運行系統(tǒng)具有所謂的“垃圾收集”機制,這種機制會周期性地檢測對象是否還在使用,
如發(fā)現(xiàn)有長期不用的對象,則給予釋放,回收
分配給這些對象的內(nèi)存,這就是垃圾收集。
具體運行中,垃圾收集是由一個稱為Java垃圾收集器的程序?qū)崿F(xiàn)的。當一個對象在使用時,Java運行系統(tǒng)會將其對應的內(nèi)存空間設置標記;而當一個對象結束使用時,會自動清除標記。有了這種標記設置和清除的規(guī)則,Java垃圾收集器就可以通過周期性地掃描所有Java對象有關的內(nèi)存區(qū)域標記,將沒有標記的內(nèi)存區(qū)列入可供分配的范疇,從而起到垃圾收集作用。3.5類的繼承和類的多態(tài)性3.5.1類的繼承
類的繼承是面向?qū)ο蟮某绦蛟O計語言所具有的重要技術。有了繼承技術,程序設計時,就可以先定義一個包含公用變量和公用方法的類作為父類,再在此基礎上創(chuàng)建具有專用變量和專用方法的子類。子類一方面可以增加父類中沒有的變量和方法,另一方面還可以在繼承基礎上再定義父類中已有的變量和方法。
Java系統(tǒng)要求應用程序中每個類都有父類,如果一個類的定義中沒有用關鍵字extends明確指出父類名,則Java系統(tǒng)默認這個類的父類為
系統(tǒng)軟件包java.1ang中的Object類。父類中凡是公用型的、保護型的或者專用保護型的變量
和方法均可由子類直接調(diào)用,只有父類的專用
型變量和專用型方法不能被子類調(diào)用。例3-3://
Point.javapublic
class
Point{protected
int
x,
y;public
Point()
{
setPoint(
0,
0
);
}public
Point(
int
a,
int
b
)
{
setPoint(
a,
b
);
}public
void
setPoint(
int
a,
int
b
)x
=
a;y
=
b;{??}public
int
getX()
{
return
x;
}public
int
getY()
{
return
y;
}
public
String
toString()
{
return
"["
+
x
+
",
"
+y
+
"]";
}}//Circle.javapublic
class
Circle
extends
Point{protected
double
radius;public
Circle()
{
setRadius(
0
);}public
Circle(
double
r,
int
a,
int
b
){super(
a,b
);setRadius(
r
);}
public
void
setRadius(
double
r
)
{
radius
=
(
r
>=0.0
?
r
:
0.0
);
}public
double
getRadius()
{
return
radius;
}
public
double
area()
{
return
Math.PI
*
radius
*radius;
}public
String
toString(){return
"Center
=
"
+
super.toString()
+
";
Radius=
"
+
radius;}}//
Cylinder.javapublic
class
Cylinder
extends
Circle{protected
double
height;public
Cylinder()
{
setHeight(
0
);
}public
Cylinder(
double
h,
double
r,
int
a,
int
b
){super(
r,
a,
b
);setHeight(
h
);}public
void
setHeight(
double
h
){
height
=
(
h
>=
0
?
h
:
0
);
}public
double
getHeight()
{
return
height;
}public
double
area(){
return
2
*
super.area()
+
2
*
Math.PI
*radius
*
height;}
public
double
volume()
{
return
super.area()
*height;
}public
String
toString(){
return
super.toString()
+
";
Height
=
"
+height;}}//Test.javaimport
javax.swing.JOptionPane;import
java.text.DecimalFormat;public
class
Test
{public
static
void
main(
String
args[]
){Cylinder
c
=
new
Cylinder(
5.7,
2.5,
12,
23
);
DecimalFormat
precision2
=
newDecimalFormat(
"0.00"
);String
output;output
=
"X
coordinate
is
"
+
c.getX()
+"\nY
coordinate
is
"
+
c.getY()
+"\nRadius
is
"
+
c.getRadius()
+"\nHeight
is
"
+
c.getHeight();c.setHeight(
10
);c.setRadius(
4.25
);c.setPoint(
2,2
);output
+="\n\nThe
new
location,
radius
"
+"and
height
of
c
are\n"
+
c
+
"\nArea
is
"
+
precision2.format(
c.area()
)
+"\nVolume
is
"
+
precision2.format(
c.volume()
);
JOptionPane.showMessageDialog(
null,output,"Demonstrating
Class
Cylinder",?JOptionPane.INFORMATION_MESSAGE
);System.exit(
0
);}}運行結果見圖3-3。圖3-3
程序分析:Circle類繼承了Point類。這意味著Circle的public接口除了包括Circle類的
setRadius、getRadius、area、toString方法和
Circle的構造函數(shù)外,還包括Point的方法。應用程序Test用來測試Cylinder類。
注意Cylinder類繼承了Circle類,即Cylinder的public接口除了包括Cylinder構造函數(shù),
Cylinder的方法setHeight、getHeight、area(覆蓋Circle的area方法)、volume和toSting外,還包括Circle的方法。Test應用程序的main方法
首先實例化了Cylinder類的一個對象,然后用“獲取”方法獲取關于Cylinder對象的信息。同樣,這里的main方法也不能直接引用Cylinder類的protected數(shù)據(jù)。3.5.2類的多態(tài)性??
如果你想要使用多態(tài)性,則所需的條件概括如下。對派生類對象方法的調(diào)用必須通過基類的變量。被調(diào)用的方法必須也是基類的一個成員。(3)在基類與派生類中這個方法的方法名必須相同。(4)在基類與派生類中這個方法的返回類型必須相同。(5)在派生類中這個方法的訪問修飾符限制不能超過基類中的限制。3.6接口與包3.6.1接口?
接口是和類很相似而又有區(qū)別的一種結構,接口的設計和調(diào)用也是Java程序設計的重要技
術。從結構上,接口有如下特點。(1)接口用關鍵字interface來定義,而不是用class。(2)接口中定義的變量全是最終的靜態(tài)變量。(3)接口中沒有自身的構造方法,而且定義的其他方法全是抽象方法,即只提供方法的定義,而沒有提供方法的實現(xiàn)語句。(4)接口采用多重繼承機制,而不是采用類的單一繼承機制。3.6.2包1.聲明自己的程序包2.程序包的引用3.Java的系統(tǒng)程序包第4章異常處理和常用系統(tǒng)類4.1異常處理機制4.2
String類和StringBuffer類4.3
AWT4.4
Java
applet4.1異常處理機制4.1.1什么是異常
用任何一種計算機語言設計的程序在運行
時都可能出現(xiàn)各種錯誤,常見的錯誤如除數(shù)為0、文件不存在、文件不能打開、數(shù)組下標超過界
限、內(nèi)存不夠用等。對于這種在運行中出現(xiàn)的
錯誤,計算機系統(tǒng)中通常有兩種處理辦法。
(1)由計算機系統(tǒng)本身直接檢測程序錯誤,遇到錯誤時使程序終止運行。這種處理方法的優(yōu)點是使程序設計比較簡單。但是,對程序錯
誤一概地采用終止運行辦法,顯然過于簡單化。因為有些情況下,完全可以通過其他途徑保持
程序繼續(xù)運行。比如,由于文件名不符合要求
而無法打開文件,那么,可以提示用戶輸入一
個新的文件名,從而使程序繼續(xù)往下運行。
(2)由程序員在程序設計中兼顧錯誤檢測、錯誤信息顯示和出錯處理。這種處理方法的優(yōu)點是減少了中途終止程序運行的可能性。但是,要求程序員在程序設計中不僅將精力用于正常
處理過程,還要精心考慮錯誤檢測和處理,這
會使程序變得復雜。并且,這類錯誤檢測往往
是多數(shù)程序中重復甚至在一個程序中多次重復。而另一方面,如果程序中某處忽略了應有的檢
測,又將引起程序總體結果的錯誤。
Java采用異常處理機制來處理程序運行中的錯誤。按照這種機制,將程序運行中的所有錯誤都看成一種異常,通過對語句塊的檢測,一個程序中所有的異常被收集起來放在程序的某一段中去處理。在Java系統(tǒng)中,專門設置了一個調(diào)用棧,此棧中裝有指向異常處理方法的指針。
在程序運行時,系統(tǒng)會把收集到的異常和異常處理指針所指的處理類型逐個比較,如果
找到相符的類型,那么就轉向相應的方法處理,如沒有在調(diào)用棧中找到相應的類型指針,則終
止程序運行,并顯示解釋信息。在Java程序中,異常一般由以下兩種原因引起。(1)程序中存在非法操作,最簡單的例子就是除數(shù)為0的除法操作。這種原因常常是程序員出于無意或大意造成的,所以稱為隱式異常。常見的隱式異??梢酝ㄟ^java.lang包中的
Throwable類的子類Error處理。
(2)程序員在程序中使用了throw語句引
起的異常。這種異常是程序員出于某種考慮有
意安排的,所以稱為顯式異常。在throw語句中,都會指出處理顯式異常的對象,這些對象都是
由java.lang包的類Throwable的子類Exception再派生的子類生成的,每個對象完成對某種異常
的處理功能,這些對象綜合起來實現(xiàn)各種異常
處理。比如Array-IndexOutOfBoundsException子類處理數(shù)組越界異常,IOException子類處理輸入輸出異常,而ArithmeticException子類處理除數(shù)為0導致的算術異常等。?4.1.2異常的層次結構?4.1.3異常的處理?4.1.4創(chuàng)建自己的異常4.2
String類和StringBuffer類4.2.1
String類1.String類的主要構造方法
String類有多個構造方法,主要的有下列5個:String();String(char
chars[
]);String(char
chars[
],
int
startIndex,
int
numChars);String(byte
ascii[
],
int
hiByte);
String(byte
ascii[
],
int
hiByte,
int
startIndex,
intnumChars);第1個構造方法生成一個空串。第2個構造方法生成一個字符數(shù)組。第3個構造方法生成一個字符串,這個字符串是從字符數(shù)組chars[]中提取的,具體講,即從chars[]數(shù)組的startIndex位置開始提取字符,共提取numChars個字符組成一個字符串。第4個構造方法是以字節(jié)數(shù)組的形式生成一個字符串,數(shù)組中存放字符串各字符對應的
ASCII碼。第5個構造方法也是從字節(jié)數(shù)組生成一個字符串。具體講,就是以字節(jié)數(shù)組ascii[]的
startIndex處開始,共提取numChars個字符構成字符串,如為ASCII字符,則hiByte的值為0。例4-5:import
javax.swing.*;public
class
StringConstructors
{public
static
void
main(
String
args[]
){
char
charArray[]
=
{
"b",
"i",
"r",
"t",
"h",
"
",
"d","a",
"y"
};
byte
byteArray[]
=
{(byte)
"n",
(byte)
"e",
(byte)"w",(byte)
"
",
(byte)
"y",
(byte)
"e",(byte)
"a",
(byte)
"r"
};StringBuffer
buffer;String
s,
s1,
s2,
s3,
s4,
s5,
s6,
s7,
output;s
=
new
String(
"hello"
);
buffer
=new
StringBuffer(
"Welcome
to
JavaProgramming!"
);s1
=
new
String();s2
=
new
String(
s
);s3
=
new
String(
charArray
);s4
=
new
String(
charArray,
6,
3
);s5
=
new
String(
byteArray,
4,
4
);s6
=
new
String(
byteArray
);s7
=
new
String(
buffer
);output
=
"s1
=
"
+
s1
+"\ns2
=
"
+
s2
+?"\ns3
=
"
+
s3
+"\ns4
=
"
+
s4
+"\ns5
=
"
+
s5
+"\ns6
=
"
+
s6
+"\ns7
=
"
+
s7;
JOptionPane.showMessageDialog(
null,output,"Demonstrating
String
ClassConstructors",?JOptionPane.INFORMATION_MESSAGE
);System.exit(
0
);}}運行結果見圖4-5。圖4-5程序分析:String類提供了9個構造函數(shù),以便使用各種方法初始化String對象。例題共演示了7種。程序“s1=new
String()”實例化一個新的
String對象,并使用String類的缺省構造函數(shù)將它賦給引用s1。新的String對象沒有字符(即空串),長度為0。“s2=new
String(s);”例化一個新的
String對象,并使用String類的拷貝構造函數(shù),將它賦給引用s2。s被當作參數(shù)傳送給構造函數(shù),新的String對象包含了String對象s中的字符的拷貝。在大多數(shù)情況下,沒有必要拷貝已有的
String對象。String對象是不變的,一旦創(chuàng)建后就不能改變它們的內(nèi)容(字符串)。而且,如果有一個或多個引用指向某個
String對象,垃圾收集器就不能回收該對象。也就是說,String引用既不能用于修改String對象,也不能刪除String對象。這一點與C語言或C++語言是不同的?!皊3=new
String(charArray);”實例化一個新的String對象,并使用以字符數(shù)組為參數(shù)的String類構造函數(shù),將它賦給引用s3。新的
String對象包含了數(shù)組中字符的拷貝?!皊4=new
String(charArray,6,3);”實例化一個String對象,使用以一個字符數(shù)組和兩個整數(shù)為參數(shù)的String類構造函數(shù),將它賦給引用s4。第2個參數(shù)指定了在數(shù)組中拷貝字符的起始位置(offset)。第3個參數(shù)指定了數(shù)組中拷貝字符的數(shù)目(count),新的String對象包含了數(shù)組中指定字符的拷貝。如果offset或count參數(shù)指定的所取元素超過了字符數(shù)組的界限,就會產(chǎn)生
StringIndexOutOfBoundsException的例外處理。“s5=new
String(byteArray,4,4);”實例化一個新的String對象,使用以一個byte數(shù)組和兩個整數(shù)為參數(shù)的String類構造函數(shù),將它賦給引用s5。第2和第3個參數(shù)分別指定了offset和count。新的String對象包含了數(shù)組中指定
byte的拷貝。如果offset或count參數(shù)指定的所取元素超過了byte數(shù)組的界限,就會產(chǎn)生一個
StringIndexOutOfBoundsException的例外處理。“s6=new
String(byteArray);”實例化一個新的String對象,使用以一個byte數(shù)組為參數(shù)的String類構造函數(shù),將它賦給引用s6。新的String對象包含了數(shù)組中byte的拷貝。“s7=new
String(buffer);”實例化一
個新的String對象,使用以StringBuffer為參數(shù)的
String類構造函數(shù),將它賦給引用s7。StringBuffer是一個可動態(tài)改變大小和內(nèi)容的字符串。新的String對象包含了StringBuffer中字符的拷貝。2.String類的length、charAt和getChars方法
下面的例子演示了String類的length、charAt和getChars方法,它們分別用于確定
String類的長度、取String某一指定位置的字符以及取String某一子串。3.String類的字符串比較例4-7:import
javax.swing.JOptionPane;public
class
StringCompare
{public
static
void
main(
String
args[]
){String
s1,
s2,
s3,
s4,
output;s1
=
new
String(
"hello"
);s2
=
new
String(
"good
bye"
);s3
=
new
String(
"Happy
Birthday"
);s4
=
new
String(
"happy
birthday"
);output
=
"s1
=
"
+
s1
+
"\ns2
=
"
+
s2
+"\ns3
=
"
+
s3
+
"\ns4
=
"
+
s4
+
"\n\n";if
(
s1.equals(
"hello"
)
)????output
+=
"s1
equals
\"hello\"\n";elseoutput
+=
"s1
does
not
equal\"hello\"\n";if
(
s1
==
"hello"
)output
+=
"s1
equals
\"hello\"\n";elseoutput
+=
"s1
does
not
equal\"hello\"\n";if
(
s3.equalsIgnoreCase(
s4
)
)output
+=
"s3
equals
s4\n";elseoutput
+=
"s3
does
not
equal
s4\n";output
+=
"\pareTo(
s2
)
is
"
+pareTo(
s2
)
+
"\pareTo(
s1
)
is
"
+pareTo(
s1
)
+???
"\pareTo(
s1
)
is
"
+pareTo(
s1
)
+"\pareTo(
s4
)
is
"
+pareTo(
s4
)
+"\pareTo(
s3
)
is
"
+pareTo(
s3
)
+"\n\n";if
(
s3.regionMatches(
0,
s4,
0,
5
)
)????
output
+=
"First
5
characters
of
s3
and
s4match\n";elseoutput
+="First
5
characters
of
s3
and
s4do
not
match\n";if
(
s3.regionMatches(
true,
0,
s4,
0,
5
)
)output
+=
"First
5
characters
of
s3
and
s4match";else?output
+="First
5
characters
of
s3
and?s4
do
not
match";
JOptionPane.showMessageDialog(
null,output,"Demonstrating
String
ClassConstructors",?JOptionPane.INFORMATION_MESSAGE
);System.exit(
0
);}}4.在字符串中定位字符和子串5.從字符串中抽取子串6.字符串連接public
String
concat(String
st)可返回一個字符串,它將把參數(shù)str添加在原字符串的后
面形成一個新的字符串。但在Java中,更多的是使用“+”來連接字符串。這里讀者可能會產(chǎn)生一個小小的迷惑,因為前面我們講過String對象是不能改變的。實際上,字符串的連接是由編譯器利用StringBuffer的方法append來實現(xiàn)的。這在下面的章節(jié)中講
解。例4-10:import
javax.swing.*;public
class
StringConcat
{public
static
void
main(
String
args[]
){String
s1
=
new
String(
"Happy
"
),s2
=
new
String(
"Birthday"
),output;??output
=
"s1
=
"
+
s1
+"\ns2
=
"
+
s2;
output
+=
"\n\nResult
of
s1.concat(
s2
)
="
+s1.concat(
s2
);output
+=
"\ns1
after
concatenation
=
"
+s1;JOptionPane.showMessageDialog(
null,output,"Demonstrating
String
Method
concat",JOptionPane.INFORMATION_MESSAGE
);System.exit(
0
);}}運行結果見圖4-10。7.轉化為字符串圖4-104.2.2
StringBuffer類
String類提供了很多處理字符串的功能。但是,一旦創(chuàng)建了字符串對象,它的內(nèi)容就永遠不會變。下面將討論StringBuffer類的特點。這個類可以創(chuàng)建和操縱動態(tài)字符串,即可修改的字符串。每個StringBuffer都能夠存儲由它的容量所指定的一些字符。如果超過了
StringBuffer的容量,容量就會自動地擴大以容納多出來的字符。我們將看到,StringBuffer類還可用來實現(xiàn)用于字符串連接的運算符"+"。
String對象是常量字符串,StringBuffer對象是可修改的字符串。Java區(qū)分字符串和可修改的字符串是為了優(yōu)化的目的。特別地,Java可以實現(xiàn)有關String對象的某些優(yōu)化,例如多
個引用共享一個String對象,因為它知道這些
對象不會改變。
注意:在選擇是用String對象還是用
StringBuffer對象來表示一個字符串時,如果該對象確實不會改變,則總是使用String對象,這樣做可以改善性能。對String對象調(diào)用非String類的StringBuffer方法是一種語法錯誤。
StringBuffer提供的方法有一些與String相同,有一些不同。最主要的方法有兩組,一組是
append,另一組是insert。4.3
AWT?4.3.1AWT概述?4.3.2AWT的特點?4.3.3AWT應用4.4
Java
applet4.4.1
Java
applet的特點
Java
applet與Java應用程序不同。它們的不同之處有以下幾個方面。
(1)Java應用程序中,必須有一個main()方法。Main()方法是程序的入口,當程序開始運行時,解釋器首先查找main()方法并執(zhí)行。而Java
applet中則不需要main()方法,它必須嵌入HTML文件中,由支持Java
applet的瀏覽器運行。(2)Java應用程序可以獨立運行。而Javaapplet不能獨立運行,需要依賴于網(wǎng)絡瀏覽器。(3)Java應用程序所實現(xiàn)的功能是完全的,不需依賴于其他程序。而Java
applet實現(xiàn)的功能是不完全的,它必須借助于瀏覽器中預先設計好的功能和已有的圖形界面。Javaapplet只需接收瀏覽器發(fā)送給它的消息,并及時做出響應。
(4)Java應用程序中的所有方法的使用是通過調(diào)用實現(xiàn)的??梢匀藶榭刂?。而Javaapplet中有一部分方法是固定的,只能由瀏覽器在特定時刻和場合調(diào)用,不能人為控制,但可以重載。4.4.2
Java
applet的程序結構Java
applet的一般程序結構如下:import
java.applet.*;import
java.awt.*;public
class子類名extends
Applet//定義Applet類的子類{
public
void
init(){方法體}
//初始化方法public
void
start(){方法體}
//開始執(zhí)行方法public
void
stop(){方法體}
//停止執(zhí)行方法public
void
destroy(){方法體}
//退出方法public
void
paint(Graphics
g)?{方法體}
//繪畫方法}……從Java
applet程序結構看出,Java
applet由若干類組成,無需main()方法,但必須有且僅有一個主類,該類是Applet類的子類,且被聲
明為public。程序被保存時,程序名必須命名為主類名,即程序名與主類名完全相同,后綴為.
java。主類中定義了init()、start()、stop()、destroy()和paint()方法,這些方法是從Applet中繼承的,有固定的含義,由瀏覽器在時機成熟時自動執(zhí)行。4.4.3
Applet的主要方法
在瀏覽器中運行Applet程序,從運行開始到運行結束,Applet程序需經(jīng)歷4個狀態(tài),分別是初始狀態(tài)、運行狀態(tài)、停止態(tài)和消亡狀態(tài)。這4種狀態(tài)分別對應Applet的4個主要方法:init()、start()、stop()和destroy()。
對于支持Java的瀏覽器,如果在運行一個
HTML文件時發(fā)現(xiàn)該文件包含Applet程序,瀏覽器就會生成該Applet的一個實例,并調(diào)用init()方法,進入初始化狀態(tài),在該狀態(tài)下完成
Applet的一些初始化操作。初始化完成后,瀏覽器接著調(diào)用start()方法,進入運行狀態(tài),真正開始執(zhí)行Applet,在該狀態(tài)下Applet通常會啟動一些線程執(zhí)行各種任務。
當退出當前主頁時,瀏覽器調(diào)用stop()方法終止在運行狀態(tài)下啟動的線程,進入停止狀態(tài)。當用戶退出瀏覽器時,瀏覽器首先調(diào)用Applet的stop()方法,停止Applet的執(zhí)行,然后調(diào)用
destroy()方法釋放Applet占用的系統(tǒng)資源,進入消亡狀態(tài)。下面具體介紹init()、start()、stop()和
destroy()4種方法。1.Init()方法在Applet執(zhí)行過程中,init()方法只執(zhí)行一次。當瀏覽器第一次瀏覽含有Applet的Web頁載入Applet時,就會執(zhí)行init()方法。由于在Applet執(zhí)行過程中,該方法只被執(zhí)行一次,所以可以在init()方法中進行一些只需執(zhí)行一次的初始化操作,如變量的初始化、設置Applet初始狀態(tài)、載入圖形或字體、獲取
HTML中Applet標記單元中<PARAM>設定的參數(shù)等。2.start()方法調(diào)用完init()方法,瀏覽器將調(diào)用start()方法啟動Applet。和init()方法不同,在Applet的執(zhí)行過程中,start()方法可被瀏覽器調(diào)用多次。在下列情況下,瀏覽器會調(diào)用start()方法。(1)瀏覽器從圖標狀態(tài)恢復為窗口狀態(tài)或縮放瀏覽器窗口時。(2)Applet第一次載入時。(3)離開該Web頁后又再返回時。(4)reload該頁面時。在start()方法中可啟動相關線程來控制
Applet,給引入類對象發(fā)送消息,或以某種方式通知Applet開始運行。該方法是Applet的主體。3.stop()方法該方法與start()方法是相對應的,在
Applet執(zhí)行過程中,也會被瀏覽器調(diào)用多次。在下列情況下,瀏覽器會調(diào)用stop()方法。(1)瀏覽器從圖標狀態(tài)恢復為窗口狀態(tài)或縮放瀏覽器窗口時。(2)離開Applet所在Web頁時。(3)reload該頁面時。(4)關閉該Web頁時。(5)從該Web頁退出瀏覽器運行時。stop()方法可在適當時機掛起Applet,停止一些占用系統(tǒng)資源的工作,釋放系統(tǒng)處理資源,以提高系統(tǒng)的運行速度。4.destroy()方法在徹底結束對該Web頁的訪問或退出瀏覽
器時調(diào)用destroy()方法,卸載Applet,釋放載入
Applet時分配的系統(tǒng)資源。在Applet的執(zhí)行過程中,destroy()方法只執(zhí)行一次。destroy()方法是Applet類的類方法,只能用于Applet。可在該方法中執(zhí)行釋放系統(tǒng)資源
的代碼。但一般不需重寫destroy()方法,因為
Java運行系統(tǒng)本身會自動進行“垃圾”處理和
內(nèi)存管理,除非用了特殊的資源如創(chuàng)建的線程。注意:destroy()方法與stop()方法不同。除了上述4個方法外,Applet還提供一個非常重要的方法:paint(Graphics
g)方法。該方法用于進行繪圖的具體操作,但沒有實現(xiàn)任何操作,用戶可重寫該方法,實現(xiàn)個性化的繪圖操作。在Applet執(zhí)行過程中,paint()方法可以被瀏覽器自動調(diào)用執(zhí)行繪圖操作,可調(diào)用多次。
當調(diào)整瀏覽窗口大小、縮放瀏覽窗口、移動窗
口或reload等需要重繪窗口時都會調(diào)用paint()方法。與其他4個方法不同的是,paint()中需傳遞一個參數(shù),該參數(shù)是Graphics類的對象,由這個對象來完成具體的繪圖操作。Graphics對象由瀏覽器自動創(chuàng)建并將其傳送給paint()方法。注意:應在Applet中引入Graphics類的包或該類:import
java.awt.Graphics;例4-16:import
java.applet.*;import
java.awt.*;public
class
example4_16
extends
Applet{private
int
InitCount;private
int
StartCount;private
int
StopCount;private
int
DestroyCount;private
int
PaintCount;public
example4_16(){InitCount=0;StartCount=0;StopCount=0;DestroyCount=0;PaintCount=0;}public
void
init()InitCount++;{?}public
void
destroy(){DestroyCount++;}public
void
start()StartCount++;{?}public
void
stop(){StopCount++;}public
void
paint(Graphics
g){??PaintCount++;g.drawString("Paint()方法執(zhí)行了:"+PaintCount+"次。",20,20);
g.drawString("Init()方法執(zhí)行了:
"+InitCount+"次。",20,70);
g.drawString("Start()方法執(zhí)行了:
"+StartCount+"次。",20,120);?
g.drawString("Stop()方法執(zhí)行了:
"+StopCount+"次。",20,170);g.drawString("Destroy()方法執(zhí)行了:
"+DestroyCount+"次。",20,220);}}4.4.4
Java
applet的運行?
Java
applet程序不能獨立運行,必須由瀏覽器來運行,因此我們需編寫一個HTML文件,通過<applet>標記將applet程序編譯生成的字節(jié)碼文件嵌入HTML文件,通知瀏覽器來運行
Java
applet。如要運行例4-16,可編寫如下的HTML文件:<html><head><title>example4_16</title></head><body><applet
code=example4_16.classwidth=300
height=250></applet></body></html>第5章圖形用戶界面5.1文本框和文本區(qū)5.2
標
簽5.3
按
鈕5.4選擇框5.5
畫
布5.6面板與布局設計5.7
窗
口5.8
菜
單5.9對話框5.1文本框和文本區(qū)5.1.1文本框及處理事件1.文本框的創(chuàng)建2.文本框處理事件
例5-2:兩個空白文本框,當在第一個文本框內(nèi)輸入字符時,在文本框內(nèi)顯示“*”號,輸入完畢按回車鍵后,在第二個文本框內(nèi)顯示:The
end。import
java.awt.*;import
java.applet.Applet;import
java.awt.event.*;public
class
Ex6_2
extends
Applet{TextField
tf1=new
TextField(20);TextField
tf2=new
TextField(20);public
void
init(){add(tf1);tf1.setEchoChar("*");add(tf2);tf1Listener
al
=
new
tf1Listener();tf1.addActionListener(a1);}class
tf1Listener
implements
ActionListener{public
void
actionPerformed(ActionEvent
e)
{tf2.setText("The
end");}}}運行結果見圖5-2。圖5-15.1.2文本區(qū)及處理事件
例5-4:在Applet中添加一個文本框和一個文本區(qū),每當在文本框中輸入一個字符時,在文本區(qū)內(nèi)就附加一行文本:The
text
is
changed。import
java.awt.*;import
java.applet.Applet;import
java.awt.event.*;public
class
Ex6_4
extends
Applet{TextField
tf1=new
TextField(20);TextArea
ta1=new
TextArea
(null,6,40);public
void
init(){add(tf1);add(ta1);tf1.addTextListener(new
TextL());}class
TextL
implements
TextListener{public
void
textValueChanged(TextEvent
e)
{ta1.append("\nThe
text
is
changed");?}}}運行結果見圖5-4。圖5-45.2
標
簽
標簽(Label)是AWT構件中最簡單的一種構件,所謂標簽實質(zhì)上就是一段文字,但它與文字不同的是它是一個對象,所以在每次
repaint時,不用重新添加。標簽在GUI界面中通常作為提示信息使用。標簽構件的構造方法如下。(1)Label()構造一個空的標簽。(2)Label(String
str)構造一個以
String
str為內(nèi)容的標簽。(3)Label(String
str,int
align)定義一個以String
str為內(nèi)容的標簽。5.3
按
鈕5.3.1按鈕??
按鈕(Button)是GUI用戶界面中常用的元素,它是用戶輸入命令的一個重要工具。當用鼠標單擊某個按鈕該按鈕獲得焦點時,在鍵盤上按回車鍵都會導致一個命令的執(zhí)行。Button類有兩種構
造方法。Button()構造一個沒有標簽的按鈕。Button(String
str)構造一個以String
str為標簽的按鈕。5.3.2按鈕處理事件?與按鈕有關的事件有兩類。1.ActionEvent當用鼠標單擊按鈕,或當按鈕獲得焦點時在鍵盤上按回車鍵都導致該事件的發(fā)生,此時任何實現(xiàn)了被注冊為監(jiān)聽者的ActionListener接口的類,它的actionPerformed()方法將被調(diào)用。下面的程序范例在Applet上添加兩個命令按鈕,其標簽分別為“顯示”和“清除”,當單擊“顯示”按鈕時,在文本區(qū)中顯示:“你按下了顯示按鈕”,當按“清除”按鈕時則清除文本區(qū)中顯示的字符。例5-6:文本區(qū)事件處理。import
java.awt.*;import
java.applet.Applet;import
java.awt.event.*;public
class
Ex6_6
extends
Applet{Button
b1=new
Button("顯示");Button
b2=new
Button("清除");TextArea
ta1=new
TextArea
(null,6,40);public
void
init(){add(b1);add(b2);add(ta1);b1.addActionListener(new
ButtenL());b2.addActionListener(new
ButtenL());}class
ButtenL
implements
ActionListener{public
void
actionPerformed(ActionEvent
e){??if
(e.getSource()==b1)ta1.append
("\n你按下了"顯示"按鈕");else?ta1.append
("\n你按下了"清除"按鈕");}}}運行結果見圖5-6。圖5-62.FocusEvent
FocusEvent稱作焦點事件,它的發(fā)生是指鍵盤光標移動到構件上并且可以接受鍵盤的輸入。如果光標移動到一個按鈕上,稱作該按鈕獲得焦點,反之稱作失去焦點。當一個按鈕獲得焦點時單擊回車鍵即相當于用鼠標單擊該按鈕。如果一個文本框獲得焦點就可以在該文本框中輸入字符。例5-7:按鈕和文本框檢測焦點事件的例子。程序如下:import
java.awt.*;import
java.applet.Applet;import
java.awt.event.*;public
class
Ex6_7
extends
Applet{TextField
txt1
=
new
TextField("txt1",50);TextField
txt2
=
new
TextField("txt2",50);Button
button1=new
Button("button1");Button
button2=new
Button("button2");class
Keytry
implements
FocusListener{public
void
focusGained(FocusEvent
e)
{?txt1.setText("txt1:paramString()="+e.paramString());if
(e.getSource()==txt1)txt2.setText("txt2:focus
is
on
txt1
");elsetxt2.setText("txt2:focus
is
on
button1");????}public
void
focusLost(FocusEvent
e)
{?txt1.setText("txt1:paramString()="+e.paramString());?txt2.setText("txt2:focus
lost
outsidebutton1
or
txt1");}}Keytry
al
=
new
Keytry();public
void
init(){setLayout(new
FlowLayout());txt1.addFocusListener(al);button1.addFocusListener(al);add(button1);add(button2);add(txt1);add(txt2);}}運行結果見圖5-7。圖5-7在上面的例子中,只有button1和txt1注冊了焦點事件的事件監(jiān)聽者,它們共享同一個事
件處理程序。如果焦點在button1或txt1上面,文本框txt2顯示焦點在哪個構件上(focusGaned),反之則指出無焦點(focusLost)。文本框txt1內(nèi)顯示事件的參數(shù)字符串,它也能指出是否有焦點。另外,程序中的
setLayout(new
FlowLayout())語句是控制構件的布局用的,關于這個問題將在后面的章節(jié)中
進行討論。5.4選擇框5.4.1選擇框1.下拉列表框(Choice)2.列表框(List)3.復選框(Checkbox)4.單選框(Checkbox
group-Radio
Button)5.4.2選擇框處理事件例5-12:選擇框檢測ItemEvent事件的例子。import
java.awt.*;import
java.applet.Applet;import
java.awt.event.*;
public
class
Ex6_12
extends
Applet
implementsItemListener{TextArea
ta1=new
TextArea
(null,6,40);
String
subject[]={"語文","數(shù)學","政治","外語","物理","化學"};Checkbox
cb[]=new
Checkbox[6];public
void
init(){add(new
Label("請選擇:"));for(int
I=0;I<6;I++){cb[I]=
new
Checkbox(subject[I]);add(cb[I]);cb[I].addItemListener(this);???}add(ta1);}?public
void
itemStateChanged(ItemEvent
e)
{
ta1.append("\n你在復選框中的選擇是:
"+e.getItem());}}運行結果見圖5-12。圖5-125.5畫布例5-13:創(chuàng)建一個畫布。import
java.awt.*;import
java.applet.Applet;import
java.util.*;public
class
mycanvas
extends
Applet
{public
void
init()
{MyCanvas1
mc
=
new
MyCanvas1();mc.setBackground(Color.green);mc.setSize(150,150);add(mc);}}class
MyCanvas1
extends
Canvas{public
void
paint(Graphics
g){g.fillOval(40,20,80,80);}}運行結果見圖5-13
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
- 4. 未經(jīng)權益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責。
- 6. 下載文件中如有侵權或不適當內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 2024-2030年國內(nèi)原油制品行業(yè)市場深度分析及發(fā)展前景及投資機會研究報告
- 2024-2030年國PLM市場深度調(diào)查與未來前景預測分析研究報告
- 2024-2030年商業(yè)輸送式洗碗機行業(yè)市場現(xiàn)狀供需分析及投資評估規(guī)劃分析研究報告
- 2024-2030年可調(diào)線性穩(wěn)壓器行業(yè)市場現(xiàn)狀供需分析及重點企業(yè)投資評估規(guī)劃分析研究報告
- 2024-2030年變頻空調(diào)產(chǎn)業(yè)政府戰(zhàn)略管理與區(qū)域發(fā)展戰(zhàn)略研究咨詢報告
- 6 我們神圣的國土(教學設計)部編版道德與法治五年級上冊
- 2024-2030年半導體介電蝕刻設備行業(yè)市場現(xiàn)狀供需分析及重點企業(yè)投資評估規(guī)劃分析研究報告
- 2024-2030年醫(yī)藥包裝產(chǎn)業(yè)規(guī)劃專項研究報告
- 2024-2030年醫(yī)用消毒袋市場需求現(xiàn)狀調(diào)研及未來銷售趨勢預測報告
- 2024-2030年化妝品香精市場投資前景分析及供需格局研究預測報告
- 寺廟開發(fā)運營項目運營方案
- 福特F-150猛禽說明書
- 風景園林工程師答辯(中級)文字版
- 初一英語情景對話100篇
- 船員應變部署床頭卡
- 冬季四防安全知識培訓課件
- 行業(yè)屬性代碼表
- 小數(shù)除法豎式計算練習100題
- 高中數(shù)學期末備考微專題55講解析幾何24齊次化方法含解析
- 學生體育學業(yè)綜合評價表
- 第三課用相機記錄北京風情七年級美術課課件(人美版2013)
評論
0/150
提交評論