java基礎知識大全_第1頁
java基礎知識大全_第2頁
java基礎知識大全_第3頁
java基礎知識大全_第4頁
java基礎知識大全_第5頁
已閱讀5頁,還剩63頁未讀, 繼續(xù)免費閱讀

下載本文檔

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

文檔簡介

第一講Java語言入門

1.1Java的特點

1.1.1面向對象:

?與C++相比,JAVA是純的面向對象的語言

C++為了向下兼容C,保留了很多C里面的特性,而C,眾所周知是面向過程的語言,這就使

C++成為一個"混血兒"。而JAVA語法中取消了C++里為兼容C所保留的特性,如取消了頭文件、指

針算法、結構、單元等。

1.1.2可移植(平臺無關性):

?生成中間字節(jié)碼指令

與其他編程語言不同,Java并不生成可執(zhí)行文件(.exe文件),而是生成一種中間字節(jié)碼文

件(.class文件)。任何操作系統(tǒng),只要裝有Java虛擬機(JVM),就可以解釋并執(zhí)行這個中間字節(jié)

碼文件。這正是Java實現(xiàn)可移植的機制。

?原始數(shù)據(jù)類型存儲方法固定,避開移植時的問題

Java的原始數(shù)據(jù)類型的大小是固定的。比如,在任何機器上,整型都是32位,而C++里整型

是依賴于目標機器的,對16位處理器(比如8086),整數(shù)用兩個字節(jié)表示;在像SunSPARC這樣的

32位處理器中,整數(shù)用4個字節(jié)表示。在IntelPentium處理器上,整數(shù)類型由具體的操作系統(tǒng)決定:

對于DOS和Win32來說,整數(shù)是2個字節(jié);對于Windows9x、NT和2000,整數(shù)是4個字節(jié)。當然,

使整數(shù)類型平臺無關之后,性能必然有所下降,但就Java來說,這個代價是值得的。Java的字符串,

則采用標準的Unicode格式保存。可以說,沒有這個特性,Java的可移植性也不可能實現(xiàn)。

1.1.3簡單

?JAVA在語法上與C++類似

JAVA的語法與C++很接近,有過C或者C++編程經(jīng)驗的程序員很容易就可以學會JAVA語法;

?取消了C++的一些復雜而低效的特性比如:用接口技術代替了C++的多重繼承。C++中,一個

類允許有多個超類,這個特性叫做"多重繼承",多重繼承使得編譯器非常復雜且效率不高;JAVA

的類只允許有一個超類,而用接口(Interface)技術實現(xiàn)與C++的多繼承相類似的功能

其它被取消的特性包括:虛擬基礎類、運算符過載等

?JAVA的基本解釋器和類支持模塊大概僅40K

即使加入基本的標準庫和支持線程的模塊,也才220K左右。與GUI(圖形用戶界面)相比,

明顯小很多

1.1.4健壯

?取消了指針算法

C的最關鍵的一個特性是它的強大指針算法,比如可以用指針訪問字符串、數(shù)組甚至文件,很

容易產(chǎn)生指針溢出,意外地改寫內(nèi)存和損毀數(shù)據(jù)。JAVA里有一個指針模型,對于普通的任務,如訪問

字符串、數(shù)組,根本不用指針,而一旦需要,比如訪問對象、文件時,也可以獲得指針的強大能力,

但JAVA同時有高度的指針安全保障,用戶永遠不可能訪問一個壞掉的指針、不可能造成內(nèi)存分配錯誤,

也用不著專門提防可能出現(xiàn)的內(nèi)存漏洞。

LL5多線程

?強大的多線程能力

多線程可以使程序有更好的交互性和實時性,并可以最大限度地利用多處理器系統(tǒng)。JAVA有

著強大的多線程處理能力,因為各主流操作系統(tǒng)平臺在線程的實施方面有重大的差異,所以JAVA為不

同的操作系統(tǒng)實現(xiàn)了專門的多線程機制。在這點上來說,JAVA沒有做到平臺無關。

1.2Java簡史

?首次亮相-T995年5月

Java技術起先是作為小型的計算機語言,用于消費類設備,比如有線電視交換盒等。因為這

些設備的功能和內(nèi)存均不足以運行大程序,所以程序要盡可能??;另外,由于不同的廠商可能選用不

同的CPU,所以要求這種語言不能受限于任何一種獨立的體系結構。1995年5月23日召開的SunWorld

’95大會上,一種全新的瀏覽器(今天的Hotjava的前身)亮相,標志著Java的誕生。

?開始流行一1996年1月

那時網(wǎng)景公司決定在Netscape2.0加入對Java的支持,Netscape2.0在1996年1月發(fā)布,從

這一版本開始,所有Netscape瀏覽器均支持Java。注冊了Java使用許可證的還有IBM、Symantec、

Inprise和其他許多公司。就連微軟,也加入了這一行列(盡管他們支持的Java和標準的Java稍有

不同)。

?SUN的第一個JAVA版本一1996年初

Sun公司于1996年初發(fā)布了Java1.02,遺憾的是,Javal.02還未擺脫其小型語言的影子,

只適合用來做諸如網(wǎng)頁上一個隨機移動的文字之類的工作,并不適合用來做正規(guī)的程序開發(fā)。Javal.02

作為一種正規(guī)的編程語言,可以說,準備得很不充分。

?成熟一1998年

1998年12月,Javal.2問世了。它是一個功能全面的、具有高度擴展能力的新版本。3天后,

Javal.2被改進成Java2,向''一次編寫,到處運行''的目標前進了一大步。

?現(xiàn)狀

現(xiàn)在最新的Java版本是JDKL4,它是一個測試版,穩(wěn)定的正式版是JDK1.3。用戶可以到

/products/免費下載。微軟在它的最新瀏覽器IE6.0中不再支持Java,為Java

的發(fā)展帶來陰影。

1.3JDK的安裝與編程環(huán)境的設定

1.3.1Java程序的開發(fā)過程

經(jīng)典的Java工具包是JDK。盡管可以用任何文本編輯器,如記事本,都可以直接編寫Java程

序然后用JDK的命令編譯和運行,為了調試方便,也為了初學者容易上手,本教程課件將使用一個叫

JPadPro的Java編寫工具來調用JDK的工具。用戶可以到http:〃www.modelworks,com下載這個工具。

1.3.2JDK的安裝

1.3.3安裝運行之后,應該首先設置JDK工具包所在的路徑。

菜單欄的JDK->selectJDKDirectory->選擇剛才安裝的JDK路徑-〉0K。

1.3.4新建一個project

菜單欄的File->newprojects->選擇路徑,輸入project的名字。

V;r實用教程

1.4兩個簡單的程序示例

1.4.1Java應用程序:Hello,java

?編寫

新建一個.java文件。File-)new-〉javafile-)輸入一個名字:Hello-〉點creatfile.

出現(xiàn)了一個空的java文件。

?編譯

JDK-〉compileHello,java或者點擊如演示所示的按鈕。實際上是執(zhí)行JDK工具包里的

javac.exe命令,與javacG:\java2jiaocheng\example\teachl\Hello.java是等價的。便已完成之

后在同一個文件夾就會有一個同名的.class文件。

?看編譯結果,改錯

錯誤舉例:少寫一個分號;錄入錯誤;

?運行

JDK-)Runclasses->選擇要運行的class,輸入?yún)?shù)(這里,沒有參數(shù))或者點擊如演示所

示的按鈕。

一個有參數(shù)的例子

?看運行結果

1.4.2JavaApplet:StarterApplet.java

新建一個JavaApplet文件。File-)new-)javaApplet-)輸入一個名字:StarterApplet-)

出現(xiàn)了一個空的java文件和一個Html文件。

?編譯

JDK->compileStarterApplet.java或者點擊如演示所示的按鈕。實際上是執(zhí)行JDK工具包里的

javac.exe命令,與javacG:\java2jiaocheng\example\teachl\StarterApplet.java是等價的。

注意不要隱藏文件的擴展名,否則給編譯時帶來麻煩!可以在工

工具/文件夾先項/查看/中修改??!

?看編譯結果,改錯

?運行

JDK-)TestApplet-)選擇要運行的class,輸入?yún)?shù)(這里,沒有參數(shù))

或者點擊如演示所示的按鈕

或者直接雙擊Html文件。

?看運行結果

1.5如果獲得幫助

1.5.1下載幫助

JDK并不包含幫助文件,需要到網(wǎng)站上下教,里面有示例和說明。

http://ww.confluent.fr/javadoc/jdkl3e.html,下載下來時候,雙擊安裝。

1.5.2使用幫助

敲入想查找的關鍵字,按回車。

1.6編程的一些約定

注意:在一個原文件中只能有一個public類!且文件名與public類同名!

1.6.1命名規(guī)則

類名與文件名應該一致,否則編譯出錯。比如,classHello的文件名應該是Hello.java

類名首字母大寫,每個單詞開頭大寫,其他用小寫。比如:Hello,java,StarterApplet.java?

變量名用第一個單詞用小寫字母,第二個以后的單詞首字母大寫。比如:intmyAge;

方法的名字第一個單詞用小寫字母,第二個以后的單詞首字母大寫,比如:getMyAgeO;

1.6.2注釋

/*

*Hereisablockcomment.

*/

表示完整的一段注釋;

if(condition){

/*Handlethecondition.*/

)

表示注釋該行以下部分

if(a==2){

returnTRUE;/*specialcase*/

}else{

returnisPrime(a);//worksonlyforodda

)

注釋一行

1.6.3分行

如果一行太長需要換行。比如:

someMethod(longExpressionl,longExpression2,longExpression3,

longExpression4,longExpression5);

var=someMethodl(longExpressionl,

someMethod2(longExpression2,

longExpression3));

var=someMethodl(longExpressionl,someMethod2

(longExpression2,

longExpression3));

講演計劃

第三講語句

Java的語句可以分為以下4種:

?表達式語句

?方法調用語句

?控制語句

3.1表達式語句

一個表達式加上一個分號就構成了一個語句。分號表示一個語句的結束,缺少分號,編譯將出

錯。最典型的表達式語句是賦值語旬。

比如:intx;

x=23;

3.2方法調用語句

調用一個類的對象的方法:類名(或對象名).方法名(參數(shù)列表)。

比如:

System,out.printIn("Hello").

如果方法有返回值,還可以把返回值賦值給一個變量。比如:

Strings="Hello”,

intlen:

len=s.length();

3.3控制語句

Java語言的控制語句有2種:條件語句、循環(huán)語句。

條件語句:

條件語句有兩種:if語句和switch語句。

?if語句:

if(條件)

{代碼塊1}

else

{代碼塊2}

如果條件為真,則執(zhí)行代碼塊1,否則執(zhí)行代碼塊2。

else部分是可選的,也就是說,可以沒有else。

如果有else,則與最近的if結合:

?switch語句

switch語句是多分支的開關語句,它的一般格式定義如下:

switch(表達式)

case常量值1:

{代碼塊1}

break;

case常量值2:

{代碼塊2}

break;

default:

{代碼塊}

語句中表達式的值必須是整型或者字符型;常量值1到常量值n必須也是整型或者字符型。

switch語句首先計算表達式的值,如果表達式的值和某個case后面的常量值相同,就執(zhí)行該case里

的若干個語句直到break語句為止。如果沒有一個常量與表達式的值相同,則執(zhí)行default后面的若

干個語句。default是可有可無的,如果它不存在,并且所有的常量值都和表達式的值不相同,那么

switch語句就不會進行任何處理。

需要注意的是,在switch同一個語句中,case后的常量值必須互不相同。

?V7g實用教程

3.3控制語句

Java語言的控制語句有2種:條件語句、循環(huán)語句。

條件語句:

條件語句有兩種:if語句和switch語句。

?if語句:

if(條件)

(代碼塊1}

else

{代碼塊2}

如果條件為真,則執(zhí)行代碼塊1,否則執(zhí)行代碼塊2。

else部分是可選的,也就是說,可以沒有else。

如果有else,則與最近的if結合:

?switch語句

switch語句是多分支的開關語句,它的一般格式定義如下:

switch(表達式)

case常量值1:

{代碼塊1}

break;

case常量值2:

{代碼塊2}

break;

default:

{代碼塊}

語句中表達式的值必須是整型或者字符型;常量值1到常量值n必須也是整型或者字符型。

switch語句首先計算表達式的值,如果表達式的值和某個case后面的常量值相同,就執(zhí)行該case里

的若干個語句直到break語句為止。如果沒有一個常量與表達式的值相同,則執(zhí)行default后面的若

干個語句。default是可有可無的,如果它不存在,并且所有的常量值都和表達式的值不相同,那么

switch語句就不會進行任何處理。

需要注意的是,在switch同一個語句中,case后的常量值必須互不相同。

夕:▼r實用教程

循環(huán)語句:

循環(huán)語句,顧名思義,是反復執(zhí)行的語句。比如,計算100的階乘,1*2*3*...*100,就需要

用到循環(huán)語句,不然,就要寫一百遍乘法。循環(huán)語句需要特別小心,很容易陷入死循環(huán),所以循環(huán)體

的代碼塊里需要有能使循環(huán)結束的語句。Java有三種循環(huán)語句:while語句,do-while語句和for語

句。

?while語句:

while語句的格式是:

while(條件)

(代碼塊}

當條件成立的時候,執(zhí)行代碼塊,再檢查條件,如果還成立,再執(zhí)行代碼塊,……直到條件不

成立。

比如,計算10的階乘:

?do-while語句

do-while語句的格式是:

do{

代碼塊

}while(條件)

do-while語句和while語句的區(qū)別在于:while語句先檢查條件,如果條件不成立,則不進入

循環(huán)體;do-while語句先執(zhí)行循環(huán)體的代碼,再檢查條件,如果條件成立,則在此執(zhí)行循環(huán)體的代碼。

所以,do-while語句至少要執(zhí)行一遍循環(huán)體的代碼塊。

比如,計算10的階乘:

?for語句

for語句是Java語言中用得最多的循環(huán)語句。它的格式如下:

for(表達式1,表達式2,表達式3)

(代碼塊}

其中,表達式1完成變量的初始化,表達式2時布爾類型的表達式,是循環(huán)條件,表達式3是

黨執(zhí)行了一遍循環(huán)之后,修改控制循環(huán)的變量值。

for語句的執(zhí)行過程是這樣的:首先計算表達式1,完成必要的初始化工作;然后判斷表達式

2的值,如果表達式的值為true,則執(zhí)行循環(huán)體;如果為false,則跳出循環(huán)。執(zhí)行完循環(huán)體之后緊

接著計算表達式3,以便改變循環(huán)條件,這樣一輪循環(huán)就結束了。第二輪循環(huán)從計算表達式開始,如

果表達式的值仍為true,則繼續(xù)循環(huán);否則循環(huán)結束,執(zhí)行for語句后面的語句。

比如,計算10的階乘:

?嵌套循環(huán)

經(jīng)??梢杂龅角短籽h(huán)的例子。所謂嵌套循環(huán),是指一個循環(huán)體里還有一個或者更多個循環(huán)。

比如計算10以內(nèi)的階乘之和,或者求50以內(nèi)的素數(shù),就需要用到嵌套循環(huán)。我們以求50以內(nèi)的素數(shù)

為例,說明嵌套循環(huán)的用法;求10以內(nèi)的階乘之和,將留作作業(yè)。

循環(huán)語句里的break語句和continue語句:

在循環(huán)體中,遇到break語句,那么整個循環(huán)語句就結束;如果遇到continue語句,那么本

次循環(huán)就結束,就是說,不再執(zhí)行本次循環(huán)中continue語句后面的語句,而是轉入下一次循環(huán)。

/?實用數(shù)形

3.5變量的作用域

變量是由作用域的。所謂變量的作用域,是指一個變量在什么地方生效??偟膩碚f,變量的作

用域是聲明它的塊。所謂塊,是指用一對花括號包圍起來的任意數(shù)量的Java語句。變量只在聲明它的

塊中有效,在這塊以外,變量是無效的。

然而,不可以在兩個嵌套的塊中聲明兩個完全同名的變量。

注意,在C++中,這是允許的,內(nèi)部定義會掩蓋外部定義。這很容易造成錯誤,所以Java不

允許這樣做。

實用數(shù)程

小結

這一講,我們主要學習了Java的語句,主要是流程控制語句,包括條件語句和循環(huán)語句等。

語句是程序的基本組成部分,是我們進一步學習Java的基礎。希望同學們切實掌握好這部分內(nèi)容,為

我們的進一步學習打下堅實的基礎。

習題

1.編一個計算1!+2!+…+10!的應用程序

I程序計算100以內(nèi)的全部質數(shù)

2.一個數(shù)如果恰好等于它的因子之和,這個數(shù)就稱為“完數(shù)”,編寫一個應用程序,求1000之

內(nèi)的所有完數(shù)。

3.求45和的最大公約數(shù)和最小公倍數(shù)。

第四講數(shù)組和字符串

4.1什么是數(shù)組?為什么要數(shù)組?

除了基本數(shù)據(jù)類型,Java還提供一種導出類型:數(shù)組。數(shù)組是相同類型的數(shù)據(jù)按順序組成的

一種復合數(shù)據(jù)類型,通過數(shù)組名和下標,可以使用數(shù)組中的數(shù)據(jù)。下標從0開始。數(shù)組是所有編程語

言中常用的數(shù)據(jù)結構。

為什么要數(shù)組呢?我們來舉一個例子。假設我們需要表示一個班50個人的數(shù)學成績,要求求

出平均成績。如果沒有數(shù)組,我們需要用前面學過的聲明變量的方法,聲明50個變量,寫50次加法

運算!數(shù)組可以大大地簡化類似的問題!我們只要聲明一個長度為50的整型數(shù)組,結合上一講我們學

過的循環(huán)語句,就可以很方便地解決這個問題!

在以前的編程語言比如C或者C++中,字符串也使用數(shù)組來表示的:字符串是字符數(shù)組!所以

字符串與數(shù)組有著天然的聯(lián)系。但是在Java中,提供了一種更方便的表示字符串的方法:用一個String

類來表示。類是面向對象的語言特有的概念,對于初次接觸面向對象技術的人來說,比較難理解。所

以,這一講,我們將學習表示字符串的String類,也對類的使用有一個粗略的了解,作為下一講詳細

學習類的準備。

需要指出的是,C語言里的其他兩種導出類型:結構體和共用體,在Java里已經(jīng)被取消。

下面,我們來學習數(shù)組和字符串。

4.2數(shù)組的聲明、創(chuàng)建和初始化

1.數(shù)組的聲明:

聲明數(shù)組,包括聲明數(shù)組的名字、數(shù)組包含的元素的數(shù)據(jù)類型。數(shù)組可以一維的,也可以是二

維或者多維的。舉例來說:一個班有50個人,我們用一個長度為50的一維數(shù)組表示;如果要表示每

個同學的五門高考成績,那我們就需要用一個第一維長度為50,第二維長度為5的二維數(shù)組。

聲明一維數(shù)組有兩種格式:

?數(shù)組元素類型數(shù)組名[];

?數(shù)組元素類型[]數(shù)組名;

比如:intstudent[];或者:int[]student;

類似地,聲明二維數(shù)組有兩種格式:

?數(shù)組元素類型數(shù)組名[][];

?數(shù)組元素類型[][]數(shù)組名;

比如:intscore[][];或者:int[][]score;

下面,我們主要以一維數(shù)組為例,學習數(shù)組的用法。

2.數(shù)組的創(chuàng)建:

聲明數(shù)組僅僅給出了數(shù)組名字和元素的數(shù)據(jù)類型,想要真正使用數(shù)組還必須為數(shù)組分配內(nèi)存空

間,也就是創(chuàng)建數(shù)組。在為數(shù)組分配內(nèi)存空間時必須指明數(shù)組的長度。為數(shù)組分配內(nèi)存空間的格式如

下:

?數(shù)組名=new數(shù)組元素的類型[數(shù)組的長度]

例如:student=newint[50];

score二newint[50][4];

事實上,數(shù)組的聲明和創(chuàng)建可以一起完成,比如:

intstudent[]=newint[50];

一旦數(shù)組被創(chuàng)建,數(shù)組的大小就不能改變。如果在程序運行期間,需要對數(shù)組的大小進行擴展,

通常需要使用另一種數(shù)據(jù)對象:Vectoro有關向量和擴展數(shù)組,有興趣的同學可以在Java幫助中查找

Vector的幫助。

student數(shù)組創(chuàng)建之后,其內(nèi)存模式如圖:

Student-01

StudentF11

StudentF21

StudentF3]

Student[49]

3.數(shù)組的初始化:

創(chuàng)建數(shù)組后,系統(tǒng)會給每個元素一個默認的值,比如,整型數(shù)組的默認值是0。

我們也可以在聲明數(shù)組的同時給數(shù)組一個初始值,我們稱之為初始化。

intnum[]={2,4,4,1)。

這個初始化動作相當于:

intnum[]=newint[4];

num[0]=2;num[1]=5;num[2]=4;num[3]=1;

實用數(shù)程

4.3數(shù)組的使用

1.數(shù)組的訪問

前面我們已經(jīng)看到,數(shù)組通過下標訪問數(shù)組元素,比如:student[0]=70,student[49]=87

等。注意,下標從0開始,如果數(shù)組長度為n,則下標是0~n-1,如果使用n或者以上的元素,將

會發(fā)生數(shù)組溢出異常。比如:student[50]79,雖然編譯的時候能通過,程序運行時將中止。

二維數(shù)組的使用與之類似。

2.數(shù)組的復制

可以把一個數(shù)組變量復制給另一個,但兩個變量引用的都會是同一個內(nèi)存空間,所以改變一個

數(shù)組的值,另一個數(shù)組變量的值也會改變。

比如:

intnum[]={2,3,5,1};

intnumcopy[]=num;

numcopy[2]=5;

現(xiàn)在,num[2]也變成了5。

如果真的想把一個數(shù)組的所有值都復制到另一個數(shù)組中,就需要采用System.arrarycopyO

方法:System.arrarycopy(num,0,numcopy,0,4)。這樣,num和numcopy將指向不同的內(nèi)存

空間,numcopy的值的改變,不會在影響num。有興趣的同學可以參考幫助文件。

4.4字符串

前面已經(jīng)說過:Java使用java,lang包中的String類來表示字符串,盡管我們可以用字符數(shù)

組來實現(xiàn)類似的功能。關于類的詳細知識,我們下一講將會講到。由于類是面向對象編程語言最核心

的概念,學習起來有些難度,我們在這里先通過String類對類的概念有一個粗略的了解,以使我們下

面的學習更順利一些。

字符串,顧名思義,就是一串字符。比如:"studentlOO","China〃等。用一對雙引號表示字

符串。我們也可以把字符串看成字符數(shù)組(事實上,C就是把字符串當作字符數(shù)組來處理),但是把

它視為類更方便一些。為什么?我們下面馬上會看到。

?字符串的聲明、創(chuàng)建

字符串聲明的格式是:String字符串名

比如:Strings;

字符串的創(chuàng)建格式:字符串名=newString(字符串常量)或者字符串名二字符串常量

比如:s=newString("student");或者:s="student”;

聲明和創(chuàng)建可以一步完成,比如:Strings=newString("student");或者Strings=

“student”;

大家是不是覺得:String這個類的聲明,跟前面我們學過的基本數(shù)據(jù)類型的聲明的格式是一

樣的,比如:整型的聲明:intn;比較一下:Strings;

事實上,

類型變量名

這種格式是類的聲明的一般格式,你可以把類當作基本數(shù)據(jù)類型一樣來聲明。

另一方面,

變量名二new類名(參數(shù)列表);比如s=newString("student");

這是類的一般創(chuàng)建格式。

4.5與字符串有關的操作

?字符串的長度

length。方法:

Strings="student”;

intlen=s.length();

需要指出的是,s.length。這種調用方法,是面向對象編程語言特有的方法,我們把s叫做

String類的對象,就像intn,我們把n叫做整型變量一樣;把length。叫做String類的方法。下

面我們可以看到,String類的方法,都是通過對象名.方法名()這種方式調用的。

?取子串

Strings="IamaChinese”;

Stringsubs;

subs=s.substring(7);

?字符串的比較

Stringtom=〃mynameislom〃;

Stringjane=〃mynameisjane〃;

tom.equals(jane);返回false。表示不相等

pareTo(jane),返回一個負整數(shù),因為第一個不相等的字符t和j相比,t在

j的后面;如果返回0,表示相等;如果返回一個正整數(shù),表示tom和jane第一個不

相等的字符,tom的在jane的前面。

注意,不要用tonrjane判斷兩個字符串是否相等,因為這樣的話比較的是它們在內(nèi)存中的

地址是否相同,而不是我們所希望的比較字符串的內(nèi)容是否相同。

?字符串連接

Strings二〃Iam〃;

Strings2=〃aChinese”;

Strings4,s4;

s4=s+s2;

s4=s+24;

整數(shù)型24將會自動轉換為字符串。

?字符串檢索

字符串檢索是指判斷一個字符串是否包含某一個字符或者子字符串,如果有,返回它的位置,

如果沒有,返回一個負數(shù)。

Strings=〃IamaChinese”;

s.indexOf(,zChinese*),返回7;

s.indexOf('a');返回2;

?字符串轉換為數(shù)值

如果一個字符串是一串數(shù)字,可以把它轉換成相應的數(shù)值。

o轉換為整型:

Strings=〃21〃;

intx;x=Integer,parselnt(s);

o轉換為浮點型

Strings="22.124";

floatf;f=Float.valueOf(s).floatValue();

當然,也可以把整數(shù)或者浮點數(shù)轉換為字符串類型:

Strings;

intn=24;

s=String.valueOf(n);

o其他

與字符串有關的方法還有很多,我們不可能一一講解。前面我們說過,我們要學會使用幫助。

我們查找關于String的幫助,就可以看到,有關于String的所有方法的詳細講解。希望同學們可以

學會使用幫助。

小結

這一講,我們學習了數(shù)組的一些知識,并通過String類,一方面學習了字符串的使用,另一

方面先對類的一些概念和用法,比如類的方法調用,有了一些粗略的了解。

數(shù)組是我們經(jīng)常要用到的數(shù)據(jù)結構,它是一種導出型的數(shù)據(jù)結構,對我們處理大規(guī)模的數(shù)據(jù),

有很大幫助。

前面我們說,用String類表示字符串,比我們自己用字符數(shù)組來做更方便。因為String類為

我們提供了很多現(xiàn)成的可以直接使用的對字符串的操作方法。比如substring(),equals()等方法。

如果我們要用字符數(shù)組來完成與substring類似的功能,就只能自己把子串的每一個字符復制到另外

一個字符數(shù)組中;與equals。類似的功能,就只能自己一個一個字符地檢查兩個字符船是否相等。提

供對自己的成員數(shù)據(jù)的完整的操作方法,也就是把數(shù)據(jù)和對數(shù)據(jù)的操作封裝起來,是類的最大的好處。

如果現(xiàn)在還不能理解這句話,不要緊,我們現(xiàn)在只需要知道:使用String類這種方法,非常方便。

習題

1.聲明一個數(shù)組,存一個學生的五門成績。求該學生總成績、平均成績。

2.將一個數(shù)組中的值按逆序重新存放,例如,原來順序為:9,5,7,4,8,要求改為:8,4,7,

5,9?

3.編寫一個應用程序,連接兩個字符串:“1am”和“astudent”,并求出第7個字符是什么?

找出“am”在該字符串中的位置,最后把所有字符都變成大寫字符。

4.統(tǒng)計一個字符串中字母、空格和數(shù)字的個數(shù)。

第五講:類、對象和接口(1)

5.1什么是類

上一講我們使用了一個String類,我們說過:類把一類對象的成員函數(shù)和方法封裝起來,使

用起來很方便。那么,什么是類呢?要理解類,我們先來了解"對象”的概念,因為類就是用來創(chuàng)建對

象的模板,它包含了被創(chuàng)建的對象的狀態(tài)描述和方法定義。

我們可以把長虹牌電視機看成是一個對象。我們不必關心電視機里面的集成甩路是怎樣的,也

不用關心電視機的顯像管的工作原理,我們只需要知道電視機的遙控器上提供了對這臺電視機的什么

操作,比如選臺、調節(jié)色彩、聲音等。這樣,我們雖然不知道電視機內(nèi)部是怎么工作的,但我們可以

使用這臺電視機。聽起來這跟編程沒什么關系,但面向對象的思想正是與它類似:對象,對外只提供

操作該對象的方法,內(nèi)部的實現(xiàn)對外是隱藏的。我們把這種技術叫做數(shù)據(jù)隱藏。這樣,程序員不必了

解一個對象內(nèi)部是怎么實現(xiàn)的,但可以很方便地使用這個對象。

類,就是對象的模板。比如,電視機是一個類,而某一臺電視機就是這個類的一個對象,也叫

一個實例。

我們前面使用的String類,雖然我們不知道,也不必知道里面的實現(xiàn)細節(jié),但我們只要知道

他的操作方法,就可以很方便地使用它。這樣,對別的程序員編寫的程序,我們可以很方便地拿來使

用,從而提高軟件的復用程度和編程的效率。

比如,我們構造一個類:TV,然后對外提供一些對它的操作方法,選臺selectChannel()等。

然后用這個類創(chuàng)建一個對象:TVkongKai;然后就可以這樣操作這臺電視:kongKai.selectChannel?

類的另一個特性,也是它的一個大好處,是繼承。繼承的概念類似于這樣一種表達:電視是一

種電器。如果我們有一個電器類,那么,我們說,電視機類繼承了電器類。繼承有什么好處呢?設想

電器類有一些屬性,比如工作電壓,功率,有些一些方法,比如:打開open(),關閉:close()。

這時候,如果電視類繼承了電器類,電視類就自動擁有了電器類的這些屬性和方法,而不用再自己重

寫一遍(當然,如果想重寫,也可以,我們把這種技術叫做重載)。這樣做有什么好處呢?最明顯的

好處就是減輕編程的工作量。假設我們有令一個類:VCD類,它也繼承了電器類,對于打開關閉等,

同樣不用重新編寫。

好了,既然面向對象的方法有這么多好處,我們下面就來學習類和對象的一些基本知識。

5.2一個例子

下面是一個完整的類的例子,我們用這個例子詳細講解類的一些用法。

classEmployee

(

privateStringname;

privatedoublesalary;

privateinthireYear;

privatestaticStringcompany二newString;

publicEmployee(Stringn,doubles,intd)

{name=n;

salary=s;

hireYear=d;

)

publicvoidprint()

{System,out.println(name+〃〃+salary+〃〃+getHireYear()+

getCompany());

return;

}

publicvoidraiseSalary(doublebyPercent)

{salary*=1+byPercent/100;

)

publicvoidraiseSalary(intbyAbsolute)

{salary+二byAbsolute;

}

publicintgetHireYear()

{returnhireYear;

)

publicstaticStringgetCompany()

(

returncompany;

)

)

為了測試這個類,我們寫了一個測試程序:

packageteach4;

pub1icclassEmployeeTest

{publicstaticvoidmain(String[]args)

{Employeeemp=newEmployee("TonyTester”,38000,1990);

emp.print();

emp.raiseSalary(5.0D);

emp.print();

intraise=1000;

emp.raiseSalary(raise);

emp.print();

)

)

5.3類的結構

classEmployee{)表示一個類的聲明,其中,class是關鍵字,Employee是類名。在一對

大括號中的內(nèi)容,我們叫做類體,是這個類的實現(xiàn)部分。

前面我們說過,類把數(shù)據(jù)和在數(shù)據(jù)上的操作方法封裝起來,所以,類體中有兩部分,一部分是

數(shù)據(jù),另一部分是方法。

數(shù)據(jù)部分是:

privateStringname;

privatedoublesalary;

privateinthireDay;

分別是Siring類型的name,代表該員工的姓名,double類型的salary,代表該員工的薪水;

int類型的hireDay,代表該員工的雇傭年份。

private是一個關鍵字,是私有的意思,表明這些數(shù)據(jù),只能被類里面的方法訪問,外部程序

是不能直接訪問這些數(shù)據(jù)的。這正是類的一個好處:對外隱臧數(shù)據(jù)。我們建議,始終保持數(shù)據(jù)的私用,

也就是始終用private來修飾數(shù)據(jù),來是我們的程序更安全。

這個類的方法部分是:

publicEmployee(Stringn,doubles,Dayd)

publicvoidprint.()

publicvoidraiseSalary(doublebyPercent)

publicvoidraiseSalary(intbyAbsolute)

publicintgetHireYear()

publicstaticStringgetCompany0

所謂方法,就是對數(shù)據(jù)的操作,有過C編程時間的同學,可以把它理解為函數(shù),只是這些函數(shù)

是放在類里并對類的數(shù)據(jù)進行操作的。比如這個方法:

publicvoidraiseSalary(doublebyPercent)就是對數(shù)據(jù)salary的操作。

public是一個關鍵字,是公有的意思,表明該方法可以用對象名.方法名的方式調用。比如

我們的測試程序中:emp.raiseSalary(5.OD),就是對這個方法的調用。否則,如果是private,該方

法就只能被類里的方法調用,像emp.raiseSalary(5.0D)這種調用是非法的。

void表明方法的返回類型為空,也就是什么都不返回。publicintgetHireYear()這個方法

的返回類型是int,一般來說,返回類型這部分是不能缺少的,即使方法什么都不返回,也要用一個

void關鍵字修飾。有一個例外:構造函數(shù)。我們后面會講到。

raiseSalary(doublebyPercent)是方法名,前面我們已經(jīng)說過方法的命名規(guī)則,第一個單詞

小寫,以后沒個單詞首字母大寫。這樣可以增加可讀性,根據(jù)raiseSalary這個名字就可以知道這個

方法的功能是漲工資。括號里是參數(shù)列表,類似于我們前面學過的變量的聲明。如果有多個參數(shù),用

逗號隔開,比如Employee(Stringn,doubles,intd)。

方法的一對大括號里是方法的實現(xiàn),就是我們前面學過的語句的組合。比如print()方法,

是打印出該員工的姓名工資等信息;raiseSalary()方法是根據(jù)參數(shù),把員工工資漲相應的比例。注

意,如果方法有返回類型且不為void,那么在方法的實現(xiàn)中必須有return語句,返回相應的類型。

比如hireYear()方法,就有return子句。相反,如果返回類型是void,那么不能返回任何數(shù)據(jù),但

可以是一個return語句,后面不帶返回值,比如print()方法里就有一個空的return語句。

5.4構造方法

我們注意到,有一個方法是與類名同名的,而且沒有返回類型,比如這個例子中的public

Employee(Stringn,doubles,intd),我們把它叫做構造方法。構造方法是做什么用的呢?構造方

法是在聲明對象的時候,自動調用的方法,其作用是為對象的數(shù)據(jù)做一些必要的初始化工作。比如,

這里的publicEmployee(Stringn,doubles,intd)方法,就是初始化這個員工的姓名,工資和雇

傭年份。在聲明emp對象的時候,調用的就是構造函數(shù)。

Employeeemp=newEmployee("Tony”,10000,1990);

如果沒有定義構造函數(shù),Java會自動提供一個默認的構造函數(shù),把所有成員數(shù)據(jù)初始化為默

認值,比如數(shù)字類型(包括整型、浮點型)將是0,布爾類型將是false等。注意在沒有構造方法時,

new后面的()中不能有數(shù)字!!

需要注意的是,與構造函數(shù)相對的是析構函數(shù),目的是在對象不再使用的時候回收對象使用的

內(nèi)存。C++里就支持析構函數(shù)。但是,由于Java提供自動回收"垃圾''的機制,所以不需要進行內(nèi)存回

收,所以Java沒有析構函數(shù)。

實用數(shù)程

5.5方法的重載

方法的名字相同但參數(shù)的類型或個數(shù)不同,我們叫做方法的重載。

類允許有相同名字的方法,比如我們這個例子中的raiseSalary方法。

publicvoidraiseSalary(doublebyPercent)

publicvoidraiseSalary(intbyAbsolute)

第一個的參數(shù)是double型,表明工資上漲的百分比;第二個的參數(shù)使int型,表明工資上漲

的數(shù)額。這兩個方法參數(shù)不同。調用的時候,根據(jù)參數(shù)的不同,決定使用哪一個方法。比如,我們的

例子中,emp.raiseSalary(5.0D)的參數(shù)是double型,所以將會調用第一個,工資上漲5%,

emp.raiseSalary(raise)的參數(shù)raise是一個int型,所以將會調用第二個,是工資上漲1000元。

方法的重載的好處是使我們的程序處理更方便。比如I,我們的例子中,漲工資,我們提供了統(tǒng)

一的raiseSalary()方法,我們不用自己判斷漲的是百分比還是絕對數(shù)額,由程序自己判斷,是程

序更好用,可讀性更強。

5.6靜態(tài)方法和靜態(tài)成員變量

所謂靜態(tài)方法和靜態(tài)成員變量,是指那些用static關鍵字修飾的方法或者變量,比如我們例

子中的privatestaticStringcompany就是一個靜態(tài)成員變量,而publicstaticString

getCompanyO和publicstaticvoidsetCompany(Strings)都是靜態(tài)方法。

靜態(tài)的意思,是指該方法或者變量在整個類中只有一份。我們說,類是用來創(chuàng)建對象的模板,

就是說,我們創(chuàng)建對象的時候,每個對象都會有類中所聲明的成員變量的一個副本。但是,對于靜態(tài)

成員變量,在內(nèi)存中只有一個副本,所有的對象將共享這個副本。比如我們的例子中,所有Employee

所在的公司就只有一個,所以我們沒有必要為每一個Employee的對象都保留一個company的副本,所

以我們把它聲明為靜態(tài)的成員變量。比如我們例子中有兩個Employee類的對象:emp和emp2,他們的

成員變量內(nèi)存模式如下圖所示:

所以,只要改變了company的值,對所有Employee的對象都是起作用的。

另一方面,靜態(tài)方法只能訪問靜態(tài)成員變量,比如我們的例子中,setCompany()只能訪問

company,如果它訪問name之類的變量,編譯器將會報錯。而且靜態(tài)方法的調用是類名.方法名的方

式來調用的,也可以用一般的對象名.方法名的方式來調用。

實際上,我們先前用的System.out.println()方法,就是一個靜態(tài)的方法,所以我們可以直

接用類名.方法名的方式調用。而一個類里如果有main函數(shù)都要聲明為靜態(tài)方法,因為一個程序只

能有一個main函數(shù)入口。

小結

這一講我們學習了類和對象的一些基本概念和知識,包括類的結構,構造方法,方法的重載,

靜態(tài)方法和靜態(tài)成員變量。類和對象,是面向對象編程語言的最重要的特征,也是精髓所在。希望大

家努力掌握好這部分知識。下一講,我們繼續(xù)學習Java的繼承、接口等概念。

習題

1.類的成員變量和局部變量有什么區(qū)別?從內(nèi)存考慮。

2.編個程序檢驗一下public方法和private方法有什么區(qū)別。

3.編一個程序檢驗靜態(tài)方法和靜態(tài)成員變量的用法。

4.在我們的例子中再重載raiseSalary。方法,按工齡漲工資,比如,如果工齡為5年,那么增

長1%*5;

V;r實用教程

第六講類、對象和接口(2)

6.1類的繼承

繼承是類的另一個特性。繼承的意義在于:我們重復使用或更改現(xiàn)成的類的方法,也可以加入

新的數(shù)據(jù)成員以及新的方法,以滿足新環(huán)境的需要。這種技術是所有面向對象的編程語言的一個基本

特征。

讓我們來看一個例子:前面我們定義了一個Employee類,這只是普通員工,現(xiàn)在我們要定義

一個經(jīng)理類。經(jīng)理也是員工的一種,所以Employee類中的數(shù)據(jù)和方法他也應該有;但經(jīng)理又不同于普

通員工,經(jīng)理有秘書,而且漲工資的時候還要加上分紅。怎么辦?我們要不要從頭開始寫一個經(jīng)理類?

有了繼承的技術,我們可以在Employee類的基礎上,編寫我們的Manager類。程序如下:

packageteach4;

importjava.util.Date;

classManagerextendsEmployee

(

privateStringsecretaryName;

publicManager(Stringn,doubles,intd)

{super(n,s,d);必須在構造方法的第一個語句。

secretaryName="〃;

)

publicvoidraiseSalary(doublebyPercent)

{//add1/2%bonusforeveryyearofservice

Datetoday=newDate(2001,1,1);

doublebonus=0.5*(today.getYear()-getHireYear());

super.raiseSalary(byPercent+bonus);

)

publicvoidsetSecretaryName(Stringn)

{secretaryName=n;

)

publicStringgetSecretaryName()

{returnsecretaryName;

}

我們以這個例子為例,學習繼承的用法。

首先,請注意這個類的頭部有些不同:classManagerextendsEmployee;其中,關鍵字extends

是擴展的意思,表明Manager類是從Employee類繼承而來。我們把Employee叫做父類或者超類,把

Manager叫做子類或者衍生類。一般來說,子類比父類有更多的功能。

Manager的構造方法中有個語句:super(n,s,d),super是一個關鍵字,意思是調用父類的

方法,在這里是父類,也就是Employee的構造方法;類似地,super.raiseSalary(byPercent+bonus)

表示調用父類Employee的raiseSalary方法。所以,如果要在子類中調用父類的方法,使用super。

Manage的構造方法調用了Employee的構造方法。事實上,一般要求子類用super語句調用父類的構

造方法并附上恰當?shù)膮?shù)。如果沒有用super調用,將默認地調用父類的默認構造方法,這時,如果

父類沒有沒有默認的構造方法,編譯器將報錯。在子類的構造方法中,如果有super語句,要求super

語句在第一行。

子類自動擁有父類的標志為public的成員變量和方法,比如:雖然我們在Manager類中沒有

定義print()方法,但是boss,print。是合法的,因為print()是Employee類的■—個方法。如果希

望改變父類中的方法,使之適合子類,我們也可以覆蓋它。比如,因為經(jīng)理的提薪方式是:除了上漲

百分比,還要加上工齡*0.5的獎金,與普通員工的提薪方式就有不同。所以,我們要覆蓋掉這個方法。

實際上,只要重寫這個方法就可以了。boss.raiseSalary(1.0),將自動調用Manager類里定義的

raiseSalary()方法,而不是Employeee里的方法。

但是,如果是私有的成員變量或者方法,也就是用private關鍵字修飾的那些,那么子類是不

能訪問的。如果希望子類能訪問而別的類不能訪問,我們可以用protected關鍵字,比如:protected

Stringname;這樣,name對于Manager來說是可以可見和可訪問的,而對于不是Employee的子類的

其他類,則是不能訪問的。

總結一下訪問權限關鍵字:

?public:對全世界來說都是可見的;

?private:僅對類來說是可見的;

?protected:對所有子類和同一個包(package)來說是可見的;

?不聲明:如果這三個關鍵字都沒有,那么默認為對整個包可見。

Manager類里定義的setSecretaryName()和getSecretaryNameO方法,都只能為Manager類

的對象調用,Employee類的對象是不能調用這兩個方法的。

繼承可以是幾層的。比如,我們可以以Manager為父類,再衍生出Executive類來。我們也可

以從Employee類衍生出Programmer類來,它與Manager類沒有什么關系。如果希望防止別人從自己

編寫的一個類中衍生出另一個類,可以加上關鍵字final,比如,不希望從Manager類中再衍生出別

的類,我們可以把Manager類的聲明改為:finalclassManagerextendsEmployee。這樣可以提高

程序的安全性,但可擴展性會受到影響。

我們可以畫出類的繼承結構如下:

6.2造型

也叫強制類型轉換。回憶一下,我們在第二講的Java的基本語法中,說到基本數(shù)據(jù)類型的強

制類型轉換,可以把一個浮點數(shù)強制轉換為整型,比如:doublex=3.14;intnx=(int)x;這樣,x=3,

把小數(shù)部分丟掉了。我們同樣可以把類強制轉換為另一個類。但不是什么時候都可以轉換的,只有在

繼承結構圖內(nèi)部,才能進行強制類型轉換。

比如:Managerboss;Employeeemp;下面這個語句:emp=boss,相當于emp=(Employee)boss;

因為emp是Employee類型的,而boss是Manager類型的,但是,這時候,emp將不能調用Manager

類的方法,比如getSecretaryNameO,如果要調用,必須把emp轉換回來。比如:Managermanager;

manager=(Manager)emp;這樣,manager就可以調用get$ecretaryName()了。只允許子類轉換成父類

的調用父類的方法不允許調過來。

但是,如果一個對象確實是Employee類型,現(xiàn)在要把它轉換為Manager類型而且試圖訪問

Manager的方法,編譯將會通過,但是運行時將會出現(xiàn)異常,程序將中止運行。

6.3接口

前面我們介紹Java的特點的時候說過,Java不允許多重繼承,即一個類不允許有多個父類,

至多只能有一個父類。在

溫馨提示

  • 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. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論