java基礎(chǔ)知識(shí)大全必看經(jīng)典_第1頁(yè)
java基礎(chǔ)知識(shí)大全必看經(jīng)典_第2頁(yè)
java基礎(chǔ)知識(shí)大全必看經(jīng)典_第3頁(yè)
java基礎(chǔ)知識(shí)大全必看經(jīng)典_第4頁(yè)
java基礎(chǔ)知識(shí)大全必看經(jīng)典_第5頁(yè)
已閱讀5頁(yè),還剩50頁(yè)未讀 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(quán)說(shuō)明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)

文檔簡(jiǎn)介

第一講Java語(yǔ)言入門

1.1Java的特點(diǎn)

1.1.1面對(duì)對(duì)象:

?與C++相比,JAVA是純的面對(duì)對(duì)象的語(yǔ)言

C++為了向下兼容C,保留了許多C里面的特性,而C,眾所周知是面對(duì)

過(guò)程的語(yǔ)言,這就使C++成為一個(gè)“混血兒"。而JAVA語(yǔ)法中取消了C++里

為兼容C所保留的特性,如取消了頭文件、指針?biāo)惴?、結(jié)構(gòu)、單元等。

L1.2可移植(平臺(tái)無(wú)關(guān)性):

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

與其他編程語(yǔ)言不同,Java并不生成可執(zhí)行文件(.exe文件),而是生成

一種中間字節(jié)碼文件(.class文件)。任何操作系統(tǒng),只要裝有Java虛擬機(jī)

(JVM),就可以說(shuō)明并執(zhí)行這個(gè)中間字節(jié)碼文件。這正是Java實(shí)現(xiàn)可移植

的機(jī)制。

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

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

位,而C++里整型是依靠于目標(biāo)機(jī)器的,對(duì)16位處理器(比如8086),整

數(shù)用兩個(gè)字節(jié)表示;在像SunSPARC這樣的32位處理器中,整數(shù)用4個(gè)字

節(jié)表示。在IntelPentium處理器上,整數(shù)類型由詳細(xì)的操作系統(tǒng)確定:對(duì)于

DOS和Win32來(lái)說(shuō),整數(shù)是2個(gè)字節(jié);對(duì)于Windows9x、NT和2000,

整數(shù)是4個(gè)字節(jié)。當(dāng)然,使整數(shù)類型平臺(tái)無(wú)關(guān)之后,性能必定有所下降,但就

Java來(lái)說(shuō),這個(gè)代價(jià)是值得的。Java的字符串,則接受標(biāo)準(zhǔn)的Unicode格

式保存??梢哉f(shuō),沒有這個(gè)特性,Java的可移植性也不行能實(shí)現(xiàn)。

LL3簡(jiǎn)潔

?JAVA在語(yǔ)法上與C++類似

JAVA的語(yǔ)法與C++很接近,有過(guò)C或者C++編程閱歷的程序員很簡(jiǎn)潔

就可以學(xué)會(huì)JAVA語(yǔ)法;

?取消了C++的一些困難而低效的特性比如:用接口技術(shù)代替了C++的多

重繼承。C++中,一個(gè)類允許有多個(gè)超類,這個(gè)特性叫做"多重繼承",

多重繼承使得編譯器特殊困難且效率不高;JAVA的類只允許有一個(gè)超

類,而用接口(Interface)技術(shù)實(shí)現(xiàn)與C++的多繼承相類似的功能

其它被取消的特性包括:虛擬基礎(chǔ)類、運(yùn)算符過(guò)載等

?JAVA的基本說(shuō)明器和類支持模塊或許僅40K

即使加入基本的標(biāo)準(zhǔn)庫(kù)和支持線程的模塊,也才220K左右。與GUI(圖

形用戶界面)相比,明顯小許多

1.1.4健壯

?取消了指針?biāo)惴?/p>

C的最關(guān)鍵的一個(gè)特性是它的強(qiáng)大指針?biāo)惴?,比如可以用指針訪問(wèn)字符串、

數(shù)組甚至文件,很簡(jiǎn)潔產(chǎn)生指針溢出,意外地改寫內(nèi)存和損毀數(shù)據(jù)。JAVA里

有一個(gè)指針模型,對(duì)于一般的任務(wù),如訪問(wèn)字符串、數(shù)組,根本不用指針,而

一旦須要,比如訪問(wèn)對(duì)象、文件時(shí),也可以獲得指針的強(qiáng)大實(shí)力,但JAVA同

時(shí)有高度的指針平安保障,用戶恒久不行能訪問(wèn)一個(gè)壞掉的指針、不行能造成

內(nèi)存支配錯(cuò)誤,也用不著特地提防可能出現(xiàn)的內(nèi)存漏洞。

1.1.5多線程

?強(qiáng)大的多線程實(shí)力

多線程可以使程序有更好的交互性和實(shí)時(shí)性,并可以最大限度地利用多處理

器系統(tǒng)。JAVA有著強(qiáng)大的多線程處理實(shí)力,因?yàn)楦髦髁鞑僮飨到y(tǒng)平臺(tái)在線程

的實(shí)施方面有重大的差異,所以JAVA為不同的操作系統(tǒng)實(shí)現(xiàn)了特地的多線程

機(jī)制。在這點(diǎn)上來(lái)說(shuō),JAVA沒有做到平臺(tái)無(wú)關(guān)。

力”實(shí)用教程

a

1.2Java簡(jiǎn)史

?首次亮相一1995年5月

Java技術(shù)起先是作為小型的計(jì)算機(jī)語(yǔ)言,用于消費(fèi)類設(shè)備,比如有線電視

交換盒等。因?yàn)檫@些設(shè)備的功能和內(nèi)存均不足以運(yùn)行大程序,所以程序要盡可

能小;另外,由于不同的廠商可能選用不同的CPU,所以要求這種語(yǔ)言不能受

限于任何一種獨(dú)立的體系結(jié)構(gòu)。1995年5月23日召開的SunWorld'95大

會(huì)上,一種全新的閱讀器(今日的HotJava的前身)亮相,標(biāo)記著Java的誕

生。

?起先流行一1996年1月

那時(shí)網(wǎng)景公司確定在Netscape2.0加入對(duì)Java的支持,Netscape2.0在

1996年1月發(fā)布,從這一版本起先,全部Netscape閱讀器均支持Java。注

冊(cè)了Java運(yùn)用許可證的還有IBM、Symantec、Inprise和其他許多公司。

就連微軟,也加入了這一行列(盡管他們支持的Java和標(biāo)準(zhǔn)的Java稍有不

同)。

?SUN的第一個(gè)JAVA版本一1996年初

Sun公司于1996年初發(fā)布了Java1.02,缺憾的是,Java1.02還未擺脫

其小型語(yǔ)言的影子,只適合用來(lái)做諸如網(wǎng)頁(yè)上一個(gè)隨機(jī)移動(dòng)的文字之類的工

作,并不適合用來(lái)做正規(guī)的程序開發(fā)。Javal.02作為一種正規(guī)的編程語(yǔ)言,

可以說(shuō),準(zhǔn)備得很不充分。

?成熟—1998年

1998年12月,Javal.2問(wèn)世了。它是一個(gè)功能全面的、具有高度擴(kuò)展實(shí)

力的新版本。3天后,Javal.2被改進(jìn)成Java2,向"一次編寫,到處運(yùn)行”的

目標(biāo)前進(jìn)了一大步。

?現(xiàn)狀

現(xiàn)在最新的Java版本是JDK1.4,它是一個(gè)測(cè)試版,穩(wěn)定的正式版是

JDK1.3。用戶可以到免費(fèi)下載。微軟在它的最新閱讀器IE6.0中不再支持

Java,為Java的發(fā)展帶來(lái)陰影。

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

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

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

可以干脆編寫Java程序然后用JDK的叮囑編譯和運(yùn)行,為了調(diào)試便利,也為

了初學(xué)者簡(jiǎn)潔上手,本教程課件將運(yùn)用一個(gè)叫JPadPro的Java編寫工具來(lái)調(diào)

用JDK的工具。用戶可以到下載這個(gè)工具。

1.3.2JDK的安裝

1.3.3安裝運(yùn)行之后,應(yīng)當(dāng)首先設(shè)置JDK工具包所在的路徑。

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

OKo

1.3.4新建一個(gè)project

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

1.4兩個(gè)簡(jiǎn)潔的程序示例

1.4.1Java應(yīng)用程序:Hello.java

?編寫

新建一個(gè).java文件。File->new->javafile->輸入一個(gè)名字:Hello->

點(diǎn)creatfile.出現(xiàn)了一個(gè)空的java文件。

?編譯

JDK-〉compileHello.java或者點(diǎn)擊如演示所示的按鈕。事實(shí)上是執(zhí)行

JDK工具包里的javac.exe叮囑,與javac

G:\java2jiaocheng\example\teach1\Hello.java是等價(jià)的。便已完成之后

在同一個(gè)文件夾就會(huì)有一個(gè)同名的.class文件。

?看編譯結(jié)果,改錯(cuò)

錯(cuò)誤舉例:少寫一個(gè)分號(hào);錄入錯(cuò)誤;

?運(yùn)行

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

或者點(diǎn)擊如演示所示的按鈕。

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

?看運(yùn)行結(jié)果

1.4.2JavaApplet:StarterApplet.java

新建一個(gè)JavaApplet文件。File->new->javaApplet-)輸入一個(gè)名字:

StarterApplet->出現(xiàn)了一個(gè)空的java文件和一個(gè)Html文件。

?編譯

JDK-〉compileStarterApplet.java或者點(diǎn)擊如演示所示的按鈕。事實(shí)

上是執(zhí)行JDK工具包里的javac.exe叮囑,與javac

G:\java2jiaocheng\example\teach1\StarterApplet.java是等價(jià)的。

留意不要隱藏文件的擴(kuò)展名,否則給編譯時(shí)帶來(lái)麻煩!可以在工

工具/文件夾先項(xiàng)/查看/中修改??!

?看編譯結(jié)果,改錯(cuò)

?運(yùn)行

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

或者點(diǎn)擊如演示所示的按鈕

或者干脆雙擊Html文件。

?看運(yùn)行結(jié)果

1.5假如獲得幫助

1.5.1下載幫助

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

,下載下來(lái)時(shí)候,雙擊安裝。

1.5.2運(yùn)用幫助

敲入想查找的關(guān)鍵字,按回車。

乃??實(shí)用教程

1.6編程的一些約定

留意:在一個(gè)原文件中只能有一個(gè)public類!且文件名與public類同

名!

1.6.1命名規(guī)則

類名與文件名應(yīng)當(dāng)一樣,否則編譯出錯(cuò)。比如,classHello的文件名應(yīng)當(dāng)

是Hello.java

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

StarterApplet.javao

變量名用第一個(gè)單詞用小寫字母,其次個(gè)以后的單詞首字母大寫。比如:int

myAge;

方法的名字第一個(gè)單詞用小寫字母,其次個(gè)以后的單詞首字母大寫,比如:

getMyAge();

1.6.2注釋

*

*Hereisablockcomment.

7

表示完整的一段注釋;

if(condition){

/*Handlethecondition.*/

}

表示注釋該行以下部分

if(a==2){

returnTRUE;/*specialcase*/

}else{

returnisPrime(a);//worksonlyforodda

注釋一行

1.6.3分行

假如一行太長(zhǎng)須要換行。比如:

someMethod(longExpression1,longExpression2,

longExpression3,

longExpression4,longExpression5);

var=someMethod1(longExpression1,

someMethod2(longExpression2,

longExpression3));

var=someMethod1(longExpression1,someMethod2

(longExpression2,

longExpression3));

講演支配

第三講語(yǔ)句

Java的語(yǔ)句可以分為以下4種:

?表達(dá)式語(yǔ)句

?方法調(diào)用語(yǔ)句

?限制語(yǔ)句

乃丁”實(shí)用藪程q

3.1表達(dá)式語(yǔ)句

一個(gè)表達(dá)式加上一個(gè)分號(hào)就構(gòu)成了一個(gè)語(yǔ)句。分號(hào)表示一個(gè)語(yǔ)句的結(jié)束,缺

少分號(hào),編譯將出錯(cuò)。最典型的表達(dá)式語(yǔ)句是賦值語(yǔ)句。

比如:intx;

x=23;

?1?紇?實(shí)用教程

3.2方法調(diào)用語(yǔ)句

調(diào)用一個(gè)類的對(duì)象的方法:類名(或?qū)ο竺??方法名(參數(shù)列表)。

比如:

System.out.println("Hello").

假如方法有返回值,還可以把返回值賦值給一個(gè)變量。比如:

Strings="Hello",

intlen;

len=s.length();

乃n號(hào)實(shí)廂數(shù)程.

3.3限制語(yǔ)句

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

條件語(yǔ)句:

條件語(yǔ)句有兩種:if語(yǔ)句和switch語(yǔ)句。

?if語(yǔ)句:

if(條件)

{代碼塊1}

else

{代碼塊2}

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

else部分是可選的,也就是說(shuō),可以沒有else。

假如有else,則與最近的if結(jié)合:

?switch語(yǔ)句

switch語(yǔ)句是多分支的開關(guān)語(yǔ)句,它的一般格式定義如下:

switch(表達(dá)式)

case常量值1:

{代碼塊1}

break;

case常量值2:

{代碼塊2}

break;

default:

{代碼塊}

)

語(yǔ)句中表達(dá)式的值必需是整型或者字符型;常量值1到常量值n必需也是

整型或者字符型。switch語(yǔ)句首先計(jì)算表達(dá)式的值,假如表達(dá)式的值和某個(gè)

case后面的常量值相同,就執(zhí)行該case里的若干個(gè)語(yǔ)句直到break語(yǔ)句為止。

假如沒有一個(gè)常量與表達(dá)式的值相同,則執(zhí)行default后面的若干個(gè)語(yǔ)句。

default是可有可無(wú)的,假如它不存在,并且全部的常量值都和表達(dá)式的值不

相同,那么switch語(yǔ)句就不會(huì)進(jìn)行任何處理。

須要留意的是,在switch同一個(gè)語(yǔ)句中,case后的常量值必需互不相同。

3.3限制語(yǔ)句

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

條件語(yǔ)句:

條件語(yǔ)句有兩種:if語(yǔ)句和switch語(yǔ)句。

?if語(yǔ)句:

if(條件)

{代碼塊1}

else

{代碼塊2}

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

else部分是可選的,也就是說(shuō),可以沒有else。

假如有else,則與最近的if結(jié)合:

?switch語(yǔ)句

switch語(yǔ)句是多分支的開關(guān)語(yǔ)句,它的一般格式定義如下:

switch(表達(dá)式)

case常量值1:

{代碼塊1}

break;

case常量值2:

{代碼塊2}

break;

default:

{代碼塊}

)

語(yǔ)句中表達(dá)式的值必需是整型或者字符型;常量值1到常量值n必需也是

整型或者字符型。switch語(yǔ)句首先計(jì)算表達(dá)式的值,假如表達(dá)式的值和某個(gè)

case后面的常量值相同,就執(zhí)行該case里的若干個(gè)語(yǔ)句直到break語(yǔ)句為止。

假如沒有一個(gè)常量與表達(dá)式的值相同,則執(zhí)行default后面的若干個(gè)語(yǔ)句。

default是可有可無(wú)的,假如它不存在,并且全部的常量值都和表達(dá)式的值不

相同,那么switch語(yǔ)句就不會(huì)進(jìn)行任何處理。

須要留意的是,在switch同一個(gè)語(yǔ)句中,case后的常量值必需互不相同。

循環(huán)語(yǔ)句:

循環(huán)語(yǔ)句,顧名思義,是反復(fù)執(zhí)行的語(yǔ)句。比如,計(jì)算1。。的階乘,

1*2*3*...*100,就須要用到循環(huán)語(yǔ)句,不然,就要寫一百遍乘法。循環(huán)語(yǔ)句須

要特殊當(dāng)心,很簡(jiǎn)潔陷入死循環(huán),所以循環(huán)體的代碼塊里須要有能使循環(huán)結(jié)束

的語(yǔ)句。Java有三種循環(huán)語(yǔ)句:while語(yǔ)句,do-while語(yǔ)句和for語(yǔ)句。

?while語(yǔ)句:

while語(yǔ)句的格式是:

while(條件)

{代碼塊}

當(dāng)條件成立的時(shí)候,執(zhí)行代碼塊,再檢查條件,假如還成立,再執(zhí)行代碼

塊,……直到條件不成立。

比如,計(jì)算1。的階乘:

?do-while語(yǔ)句

do-while語(yǔ)句的格式是:

do{

代碼塊

}while(條件)

do-while語(yǔ)句和while語(yǔ)句的區(qū)分在于:while語(yǔ)句先檢查條件,假如條

件不成立,則不進(jìn)入循環(huán)體;do-while語(yǔ)句先執(zhí)行循環(huán)體的代碼,再檢查條件,

假如條件成立,則在此執(zhí)行循環(huán)體的代碼。所以,do-while語(yǔ)句至少要執(zhí)行一

遍循環(huán)體的代碼塊。

比如,計(jì)算1。的階乘:

?for語(yǔ)句

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

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

{代碼塊}

其中,表達(dá)式1完成變量的初始化,表達(dá)式2時(shí)布爾類型的表達(dá)式,是循

環(huán)條件,表達(dá)式3是黨執(zhí)行了一遍循環(huán)之后,修改限制循環(huán)的變量值。

for語(yǔ)句的執(zhí)行過(guò)程是這樣的:首先計(jì)算表達(dá)式1,完成必要的初始化工作;

然后推斷表達(dá)式2的值,假如表達(dá)式的值為true,則執(zhí)行循環(huán)體;假如為false,

則跳出循環(huán)。執(zhí)行完循環(huán)體之后緊接著計(jì)算表達(dá)式3,以便變更循環(huán)條件,這

樣一輪循環(huán)就結(jié)束了。其次輪循環(huán)從計(jì)算表達(dá)式起先,假如表達(dá)式的值仍為

true,則接著循環(huán);否則循環(huán)結(jié)束,執(zhí)行for語(yǔ)句后面的語(yǔ)句。

比如,計(jì)算1。的階乘:

?嵌套循環(huán)

經(jīng)常可以遇到嵌套循環(huán)的例子。所謂嵌套循環(huán),是指一個(gè)循環(huán)體里還有一個(gè)

或者更多個(gè)循環(huán)。比如計(jì)算1。以內(nèi)的階乘之和,或者求5。以內(nèi)的素?cái)?shù),就

須要用到嵌套循環(huán)。我們以求50以內(nèi)的素?cái)?shù)為例,說(shuō)明嵌套循環(huán)的用法;求

10以內(nèi)的階乘之和,將留作作業(yè)。

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

在循環(huán)體中,遇到break語(yǔ)句,那么整個(gè)循環(huán)語(yǔ)句就結(jié)束;假如遇到

continue語(yǔ)句,那么本次循環(huán)就結(jié)束,就是說(shuō),不再執(zhí)行本次循環(huán)中continue

語(yǔ)句后面的語(yǔ)句,而是轉(zhuǎn)入下一次循環(huán)。

3.5變量的作用域

變量是由作用域的。所謂變量的作用域,是指一個(gè)變量在什么地方生效???/p>

的來(lái)說(shuō),變量的作用域是聲明它的塊。所謂塊,是指用一對(duì)花括號(hào)包圍起來(lái)的

隨意數(shù)量的Java語(yǔ)句。變量只在聲明它的塊中有效,在這塊以外,變量是無(wú)

效的。

然而,不行以在兩個(gè)嵌套的塊中聲明兩個(gè)完全同名的變量。

留意,在C++中,這是允許的,內(nèi)部定義會(huì)掩蓋外部定義。這很簡(jiǎn)潔造成

錯(cuò)誤,所以Java不允許這樣做。

小結(jié)

這一講,我們主要學(xué)習(xí)了Java的語(yǔ)句,主要是流程限制語(yǔ)句,包括條件語(yǔ)

句和循環(huán)語(yǔ)句等。語(yǔ)句是程序的基本組成部分,是我們進(jìn)一步學(xué)習(xí)Java的基

礎(chǔ)。希望同學(xué)們切實(shí)駕馭好這部分內(nèi)容,為我們的進(jìn)一步學(xué)習(xí)打下堅(jiān)實(shí)的基礎(chǔ)。

習(xí)題

1.編一個(gè)計(jì)算1!+2!+…+10!的應(yīng)用程序

,用程序計(jì)算100以內(nèi)的全部質(zhì)數(shù)

2.一個(gè)數(shù)假如恰好等于它的因子之和,這個(gè)數(shù)就稱為“完數(shù)”,編寫一個(gè)

應(yīng)用程序,求100。之內(nèi)的全部完數(shù)。

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

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

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

除了基本數(shù)據(jù)類型,Java還供應(yīng)一種導(dǎo)出類型:數(shù)組。數(shù)組是相同類型的

數(shù)據(jù)按依次組成的一種復(fù)合數(shù)據(jù)類型,通過(guò)數(shù)組名和下標(biāo),可以運(yùn)用數(shù)組中的

數(shù)據(jù)。下標(biāo)從。起先。數(shù)組是全部編程語(yǔ)言中常用的數(shù)據(jù)結(jié)構(gòu)。

為什么要數(shù)組呢?我們來(lái)舉一個(gè)例子。假設(shè)我們須要表示一個(gè)班50個(gè)人的

數(shù)學(xué)成果,要求求出平均成果。假如沒有數(shù)組,我們須要用前面學(xué)過(guò)的聲明變

量的方法,聲明50個(gè)變量,寫5。次加法運(yùn)算!數(shù)組可以大大地簡(jiǎn)化類似的

問(wèn)題!我們只要聲明一個(gè)長(zhǎng)度為50的整型數(shù)組,結(jié)合上一講我們學(xué)過(guò)的循環(huán)

語(yǔ)句,就可以很便利地解決這個(gè)問(wèn)題!

在以前的編程語(yǔ)言比如C或者C++中,字符串也運(yùn)用數(shù)組來(lái)表示的:字符

串是字符數(shù)組!所以字符串與數(shù)組有著自然的聯(lián)系。但是在Java中,供應(yīng)了

一種更便利的表示字符串的方法:用一個(gè)String類來(lái)表示。類是面對(duì)對(duì)象的

語(yǔ)言特有的概念,對(duì)于初次接觸面對(duì)對(duì)象技術(shù)的人來(lái)說(shuō),比較難理解。所以,

這一講,我們將學(xué)習(xí)表示字符串的String類,也對(duì)類的運(yùn)用有一個(gè)粗略的了

解,作為下一講詳細(xì)學(xué)習(xí)類的準(zhǔn)備。

須要指出的是,C語(yǔ)言里的其他兩種導(dǎo)出類型:結(jié)構(gòu)體和共用體,在Java

里已經(jīng)被取消。

下面,我們來(lái)學(xué)習(xí)數(shù)組和字符串。

乃??實(shí)用教程

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

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

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

維的,也可以是二維或者多維的。舉例來(lái)說(shuō):一個(gè)班有5。個(gè)人,我們用一個(gè)

長(zhǎng)度為5。的一維數(shù)組表示;假如要表示每個(gè)同學(xué)的五門高考成果,那我們就

須要用一個(gè)第一維長(zhǎng)度為50,其次維長(zhǎng)度為5的二維數(shù)組。

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

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

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

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

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

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

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

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

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

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

聲明數(shù)組僅僅給出了數(shù)組名字和元素的數(shù)據(jù)類型,想要真正運(yùn)用數(shù)組還必需

為數(shù)組支配內(nèi)存空間,也就是創(chuàng)建數(shù)組。在為數(shù)組支配內(nèi)存空間時(shí)必需指明數(shù)

組的長(zhǎng)度。為數(shù)組支配內(nèi)存空間的格式如下:

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

例如:student=newint[50];

score=newint[50][4];

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

intstudent[]=newint[50];

一旦數(shù)組被創(chuàng)建,數(shù)組的大小就不能變更。假如在程序運(yùn)行期間,須要對(duì)數(shù)

組的大小進(jìn)行擴(kuò)展,通常須要運(yùn)用另一種數(shù)據(jù)對(duì)象:Vectoro有關(guān)向量和擴(kuò)展

數(shù)組,有愛好的同學(xué)可以在Java幫助中查找Vector的幫助。

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

StudentStudent-01

StudentF11

Student「21

StudentF3]

Student[49]

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

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

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

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

這個(gè)初始化動(dòng)作相當(dāng)于:

intnum[]=newint[4];

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

4.3數(shù)組的運(yùn)用

1.數(shù)組的訪問(wèn)

前面我們已經(jīng)看到,數(shù)組通過(guò)下標(biāo)訪問(wèn)數(shù)組元素,比如:student[0]=70,

student[49]=87等。留意,下標(biāo)從0起先,假如數(shù)組長(zhǎng)度為n,則下標(biāo)是。~

n-1,假如運(yùn)用n或者以上的元素,將會(huì)發(fā)生數(shù)組溢出異樣。比如:student[50]

=79,雖然編譯的時(shí)候能通過(guò),程序運(yùn)行時(shí)將中止。

二維數(shù)組的運(yùn)用與之類似。

2.數(shù)組的復(fù)制

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

間,所以變更一個(gè)數(shù)組的值,另一個(gè)數(shù)組變量的值也會(huì)變更。

比如:

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

intnumcopy[]=num;

numcopy[2]=5;

現(xiàn)在,num⑵也變成了5o

假如真的想把一個(gè)數(shù)組的全部值都復(fù)制到另一個(gè)數(shù)組中,就須要接受

System.arrarycopy。方法:System.arrarycopy(num,0,numcopy,0,

4)o這樣,num和numcopy將指向不同的內(nèi)存空間,numcopy的值的變更,

不會(huì)在影響num。有愛好的同學(xué)可以參考幫助文件。

4.4字符串

前面已經(jīng)說(shuō)過(guò):Java運(yùn)用java.lang包中的String類來(lái)表示字符串,盡管

我們可以用字符數(shù)組來(lái)實(shí)現(xiàn)類似的功能。關(guān)于類的詳細(xì)學(xué)問(wèn),我們下一講將會(huì)

講到。由于類是面對(duì)對(duì)象編程語(yǔ)言最核心的概念,學(xué)習(xí)起來(lái)有些難度,我們?cè)?/p>

這里先通過(guò)String類對(duì)類的概念有一個(gè)粗略的了解,以使我們下面的學(xué)習(xí)更

順當(dāng)一些。

字符串,顧名思義,就是一串字符。比如:"studentlOO","China"等。用

一對(duì)雙引號(hào)表示字符串。我們也可以把字符串看成字符數(shù)組(事實(shí)上,C就是

把字符串當(dāng)作字符數(shù)組來(lái)處理),但是把它視為類更便利一些。為什么?我們

下面立即會(huì)看到。

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

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

比如:Strings;

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

名=字符串常量

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

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

者Strings="student";

大家是不是覺得:String這個(gè)類的聲明,跟前面我們學(xué)過(guò)的基本數(shù)據(jù)類型

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

事實(shí)上,

類型變量名

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

明。

另一方面,

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

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

攣;%”號(hào)實(shí)用數(shù)程V

4.5與字符串有關(guān)的操作

?字符串的長(zhǎng)度

length。方法:

Strings="student";

intlen=s.length();

須要指出的是,s.length。這種調(diào)用方法,是面對(duì)對(duì)象編程語(yǔ)言特有的方法,

我們把s叫做String類的對(duì)象,就像intn,我們把n叫做整型變量一樣;把

length。叫做String類的方法。下面我們可以看到,String類的方法,都是通

過(guò)對(duì)象名?方法名()這種方式調(diào)用的。

?取子串

Strings="IamaChinese";

Stringsubs;

subs=s.substring(7);

?字符串的比較

Stringtom="mynameistom";

Stringjane="mynameisjane";

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

tompareTo(jane),返回一個(gè)負(fù)整數(shù),因?yàn)榈谝粋€(gè)不相等的字

符t和j相比,t在j的后面;假如返回0,表示相等;假如返回

一個(gè)正整數(shù),表示tom和jane第一個(gè)不相等的字符,tom的在

jane的前面。

留意,不要用tom==jane推斷兩個(gè)字符串是否相等,因?yàn)檫@樣的話比較的

是它們?cè)趦?nèi)存中的地址是否相同,而不是我們所希望的比較字符串的內(nèi)容是否

相同。

?字符串連接

Strings="Iam";

Strings2="aChinese";

Strings4,s4;

s4=s+s2;

s4=s+24;

整數(shù)型24將會(huì)自動(dòng)轉(zhuǎn)換為字符串。

?字符串檢索

字符串檢索是指推斷一個(gè)字符串是否包含某一個(gè)字符或者子字符串,假如

有,返回它的位置,假如沒有,返回一個(gè)負(fù)數(shù)。

Strings="IamaChinese";

s.indexOf("Chinese"),返回7;

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

-字符串轉(zhuǎn)換為數(shù)值

假如一個(gè)字符串是一串?dāng)?shù)字,可以把它轉(zhuǎn)換成相應(yīng)的數(shù)值。

。轉(zhuǎn)換為整型:

Strings="21";

intx;x=Integer.parselnt(s);

o轉(zhuǎn)換為浮點(diǎn)型

Strings="22.124";

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

O當(dāng)然,也可以把整數(shù)或者浮點(diǎn)數(shù)轉(zhuǎn)換為字符串類型:

Strings;

intn=24;

s=String.valueOf(n);

o其他

與字符串有關(guān)的方法還有許多,我們不行能一一講解。前面我們說(shuō)過(guò),我們

要學(xué)會(huì)運(yùn)用幫助。我們查找關(guān)于String的幫助,就可以看到,有關(guān)于String

的全部方法的詳細(xì)講解。希望同學(xué)們可以學(xué)會(huì)運(yùn)用幫助。

小結(jié)

這一講,我們學(xué)習(xí)了數(shù)組的一些學(xué)問(wèn),并通過(guò)String類,一方面學(xué)習(xí)了字

符串的運(yùn)用,另一方面先對(duì)類的一些概念和用法,比如類的方法調(diào)用,有了一

些粗略的了解。

數(shù)組是我們經(jīng)常要用到的數(shù)據(jù)結(jié)構(gòu),它是一種導(dǎo)出型的數(shù)據(jù)結(jié)構(gòu),對(duì)我們處

理大規(guī)模的數(shù)據(jù),有很大幫助。

前面我們說(shuō),用String類表示字符串,比我們自己用字符數(shù)組來(lái)做更便利。

因?yàn)镾tring類為我們供應(yīng)了許多現(xiàn)成的可以干脆運(yùn)用的對(duì)字符串的操作方法。

比如substring。equals()等方法。假如我們要用字符數(shù)組來(lái)完成與

substring類似的功能,就只能自己把子串的每一個(gè)字符復(fù)制到另外一個(gè)字符

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

是否相等。供應(yīng)對(duì)自己的成員數(shù)據(jù)的完整的操作方法,也就是把數(shù)據(jù)和對(duì)數(shù)據(jù)

的操作封裝起來(lái),是類的最大的好處。假如現(xiàn)在還不能理解這句話,沒關(guān)系,

我們現(xiàn)在只須要知道:運(yùn)用String類這種方法,特殊便利。

習(xí)題

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

2.將一個(gè)數(shù)組中的值按逆序重新存放,例如,原來(lái)依次為:9,5,7,4,

8,要求改為:8,4,7,5,9o

3.編寫一個(gè)應(yīng)用程序,連接兩個(gè)字符串:“1am”和“astudent”,并

求出第7個(gè)字符是什么?找出“am”在該字符串中的位置,最終把全部

字符都變成大寫字符。

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

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

5.1什么是類

上一講我們運(yùn)用了一個(gè)String類,我們說(shuō)過(guò):類把一類對(duì)象的成員函數(shù)和

方法封裝起來(lái),運(yùn)用起來(lái)很便利。那么,什么是類呢?要理解類,我們先來(lái)了

解“對(duì)象”的概念,因?yàn)轭惥褪怯脕?lái)創(chuàng)建對(duì)象的模板,它包含了被創(chuàng)建的對(duì)象的

狀態(tài)描述和方法定義。

我們可以把長(zhǎng)虹牌電視機(jī)看成是一個(gè)對(duì)象。我們不必關(guān)切電視機(jī)里面的集成

電路是怎樣的,也不用關(guān)切電視機(jī)的顯像管的工作原理,我們只須要知道電視

機(jī)的遙控器上供應(yīng)了對(duì)這臺(tái)電視機(jī)的什么操作,比如選臺(tái)、調(diào)整色調(diào)、聲音等。

這樣,我們雖然不知道電視機(jī)內(nèi)部是怎么工作的,但我們可以運(yùn)用這臺(tái)電視機(jī)。

聽起來(lái)這跟編程沒什么關(guān)系,但面對(duì)對(duì)象的思想正是與它類似:對(duì)象,對(duì)外只

供應(yīng)操作該對(duì)象的方法,內(nèi)部的實(shí)現(xiàn)對(duì)外是隱藏的。我們把這種技術(shù)叫做數(shù)據(jù)

隱藏。這樣,程序員不必了解一個(gè)對(duì)象內(nèi)部是怎么實(shí)現(xiàn)的,但可以很便利地運(yùn)

用這個(gè)對(duì)象。

類,就是對(duì)象的模板。比如,電視機(jī)是一個(gè)類,而某一臺(tái)電視機(jī)就是這個(gè)類

的一個(gè)對(duì)象,也叫一個(gè)實(shí)例。

我們前面運(yùn)用的String類,雖然我們不知道,也不必知道里面的實(shí)現(xiàn)微小

環(huán)節(jié),但我們只要知道他的操作方法,就可以很便利地運(yùn)用它。這樣,對(duì)別的

程序員編寫的程序,我們可以很便利地拿來(lái)運(yùn)用,從而提高軟件的復(fù)用程度和

編程的效率。

比如,我們構(gòu)造一個(gè)類:TV,然后對(duì)外供應(yīng)一些對(duì)它的操作方法,選臺(tái)

selectChannel()等。然后用這個(gè)類創(chuàng)建一個(gè)對(duì)象:TVkongKai;然后就可以

這樣操作這臺(tái)電視:kongKai.selectChannelo

類的另一個(gè)特性,也是它的一個(gè)大好處,是繼承。繼承的概念類似于這樣一

種表達(dá):電視是一種電器。假如我們有一個(gè)電器類,那么,我們說(shuō),電視機(jī)類

繼承了電器類。繼承有什么好處呢?設(shè)想電器類有一些屬性,比如工作電壓,

功率,有些一些方法,比如:打開open(),關(guān)閉:close()o這時(shí)候,假如

電視類繼承了電器類,電視類就自動(dòng)擁有了電器類的這些屬性和方法,而不用

再自己重寫一遍(當(dāng)然,假如想重寫,也可以,我們把這種技術(shù)叫做重載)。

這樣做有什么好處呢?最明顯的好處就是減輕編程的工作量。假設(shè)我們有令一

個(gè)類:VCD類,它也繼承了電器類,對(duì)于打開關(guān)閉等,同樣不用重新編寫。

好了,既然面對(duì)對(duì)象的方法有這么多好處,我們下面就來(lái)學(xué)習(xí)類和對(duì)象的一

些基本學(xué)問(wèn)。

實(shí)用數(shù)程

5.2一個(gè)例子

下面是一個(gè)完整的類的例子,我們用這個(gè)例子詳細(xì)講解類的一些用法。

classEmployee

privateStringname;

privatedoublesalary;

privateinthireYear;

privatestaticStringcompany=newStringC'IBM");

publicEmployee(Stringn,doubles,intd)

{name=n;

salary=s;

hireYear=d;

publicvoidprint()

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

+""+getCompanyO);

return;

t/

publicvoidraiseSalary(doublebyPercent)

{salary*=1+byPercent/100;

publicvoidraiseSalary(intbyAbsolute)

{salary+=byAbsolute;

}

publicintgetHireYear()

{returnhireYear;

publicstaticStringgetCompanyO

returncompany;

為了測(cè)試這個(gè)類,我們寫了一個(gè)測(cè)試程序:

packageteach4;

publicclassEmployeeTest

{publicstaticvoidmain(String[]args)

{Employeeemp=newEmployee("TonyTester",38000,

1990);

emp.print();

emp.ra運(yùn)eSalary(5.0D);

emp.print();

intraise=1000;

emp.raiseSalary(raise);

emp.print();

乃”實(shí)用數(shù)程

5.3類的結(jié)構(gòu)

classEmployee{}表示一個(gè)類的聲明,其中,class是關(guān)鍵字,Employee

是類名。在一對(duì)大括號(hào)中的內(nèi)容,我們叫做類體,是這個(gè)類的實(shí)現(xiàn)部分。

前面我們說(shuō)過(guò),類把數(shù)據(jù)和在數(shù)據(jù)上的操作方法封裝起來(lái),所以,類體中有

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

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

privateStringname;

privatedoublesalary;

privateinthireDay;

分別是String類型的name,代表該員工的姓名,double類型的salary,

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

private是一個(gè)關(guān)鍵字,是私有的意思,表明這些數(shù)據(jù),只能被類里面的方

法訪問(wèn),外部程序是不能干脆訪問(wèn)這些數(shù)據(jù)的。這正是類的一個(gè)好處:對(duì)外隱

藏?cái)?shù)據(jù)。我們建議,始終保持?jǐn)?shù)據(jù)的私用,也就是始終用private來(lái)修飾數(shù)據(jù),

來(lái)是我們的程序更平安。

這個(gè)類的方法部分是:

publicEmployee(Stringn,doubles,Dayd)

publicvoidprint()

publicvoidraiseSalary(doublebyPercent)

publicvoidraiseSalary(intbyAbsolute)

publicintgetHireYear()

publicstaticStringgetCompanyO

所謂方法,就是對(duì)數(shù)據(jù)的操作,有過(guò)C編程時(shí)間的同學(xué),可以把它理解為

函數(shù),只是這些函數(shù)是放在類里并對(duì)類的數(shù)據(jù)進(jìn)行操作的。比如這個(gè)方法:

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

public是一個(gè)關(guān)鍵字,是公有的意思,表明該方法可以用對(duì)象名?方法名的

方式調(diào)用。比如我們的測(cè)試程序中:emp.raiseSalary(5.0D),就是對(duì)這個(gè)方法

的調(diào)用。否則,假如是private,該方法就只能被類里的方法調(diào)用,像

emp.raiseSalary(5.0D)這種調(diào)用是非法的。

void表明方法的返回類型為空,也就是什么都不返回。publicint

getHireYear。這個(gè)方法的返回類型是int。一般來(lái)說(shuō),返回類型這部分是不能

缺少的,即使方法什么都不返回,也要用一個(gè)void關(guān)鍵字修飾。有一個(gè)例外:

構(gòu)造函數(shù)。我們后面會(huì)講到。

raiseSalary(doublebyPercent)是方法名,前面我們已經(jīng)說(shuō)過(guò)方法的命名

規(guī)則,第一個(gè)單詞小寫,以后沒個(gè)單詞首字母大寫。這樣可以增加可讀性,依

據(jù)raiseSalary這個(gè)名字就可以知道這個(gè)方法的功能是漲工資。括號(hào)里是參數(shù)

列表,類似于我們前面學(xué)過(guò)的變量的聲明。假如有多個(gè)參數(shù),用逗號(hào)隔開,比

如Employee(Stringn,doubles,intd)o

方法的一對(duì)大括號(hào)里是方法的實(shí)現(xiàn),就是我們前面學(xué)過(guò)的語(yǔ)句的組合。比如

print()方法,是打印出該員工的姓名工資等信息;raiseSalary()方法是依據(jù)

參數(shù),把員工工資漲相應(yīng)的比例。留意,假如方法有返回類型且不為void,那

么在方法的實(shí)現(xiàn)中必需有retum語(yǔ)句,返回相應(yīng)的類型。比如hireYear()方

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

但可以是一個(gè)return語(yǔ)句,后面不帶返回值,比如print()方法里就有一個(gè)空

的return語(yǔ)句。

5.4構(gòu)造方法

我們留意到,有一個(gè)方法是與類名同名的,而且沒有返回類型,比如這個(gè)例

子中的publicEmployee(Stringn,doubles,intd),我們把它叫做構(gòu)造方

法。構(gòu)造方法是做什么用的呢?構(gòu)造方法是在聲明對(duì)象的時(shí)候,自動(dòng)調(diào)用的方

法,其作用是為對(duì)象的數(shù)據(jù)做一些必要的初始化工作。比如,這里的public

Employee(Stringn,doubles,intd)方法,就是初始化這個(gè)員工的姓名,工

資和雇傭年份。在聲明emp對(duì)象的時(shí)候,調(diào)用的就是構(gòu)造函數(shù)。

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

假如沒有定義構(gòu)造函數(shù),Java會(huì)自動(dòng)供應(yīng)一個(gè)默認(rèn)的構(gòu)造函數(shù),把全部成

員數(shù)據(jù)初始化為默認(rèn)值,比如數(shù)字類型(包括整型、浮點(diǎn)型)將是。,布爾類

型將是false等。留意在沒有構(gòu)造方法時(shí),new后面的()中不能有數(shù)字?。?/p>

須要留意的是,與構(gòu)造函數(shù)相對(duì)的是析構(gòu)函數(shù),目的是在對(duì)象不再運(yùn)用的時(shí)

候回收對(duì)象運(yùn)用的內(nèi)存。C++里就支持析構(gòu)函數(shù)。但是,由于Java供應(yīng)自動(dòng)

回收"垃圾”的機(jī)制,所以不須要進(jìn)行內(nèi)存回收,所以Java沒有析構(gòu)函數(shù)。

5.5方法的重載

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

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

publicvoidraiseSalary(doublebyPercent)

publicvoidraiseSalary(intbyAbsolute)

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

型,表明工資上漲的數(shù)額。這兩個(gè)方法參數(shù)不同。調(diào)用的時(shí)候,依據(jù)參數(shù)的不

同,確定運(yùn)用哪一個(gè)方法。比如,我們的例子中,emp.raiseSalary(5.0D)的

參數(shù)是double型,所以將會(huì)調(diào)用第一個(gè),工資上漲5%,

emp.raiseSalary(raise)的參數(shù)raise是一個(gè)int型,所以將會(huì)調(diào)用其次個(gè),

是工資上漲100。元。

方法的重載的好處是使我們的程序處理更便利。比如,我們的例子中,漲工

資,我們供應(yīng)了統(tǒng)一的raiseSalary。方法,我們不用自己推斷漲的是百分比

還是確定數(shù)額,由程序自己推斷,是程序更好用,可讀性更強(qiáng)。

乃n號(hào)實(shí)用數(shù)程1

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

所謂靜態(tài)方法和靜態(tài)成員變量,是指那些用static關(guān)鍵字修飾的方法或者

變量,比如我們例子中的privatestaticStringcompany就是一個(gè)靜態(tài)成員

變量,而publicstaticStringgetCompanyO和publicstaticvoid

setCompany(Strings)都是靜態(tài)方法。

靜態(tài)的意思,是指該方法或者變量在整個(gè)類中只有一份。我們說(shuō),類是用來(lái)

創(chuàng)建對(duì)象的模板,就是說(shuō),我們創(chuàng)建對(duì)象的時(shí)候,每個(gè)對(duì)象都會(huì)有類中所聲明

的成員變量的一個(gè)副本。但是,對(duì)于靜態(tài)成員變量,在內(nèi)存中只有一個(gè)副本,

全部的對(duì)象將共享這個(gè)副本。比如我們的例子中,全部Employee所在的公司

就只有一個(gè),所以我們沒有必要為每一個(gè)Employee的對(duì)象都保留一個(gè)

company的副本,所以我們把它聲明為靜態(tài)的成員變量。比如我們例子中有

兩個(gè)Employee類的對(duì)象:emp和emp2,他們的成員變量?jī)?nèi)存模式如下圖

所示:

所以,只要變更了company的值,對(duì)全部Employee的對(duì)象都是起作用

的。

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

setCompany()只能訪問(wèn)company,假如它訪問(wèn)name之類的變量,編譯器

將會(huì)報(bào)錯(cuò)。而且靜態(tài)方法的調(diào)用是類名?方法名的方式來(lái)調(diào)用的,也可以用一

般的對(duì)象名?方法名的方式來(lái)調(diào)用。

事實(shí)上,我們從前用的System.out.println()方法,就是一個(gè)靜態(tài)的方法,

所以我們可以干脆用類名?方法名的方式調(diào)用。而一個(gè)類里假如有main函數(shù)

都要聲明為靜態(tài)方法,因?yàn)橐粋€(gè)程序只能有一個(gè)main函數(shù)入口。

””實(shí)用我程

小結(jié)

這一講我們學(xué)習(xí)了類和對(duì)象的一些基本概念和學(xué)問(wèn),包括類的結(jié)構(gòu),構(gòu)造方

法,方法的重載,靜態(tài)方法和靜態(tài)成員變量。類和對(duì)象,是面對(duì)對(duì)象編程語(yǔ)

言的最重要的特征,也是精髓所在。希望大家努力駕馭好這部分學(xué)問(wèn)。下一講,

我們接著學(xué)習(xí)Java的繼承、接口等概念。

號(hào)實(shí)用數(shù)程

習(xí)題

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

2.編個(gè)程序檢驗(yàn)一下public方法和private方法有什么區(qū)分。

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

4.在我們的例子中再重載raiseSalary。方法,按工齡漲工資,比如,假如

工齡為5年,那么增長(zhǎng)1%*5;

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

6.1類的繼承

繼承是類的另一個(gè)特性。繼承的意義在于:我們重復(fù)運(yùn)用或更改現(xiàn)成的類的

方法,也可以加入新的數(shù)據(jù)成員以與新的方法,以滿足新環(huán)境的須要。這種技

術(shù)是全部面對(duì)對(duì)象的編程語(yǔ)言的一個(gè)基本特征。

讓我們來(lái)看一個(gè)例子:前面我們定義了一個(gè)Employee類,這只是一般員

工,現(xiàn)在我們要定義一個(gè)經(jīng)理類。經(jīng)理也是員工的一種,所以Employee類中

的數(shù)據(jù)和方法他也應(yīng)當(dāng)有;但經(jīng)理又不同于一般員工,經(jīng)理有秘書,而且漲工

資的時(shí)候還要加上分紅。怎么辦?我們要不要從頭起先寫一個(gè)經(jīng)理類?

有了繼承的技術(shù),我們可以在Employee類的基礎(chǔ)上,編寫我們的Manager

類。程序如下:

packageteach4;

importjava.util.Date;

classManagerextendsEmployee

(

privateStringsecretaryName;

publicManager(Stringn,doubles,intd)

{super(n,s,d);必需在構(gòu)造方法的第一個(gè)語(yǔ)句。

secretaryName=

}

publicvoidraiseSalary(doublebyPercent)

{//add1/2%bonusforeveryyearofservice

Datetoday=newDate(2023,1,1);

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

super.raiseSalary(byPercent+bonus);

}

publicvoidsetSecretaryName(Stringn)

{secretaryName=n;

)

publicStringgetSecretaryNameQ

{returnsecretaryName;

}

}

我們以這個(gè)例子為例,學(xué)習(xí)繼承的用法。

首先,請(qǐng)留意這個(gè)類的頭部有些不同:classManagerextendsEmployee;

其中,關(guān)鍵字extends是擴(kuò)展的意思,表明Manager類是從Employee類繼

承而來(lái)。我們把Employee叫做父類或者超類,把Manager叫做子類或者衍

生類。一般來(lái)說(shuō),子類比父類有更多的功能。

Manager的構(gòu)造方法中有個(gè)語(yǔ)句:super(n,s,d),super是一個(gè)關(guān)鍵字,

意思是調(diào)用父類的方法,在這里是父類,也就是Employee的構(gòu)造方法;類似

地,super.raiseSalary(byPercent+bonus)表示調(diào)用父類Employee的

ra運(yùn)eSalary方法。所以,假如要在子類中調(diào)用父類的方法,運(yùn)用super。

Manage的構(gòu)造方法調(diào)用了Employee的構(gòu)造方法。事實(shí)上,一般要求子類用

super語(yǔ)句調(diào)用父類的構(gòu)造方法并附上恰當(dāng)?shù)膮?shù)。假如沒有用super調(diào)用,

將默認(rèn)地調(diào)用父類的默認(rèn)構(gòu)造方法,這時(shí),假如父類沒有沒有默認(rèn)的構(gòu)造方法,

編譯器將報(bào)錯(cuò)。在子類的構(gòu)造方法中,假如有super語(yǔ)句,要求super語(yǔ)句

在第一行。

子類自動(dòng)擁有父類的標(biāo)記為public的成員變量和方法,比如:雖然我們?cè)?/p>

Manager類中沒有定義print()方法,但是boss.print。是合法的,因?yàn)閜rint()

是Employee類的一個(gè)方法。假如希望變更父類中的方法,使之適合子類,我

們也可以覆蓋它。比如,因?yàn)榻?jīng)理的提薪方式是:除了上漲百分比,還要加上

工齡*0.5的獎(jiǎng)金,與一般員工的提薪方式就有不同。所以,我們要覆蓋掉這個(gè)

方法。事實(shí)上,只要重寫這個(gè)方法就可以了。boss.raiseSalary(l.O),將自動(dòng)

調(diào)用Manager類里定義的raiseSalary。方法,而不是Employeee里的方法。

但是,假如是私有的成員變量或者方法,也就是用private關(guān)鍵字修飾的那

些,那么子類是不能訪問(wèn)的。假如希望子類能訪問(wèn)而別的類不能訪問(wèn),我們可

以用protected關(guān)鍵字,比如:protectedStringname;這樣,name對(duì)于

Manager來(lái)說(shuō)是可以可見和可訪問(wèn)的,而對(duì)于不是Employee的子類的其他

類,則是不能訪問(wèn)的。

總結(jié)一下訪問(wèn)權(quán)限關(guān)鍵字:

?public:對(duì)全世界來(lái)說(shuō)都是可見的;

?private:僅對(duì)類來(lái)說(shuō)是可見的;

?protected:對(duì)全部子類和同一個(gè)包(package)來(lái)說(shuō)是可見的;

?不聲明:假如這三個(gè)關(guān)鍵字都沒有,那么默認(rèn)為對(duì)整個(gè)包可見。

Manager類里定義的setSecretaryName。和getSecretaryName。方法,

都只能為Manager類的對(duì)象調(diào)用,Employee類的對(duì)象是不能調(diào)用這兩個(gè)方

法的。

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

Executive類來(lái)。我們也可以從Employee類衍生出Programmer類來(lái),它

與Manager類沒有什么關(guān)系。假如希望防止別人從自己編寫的一個(gè)類中衍生

出另一個(gè)類,可以加上關(guān)鍵字final,比如,不希望從Manager類中再衍生出

別的類,我們可以把Manager類的聲明改為:finalclassManagerextends

Employeeo這樣可以提高程序的平安性,但可擴(kuò)展性會(huì)受到影響。

我們可以畫出類的繼承結(jié)構(gòu)如下:

Employee

ManagerProgrammer

-----------繼承結(jié)構(gòu)圖

Executive

乃:?實(shí)用數(shù)程

6.2造型

也叫強(qiáng)制類型轉(zhuǎn)換?;貞浺幌拢覀?cè)谄浯沃v的Java的基本語(yǔ)法中,說(shuō)到

基本數(shù)據(jù)類型的強(qiáng)制類型轉(zhuǎn)換,可以把一個(gè)浮點(diǎn)數(shù)強(qiáng)制轉(zhuǎn)換為整型,比如:

doublex=3.14;intnx=(int)x;這樣,x=3,把小數(shù)部分丟掉了。我們同樣可

以把類強(qiáng)制轉(zhuǎn)換為另一個(gè)類。但不是什么時(shí)候都可以轉(zhuǎn)換的,只有在繼承結(jié)構(gòu)

圖內(nèi)部,才能進(jìn)行強(qiáng)制類型轉(zhuǎn)換。

比如:Managerboss;Employeeemp;下面這個(gè)語(yǔ)句:emp=boss,相

當(dāng)于emp=(Employee)boss;因?yàn)閑mp是Employee類型的,而boss是

Manager類型的,但是,這時(shí)候,emp將不能調(diào)用Manager類的方法,比

如getSecretaryName。,假如要調(diào)用,必需把emp轉(zhuǎn)換回來(lái)。比如:Manager

manager;manager=(Manager)emp;這樣,manager就可以調(diào)用

getSecretaryName。了。只允許子類轉(zhuǎn)換成父類的調(diào)用父類的方法不允許調(diào)過(guò)

來(lái)。

但是,假如一個(gè)對(duì)象的確是Employee類型,現(xiàn)在要把它轉(zhuǎn)換為Manager

類型而且試圖訪問(wèn)Manager的方法,編譯將會(huì)通過(guò),但是運(yùn)行時(shí)將會(huì)出現(xiàn)異

樣,程序?qū)⒅兄惯\(yùn)行。

6.3接口

前面我們介紹Java的特點(diǎn)的時(shí)候說(shuō)過(guò),Java不允許多重繼承,即一個(gè)類

不允許有多個(gè)父類,至多只能有一個(gè)父類。在Java中,取代多重繼承的技術(shù)

是接口。Java是用接口技術(shù)的緣由,是因?yàn)槎嘀乩^承要么使編譯器特殊困難,

要么效率不高。

那么,接口是什么呢?我們可以把接口理解為一個(gè)描述框架,里面定義了一

些方法,但并不實(shí)現(xiàn)這些方法,而是由繼承這個(gè)接口的類來(lái)實(shí)現(xiàn)。這樣,假如

某一個(gè)類繼承了一個(gè)接口,意思是說(shuō):這個(gè)類實(shí)現(xiàn)了接口所定義的全部方法。

比如,Java的標(biāo)準(zhǔn)庫(kù)里定義了一個(gè)名為Comparable的接口。只要某個(gè)類

是可對(duì)比的,就可以繼承并實(shí)現(xiàn)這個(gè)接口。數(shù)字型和字符串型都是可比的,所

以String,Float,Integer,Double等類都繼承并實(shí)現(xiàn)了這個(gè)接口。假如我們

定義我們的例子中的Employee類業(yè)是可比的,以進(jìn)公司的年份來(lái)比較,那么

我們也可以繼承這個(gè)類,并實(shí)現(xiàn)它。

留意,假如繼承了一個(gè)接口,就必需實(shí)現(xiàn)這個(gè)接口所聲明的全部方法。

6.4this對(duì)象引用

有時(shí)會(huì)有這種

溫馨提示

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

評(píng)論

0/150

提交評(píng)論