版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡介
第1章Java語言概述Java是SunMicrosystem公司研究開發(fā)的一種新型的程序設(shè)計(jì)語言。在眾多高級語言中,Java語言脫穎而出。它不僅成為最為流行的計(jì)算機(jī)語言之一,而且形成一種專門的技術(shù)。1.1面向?qū)ο蟪绦蛟O(shè)計(jì)面向過程和面向?qū)ο笫莾煞N主要的程序設(shè)計(jì)理念。面向過程是早期程序設(shè)計(jì)的主要方式,近些年來,面向?qū)ο笾饾u成為程序設(shè)計(jì)的主要方式。面向?qū)ο蟮木幊趟枷胗蓙硪丫茫嬲饬x上的純面向?qū)ο缶幊陶Z言目前只有Java。本節(jié)將對面向?qū)ο蟮幕A(chǔ)知識進(jìn)行簡單的介紹,主要包括面向?qū)ο蟪绦蛟O(shè)計(jì)思想的誕生、面向?qū)ο笈c面向過程程序設(shè)計(jì)思想的對比、面向?qū)ο蠹夹g(shù)的背景和特點(diǎn)等三方面的內(nèi)容。1.1.1面向?qū)ο蟪绦蛟O(shè)計(jì)思想的誕生隨著軟件復(fù)雜度的提高,以及Internet的迅猛發(fā)展,原先面向過程的軟件開發(fā)方式已經(jīng)很難滿足軟件開發(fā)的需要。針對日趨復(fù)雜的軟件需求挑戰(zhàn),面向?qū)ο蟮能浖_發(fā)模式誕生了。目前作為針對軟件危機(jī)的最佳對策,面向?qū)ο螅∣bjectOriented,OO)技術(shù)已經(jīng)引起人們的普遍關(guān)注。許多編程語言都推出了面向?qū)ο蟮男掳姹?,一些軟件開發(fā)合同甚至也指明了必須使用基于OO的技術(shù)和語言。下面簡要列出了OO技術(shù)的發(fā)展歷程。1.1.2面向?qū)ο笈c面向過程的對比傳統(tǒng)的過程化程序設(shè)計(jì)通過設(shè)計(jì)一系列的過程(即算法)來求解問題。這些過程一旦被確定,下一步就要開始尋找存儲數(shù)據(jù)的方式,即“程序=算法+數(shù)據(jù)結(jié)構(gòu)”。其中,算法是第一位,而數(shù)據(jù)結(jié)構(gòu)是第二位。而面向?qū)ο蟮某绦蛟O(shè)計(jì)(ObjectOrientedProgramming,OOP)調(diào)換了這個次序,將數(shù)據(jù)放在第一位,然后再考慮操縱數(shù)據(jù)的算法。在OOP中,程序被看作是相互協(xié)作的對象集合,每個對象都是某個類的實(shí)例,所有類構(gòu)成一個通過繼承關(guān)系相聯(lián)系的層次結(jié)構(gòu)。面向?qū)ο蟮恼Z言通常具有以下特征。對象生成功能消息傳遞機(jī)制類和遺傳機(jī)制1.1.3面向?qū)ο蠹夹g(shù)的背景和特點(diǎn)OO是一種方法,一種思想,同時(shí)又是一種技術(shù)。OO力求更客觀自然地描述現(xiàn)實(shí)世界,使分析、設(shè)計(jì)和實(shí)現(xiàn)系統(tǒng)的方法同認(rèn)識客觀世界的過程盡可能一致。對象是客觀世界中的事物在人腦中的映像,這種映像通過對同一類對象的抽象反映成為人的意識,并作為一種概念而存在。例如,當(dāng)人們認(rèn)識到一種新的事物—蘋果,于是人們的意識當(dāng)中就形成了蘋果的概念。這個概念會一直存在于人們的思維當(dāng)中,并不會因?yàn)檫@個蘋果被吃掉而消失。1.2Java概述本節(jié)首先對Java語言進(jìn)行簡述,包含Java的起源和發(fā)展,Java的特性和Java的體系結(jié)構(gòu),使讀者對Java有一個初步的認(rèn)識。1.2.1Java的起源和發(fā)展Java起源于1994年,美國SunMicrosystem的PatrickNawghton、JameGosling和MikeSheridan等人組成的開發(fā)小組,開始了代號為Green的項(xiàng)目的研制,其目標(biāo)是研制一種開發(fā)家用電器的邏輯控制系統(tǒng),產(chǎn)品名稱為Oak。1995年1月,Oak被更名為Java。這個名字來自于印度尼西亞的一個盛產(chǎn)咖啡的小島的名字,小島的中文名叫爪哇。正是因?yàn)樵S多程序設(shè)計(jì)師從鐘愛的熱騰騰的香濃咖啡中得到靈感,因而熱騰騰的香濃咖啡也就成為Java語言的標(biāo)志。1.2.2Java特性隨著Internet的飛速發(fā)展,人們的學(xué)習(xí)、工作、科研、商業(yè)和生活方式隨之發(fā)生了巨大變化。人們不僅需要具有聲音、圖像和動畫等多媒體信息的Web頁面,以及實(shí)時(shí)視頻、多用戶網(wǎng)絡(luò)游戲等,而且要求能向用戶提供更好的實(shí)時(shí)交互性,并具有平臺無關(guān)性。Java的出現(xiàn),使人們看到了解決以上問題的希望。Java之所以能解決這些問題是與其自身的特點(diǎn)分不開的。Java具有如下特點(diǎn)。1.簡單性2.平臺無關(guān)性3.分布式4.健壯性5.安全性6.瀏覽器應(yīng)用1.2.3Java體系結(jié)構(gòu)雖然Java常用作開發(fā)各種應(yīng)用程序的編程語言,但是作為編程語言只是Java的眾多用途之一,而真正形成Java眾多優(yōu)點(diǎn)(包括平臺獨(dú)立性)的是其底層架構(gòu)。完整的Java體系結(jié)構(gòu)實(shí)際上是由4個組件組合而成:Java編程語言、Java類文件格式、JavaAPI和JVM。其中,JVM是JavaVirtualMachine(Java虛擬機(jī))的縮寫,它是一個虛構(gòu)出來的計(jì)算機(jī)。它是通過在實(shí)際的計(jì)算機(jī)上仿真模擬各種計(jì)算機(jī)功能來實(shí)現(xiàn)的。JVM有自己完善的硬件架構(gòu),如處理器、堆棧、寄存器等,還具有相應(yīng)的指令系統(tǒng)。因此,使用Java開發(fā)時(shí),本質(zhì)就是用Java編程語言編寫代碼,然后將代碼編譯為Java類文件,接著在JVM中執(zhí)行類文件。1.3Java運(yùn)行機(jī)制與JVM在1.2中講到,在Java體系結(jié)構(gòu)中,JVM處在核心的位置,是程序與底層操作系統(tǒng)和硬件無關(guān)的關(guān)鍵。本節(jié)將從JVM的體系結(jié)構(gòu)和運(yùn)行過程這兩個方面來對JVM進(jìn)行深入介紹。1.3.1JVM的體系結(jié)構(gòu)Java語言的一個非常重要的特點(diǎn)就是與平臺的無關(guān)性,而使用JVM是實(shí)現(xiàn)這一特點(diǎn)的關(guān)鍵。一般的高級語言如果要在不同的平臺上運(yùn)行,至少需要編譯成不同的目標(biāo)代碼。而引入JVM后,Java語言在不同平臺上運(yùn)行時(shí)不需要重新編譯即可運(yùn)行。1.3.2JVM的運(yùn)行機(jī)制JVM通過調(diào)用某個指定類的方法main啟動,傳遞給main一個字符串?dāng)?shù)組參數(shù),使指定的類被裝載,同時(shí)鏈接該類所使用的其他類型,并且初始化它們。1.4Java類庫Java類庫就是JavaAPI(ApplicationProgrammingInterface,應(yīng)用程序接口),是系統(tǒng)提供的已實(shí)現(xiàn)的標(biāo)準(zhǔn)類的集合。在程序設(shè)計(jì)中,合理和充分利用類庫提供的類和接口,不僅可以完成字符串處理、繪圖、網(wǎng)絡(luò)應(yīng)用、數(shù)學(xué)計(jì)算等多方面的工作,而且可以大大提高編程效率,使程序簡練、易懂。1.5安裝Java開發(fā)工具在學(xué)習(xí)Java之前,首先需要安裝JDK。本節(jié)將介紹如何在各種不同的操作系統(tǒng)下安裝并配置JDK。1.5.1下載JDKJDK是JavaDevelopmentKit的縮寫,在某些場合下,也能看到SDK這樣的舊術(shù)語,其是SoftwareDevelopmentKit的縮寫。Java開發(fā)工具包是免費(fèi)下載和使用的。讀者既可以到相關(guān)的網(wǎng)站上進(jìn)行搜索下載,也可以根據(jù)本節(jié)提供的URL地址下載相應(yīng)的JDK。1.5.2安裝JDK下載完成之后,即可進(jìn)行安裝。下面介紹在Windows操作系統(tǒng)下安裝JDK的方法,具體步驟如下。1.5.3設(shè)置Java運(yùn)行環(huán)境JDK安裝完成后,還需要進(jìn)行Java運(yùn)行環(huán)境的配置。配置的主要工作是設(shè)置操作系統(tǒng)的Path和Classpath這兩個環(huán)境變量,將JDK中的命令程序路徑加入到系統(tǒng)的環(huán)境變量中。下面將介紹如何在Windows下設(shè)置JDK相關(guān)的環(huán)境變量,步驟如下。1.6使用命令行在Java開發(fā)過程中最基本的方式是使用命令行。命令行方式指的是在控制臺直接調(diào)用JDK中提供的各種工具。這些工具有些是針對獨(dú)立應(yīng)用程序的,有些是針對Applet程序的,下面簡要介紹一下其中常用的幾個工具。1.編譯器—javac2.Java的語言解釋器—java3.Java語言調(diào)試工具—jdb4.Java文檔生成器—javadoc5.C頭文件和源文件生成器—javah6.JavaApplet觀察器—appletviewer7.類文件反匯編器—javap1.7使用集成開發(fā)環(huán)境Java的開發(fā)除了使用命令行方式外,也支持集成開發(fā)環(huán)境。這些開發(fā)工具集成了編輯器和編譯器,支持集成開發(fā),方便使用。這里選擇兩個具有代表性的開發(fā)工具—JCreator和Eclipse。前者是一種初學(xué)者很容易上手的Java開發(fā)工具,缺點(diǎn)是只能進(jìn)行簡單的程序開發(fā);后者是一款相當(dāng)不錯的Java集成開發(fā)工具,功能強(qiáng)大能勝任各種企業(yè)級JavaEE的開發(fā)。1.7.1使用JCreatorJCreator是一個Java程序開發(fā)工具,也是一個Java集成開發(fā)環(huán)境(IDE)。無論開發(fā)Java應(yīng)用程序或者網(wǎng)頁上的Applet元件都難不倒它。在功能上與Sun公司發(fā)布的JDK等文字模式開發(fā)工具相比更為容易,還允許使用者自定義操作窗口界面及無限撤消操作以及恢復(fù)操作(Undo/Redo)等需要解釋功能。JCreator為用戶提供了相當(dāng)強(qiáng)大的功能,如項(xiàng)目管理功能,項(xiàng)目模板功能,可個性化設(shè)置語法高亮屬性、行數(shù)、類瀏覽器、標(biāo)簽文檔、多功能編譯器,向?qū)Чδ芤约巴耆勺远x的用戶界面。通過JCreator,可不用激活主文檔而直接編譯或運(yùn)行Java程序。1.7.2使用EclipseEclipse是一款非常優(yōu)秀的Java集成開發(fā)環(huán)境。Eclipse誕生于1999年4月,最初由OTI和IBM兩家公司的開發(fā)組創(chuàng)建。目前,Eclipse已經(jīng)深入人心,廣受開發(fā)人員的青睞。下面簡單介紹如何使用Eclipse進(jìn)行Java開發(fā),一般步驟如下。1.8第一個Java程序:整數(shù)相加上面已經(jīng)為讀者介紹了Java語言的相關(guān)知識。本節(jié)將以在Windows平臺上開發(fā)一個整數(shù)相加的Java程序?yàn)槔?,介紹開發(fā)Java程序的基本步驟。開發(fā)Java程序的基本過程與其他語言類似,主要分為以下3個步驟。開發(fā)源代碼編譯程序運(yùn)行程序1.8.1開發(fā)源代碼為了讓初學(xué)者加深對Java語言的理解,這里源代碼的開發(fā)不使用集成開發(fā)工具。本例中源代碼的編寫使用的是純文本編輯器,Windows下的記事本,其他的文本編輯器如UltraEdit,Linux下的vi以及gedit等都是可以的。但是,類似于Word這樣的字處理軟件不是純文本編輯器,在編輯過程中會自動添加很多不可見字符,故絕對不能使用類似于Word的文字處理軟件作為編寫Java源代碼的編輯器。開發(fā)步驟大致如下。1.8.2編譯運(yùn)行代碼編寫完成后,便可以將其編譯運(yùn)行。編譯運(yùn)行之前,首先要設(shè)置JDK相關(guān)的系統(tǒng)環(huán)境變量,這部分內(nèi)容在前面已經(jīng)介紹過,這里不再贅述。不過,有一點(diǎn)需要注意,在設(shè)置Classpath時(shí)需要將當(dāng)前路徑包括在內(nèi),即在路徑中加入“.;”,否則在運(yùn)行時(shí)可能會出現(xiàn)無法找到相關(guān)的類的錯誤。1.9小結(jié)本章簡要介紹了Java的發(fā)展史及結(jié)構(gòu)特點(diǎn),概述了Java運(yùn)行機(jī)制和Java虛擬機(jī)、下載和安裝JDK,Java運(yùn)行環(huán)境的配置。分別介紹了使用命令行和集成開發(fā)工具開發(fā)Java應(yīng)用的一般方法。最后通過一個實(shí)例,介紹如何編寫及編譯運(yùn)行一個Java程序。通過本章的學(xué)習(xí),讀者可以初步掌握J(rèn)ava的基本概念,具備了進(jìn)一步深入學(xué)習(xí)Java知識的基本條件。第2章Java語言基礎(chǔ)與其他編程語言一樣,Java也包含變量、表達(dá)式等基本編程要素。本章介紹Java語言的基礎(chǔ)編程知識,包括數(shù)據(jù)類型、變量、運(yùn)算符、字符串、數(shù)組、控制結(jié)構(gòu)等內(nèi)容。2.1數(shù)據(jù)類型Java屬于強(qiáng)類型語言,每一個變量聲明時(shí)必須指定一種類型。Java中共有8種基本數(shù)據(jù)類型:4種整型,2種浮點(diǎn)型,表示字符單元的char型以及表示布爾值的boolean型。本節(jié)將對這8種基本數(shù)據(jù)類型逐一進(jìn)行介紹。2.1.1整型整型數(shù)據(jù)類型用來表示整數(shù)。Java中4種整型分別是:byte、short、int和long。通常情況下,int型是應(yīng)用得最多的。如果要表示特別巨大的數(shù),就要使用long型。而byte型和short型主要用于特定的場合,如占用大量存儲空間的大數(shù)組或者底層的文件處理等。在Java中可以用3種進(jìn)制來表示整數(shù),分別如下。2.1.2浮點(diǎn)型浮點(diǎn)型用來表示有小數(shù)部分的數(shù)值,包括float型和double型。這兩種數(shù)據(jù)類型全部為有符號數(shù)。浮點(diǎn)型數(shù)據(jù)默認(rèn)為double型,因此要使用float型字面常量時(shí),必須添加后綴F或f,示例如下所示。floatx=12.3456;//錯誤的情況floaty=12.3456F;//正確的情況使用double型數(shù)據(jù)時(shí),可以添加后綴D或d,也可以不用添加,例如:doubled=12.3456789;//正確的情況doubled=12.3456789D;//也是正確的情況2.1.3char型char型用來表示字符。每個char型變量占16bit,即兩個字節(jié)。在Java中,字符的編碼不是ASCII碼,而是采用Unicode編碼。Unicode編碼字符是用16位無符號整數(shù)表示的,有216個可能值,即0~65
535??梢员硎灸壳笆澜缟系拇蟛糠治淖终Z言中的字符。當(dāng)然,中文字符占了其中相當(dāng)?shù)囊徊糠?。一般情況下,char類型數(shù)據(jù)被表示為用一對單引號包含的單個字符,例如:charc1=‘n’;charc2=‘@’;2.1.4boolean型boolean型的取值范圍很簡單,非“True”即“False”,用來表示邏輯值的“真”或“假”。其字面常量也只有“True”和“False”兩種選擇,例如:booleanb1=True;booleanb2=False;在C++中用數(shù)值或指針可以代替boolean值,0相當(dāng)于False,非0相當(dāng)于True。但是在Java中沒有這樣的規(guī)定,boolean型的值不能與任何其他基本類型的值進(jìn)行轉(zhuǎn)換代替。2.1.5基本數(shù)據(jù)類型值間的轉(zhuǎn)換在開發(fā)Java程序的過程中經(jīng)常需要把不同基本數(shù)據(jù)類型的值進(jìn)行相互轉(zhuǎn)換。Java中基本數(shù)據(jù)類型的值進(jìn)行轉(zhuǎn)換主要包括3種情況,分別為自動轉(zhuǎn)換、手動強(qiáng)制轉(zhuǎn)換和隱含強(qiáng)制轉(zhuǎn)換。1.自動轉(zhuǎn)換2.強(qiáng)制類型轉(zhuǎn)換3.隱含強(qiáng)制轉(zhuǎn)換2.2變量變量主要用來保存數(shù)據(jù),是用標(biāo)識符命名的數(shù)據(jù)項(xiàng),是程序運(yùn)行過程中可以改變值的量。變量在程序中起著十分重要的作用,如存儲數(shù)據(jù)、傳遞數(shù)據(jù)、比較數(shù)據(jù)、簡練代碼、提高模塊化程度和增加可移植性等。要使用變量,首先要聲明變量。2.2.1變量聲明前面提到,Java是強(qiáng)類型的語言,即每一個變量必須有一個數(shù)據(jù)類型。為了描述一個變量名和類型必須采用如下的方式聲明一個變量:變量類型變量名變量聲明包括兩項(xiàng)內(nèi)容:變量名和變量的類型。變量聲明的位置決定了該變量的作用域。在程序中,通過變量名來引用變量包含的數(shù)據(jù)。變量的類型決定了它可以容納什么類型的數(shù)值以及可以對它進(jìn)行怎樣的操作。2.2.2變量名和變量類型在Java語言中,程序通過變量名來使用變量的值。變量名應(yīng)滿足如下3個要求:必須是一個合法的標(biāo)識符。不能是關(guān)鍵字或者保留字(如true、false或者null)。在同一個作用域中必須是唯一的。Java語言規(guī)定標(biāo)識符由字母、下劃線(_)、美元符($)和數(shù)字組成,且第一個字符不能是數(shù)字。其中,字母包括大小寫字母、漢字等。Java語言使用Unicode字符集,它包含65
535個字符,適用于多種人類自然語言。2.2.3變量的初始化變量可以在它們聲明的時(shí)候初始化,也可以利用一個賦值語句來初始化。變量的數(shù)據(jù)類型必須與賦給它的數(shù)值的數(shù)據(jù)類型相匹配。下面是程序中的局部變量聲明,其初始化如下。
1 //整型2 intx=8,totle=1000;3 longy=12345678L;4 bytez=55;5 shorts=128;6 //浮點(diǎn)型7 floatf=234.5F;8 doubled=-1.5E-8,square=95.8;9 //其他類型10 charc='a';11 booleant=true;2.2.4final變量可以在任何作用域聲明一個final變量。final變量的數(shù)值在初始化之后不能再進(jìn)行改變。這樣的變量和其他語言中的常量很相似。為了聲明一個final變量,可以在類型之前的變量聲明使用final關(guān)鍵字,例如:
finalfloatpiVar=3.14159;
這個語句聲明了一個final變量并對它進(jìn)行了初始化。如果在后面還想給piVar賦其他的值,就會導(dǎo)致編譯錯誤,因?yàn)閒inal變量的值不能再改變。2.3運(yùn)算符有了數(shù)據(jù),就可以對其進(jìn)行操作,本節(jié)將介紹實(shí)現(xiàn)對操作數(shù)據(jù)的各種運(yùn)算符。Java中的運(yùn)算符主要分以下幾類。算術(shù)運(yùn)算符關(guān)系和邏輯運(yùn)算符位運(yùn)算符賦值運(yùn)算符其他運(yùn)算符2.3.1算術(shù)運(yùn)算符與大多數(shù)編程語言一樣,在Java中使用算術(shù)運(yùn)算符“+”、“”、“*”、“/”表示加、減、乘、除運(yùn)算。另外,求余運(yùn)算使用運(yùn)算符“%”表示,還有自增和自減運(yùn)算符。1.加運(yùn)算符“+”加法運(yùn)算,就是將兩個操作數(shù)進(jìn)行求和操作,且只能對數(shù)值型數(shù)據(jù)進(jìn)行。2.3.1算術(shù)運(yùn)算符2.減運(yùn)算符“”減法運(yùn)算功能,就是將兩個操作數(shù)相減,只能對數(shù)值型數(shù)據(jù)進(jìn)行,其一般形式如下:op1-op23.乘法運(yùn)算符“*”使用“*”運(yùn)算符將進(jìn)行乘法運(yùn)算,但需要注意的是,此運(yùn)算同樣遵循類型自動提升的規(guī)則,2.3.1算術(shù)運(yùn)算符4.除法運(yùn)算符“/”使用“/”運(yùn)算符將進(jìn)行除法運(yùn)算,此運(yùn)算也滿足類型提升規(guī)則。根據(jù)操作數(shù)的不同,除法又分為整數(shù)除和浮點(diǎn)除。5.取余運(yùn)算符“%”使用“%”運(yùn)算符將進(jìn)行求余運(yùn)算(取模運(yùn)算),實(shí)質(zhì)就是將左邊的操作數(shù)除以右邊的操作數(shù),余數(shù)便是得到的結(jié)果,此運(yùn)算也遵循類型自動提升的規(guī)則。2.3.1算術(shù)運(yùn)算符6.自增/自減運(yùn)算符除了上述的運(yùn)算符以外,還有自增和自減兩種簡單的算術(shù)運(yùn)算符。它們分別是“++”和“”。“++”是完成自加1的運(yùn)算;而“”是完成自減1的運(yùn)算。不管是“++”還是“”都可能出現(xiàn)在運(yùn)算對象的前面(前綴形式)或者后面(后綴形式),但是它們的作用是不一樣的。前綴形式為++op或op,它在加/減之后才計(jì)算運(yùn)算對象的數(shù)值;而后綴形式為op++或op,它在加/減之前就計(jì)算運(yùn)算對象的數(shù)值。2.3.2關(guān)系和邏輯運(yùn)算符關(guān)系運(yùn)算符用于比較兩個值,并根據(jù)它們的關(guān)系給出相應(yīng)的取值。例如,“!=”在兩個運(yùn)算對象不相等的情況下返回true。2.3.3位運(yùn)算符位運(yùn)算符是對操作數(shù)以二進(jìn)制位為單位進(jìn)行的操作和運(yùn)算,其結(jié)果均為整型量。位運(yùn)算符分為移位運(yùn)算符和邏輯位運(yùn)算符。2.3.4賦值運(yùn)算符賦值是編程中最常用的運(yùn)算之一,Java中的賦值運(yùn)算有兩種:普通賦值運(yùn)算和運(yùn)算賦值運(yùn)算,下面將對這兩種賦值運(yùn)算符進(jìn)行介紹。1.普通賦值運(yùn)算2.運(yùn)算賦值運(yùn)算2.3.5其他運(yùn)算符除了上面介紹的幾類運(yùn)算符之外,Java語言還支持其他一些運(yùn)算符,1.“?:”運(yùn)算符“?:”運(yùn)算符是一個條件運(yùn)算符,相當(dāng)于一個簡化的if-else語句。2.“[]”運(yùn)算符可以使用方括號來聲明數(shù)組、創(chuàng)建數(shù)組以及訪問數(shù)組中的元素。2.3.5其他運(yùn)算符3.點(diǎn)運(yùn)算符“.”點(diǎn)運(yùn)算符“.”用來訪問對象實(shí)例或者訪問類的成員變量或成員方法。4.“()”運(yùn)算符當(dāng)聲明或調(diào)用一個方法的時(shí)候,可以在“()”之間列出方法的參數(shù),也可以利用“()”來指定一個空的參數(shù)列表。2.3.5其他運(yùn)算符5.“(type)”運(yùn)算符這個運(yùn)算符可以將某個類型的值或?qū)ο筠D(zhuǎn)換為type類型。6.“new”運(yùn)算符可以使用“new”運(yùn)算符來創(chuàng)建一個新對象或者一個新數(shù)組。7.“instanceof”運(yùn)算符“instanceof”運(yùn)算符用來測試第一個運(yùn)算對象是否是第二個運(yùn)算對象的實(shí)例,2.4表達(dá)式和語句表達(dá)式和語句都屬于Java的語法,也是Java編程中最重要、最基礎(chǔ)的部分。幾乎所寫的任何東西都是一個表達(dá)式;而語句則是完整的表達(dá)式單元。2.4.1表達(dá)式表達(dá)式是由運(yùn)算符、操作數(shù)和方法調(diào)用,按照語言的語法構(gòu)造而成的符號序列。表達(dá)式可用于計(jì)算一個公式的值、為變量賦值以及輔助控制程序的執(zhí)行流程。表達(dá)式主要用來進(jìn)行計(jì)算,并返回計(jì)算結(jié)果。表達(dá)式返回?cái)?shù)值的數(shù)據(jù)類型取決于在表達(dá)式中使用的元素。例如,如果aInt是整型,則表達(dá)式aInt=10返回一個整型的值。Java語言允許將多個子表達(dá)式構(gòu)造成復(fù)合表達(dá)式。下面是一個復(fù)合表達(dá)式的例子:(x*y*z)/w
在這個例子中,括號內(nèi)各個運(yùn)算對象的先后順序不是很重要,因?yàn)槌朔ǖ慕Y(jié)果跟順序無關(guān)。但是對于其他表達(dá)式并不都是這樣,例如:
x+y/100
它關(guān)系到是先除還是先加的問題。2.4.2語句語句是一個執(zhí)行程序的基本單元,它類似于自然語言的句子。Java語言的語句可分為以下幾類?!?表達(dá)式語句● 復(fù)合語句● 控制語句● 包語句和引入語句其中,表達(dá)式語句是用分號“;”結(jié)尾,具體包括如下幾種。● 賦值表達(dá)式語句● ++、語句● 方法調(diào)用語句● 對象創(chuàng)建語句● 變量的聲明語句2.5控制結(jié)構(gòu)程序的結(jié)構(gòu)大致可分為3類:順序、選擇和循環(huán)。順序結(jié)構(gòu)即語句按預(yù)定順序依次執(zhí)行,無需干預(yù)。流程的控制主要體現(xiàn)在“選擇”和“循環(huán)”。選擇對應(yīng)于分支結(jié)構(gòu),利用條件可以實(shí)現(xiàn)程序中的哪些部分要執(zhí)行而哪些部分要被跳過。條件模擬了日常中的選擇行為。循環(huán)結(jié)構(gòu)可以使特定的代碼塊反復(fù)執(zhí)行。當(dāng)然,循環(huán)不是無限次執(zhí)行代碼塊,它根據(jù)條件判斷循環(huán)的開始和結(jié)束。當(dāng)有大量要處理的代碼,而且不能確定這些代碼需要執(zhí)行多少次時(shí),循環(huán)就顯得尤其有用。2.5.1條件語句條件語句的基本功能是使程序在不同的情況下,執(zhí)行不同的代碼。這樣程序就不只是順序執(zhí)行了,可以按照預(yù)先設(shè)定的邏輯走不同的流程。Java中的條件語句有兩種,if條件語句與switch多分支語句。首先介紹if條件語句。1.if條件語句:if條件語句的基本語法如下:if(<表達(dá)式>){語句序列}2.switch分支語句:Java中實(shí)現(xiàn)多分支還有一個選擇,就是使用switch分支語句。switch語句比if語句要復(fù)雜。2.5.2循環(huán)語句在程序設(shè)計(jì)過程中,經(jīng)常需要重復(fù)執(zhí)行相同的代碼,這時(shí)就要使用循環(huán)流程。Java中用來實(shí)現(xiàn)循環(huán)流程的語句有以下3種。while語句do-while語句for語句1.while循環(huán)while循環(huán)適用于不知道代碼需要被重復(fù)的次數(shù),但有明確的終止條件的循環(huán)流程。其基本語法如下所示:
while(<條件表達(dá)式>) {語句序列}2.do-while循環(huán)與while循環(huán)不同,do-while循環(huán)先執(zhí)行一次循環(huán)體再計(jì)算條件表達(dá)式的值,所以不論條件表達(dá)式返回什么值,都將至少執(zhí)行一次循環(huán)體,其語法為:
do{語句序列}while(條件表達(dá)式);3.for循環(huán)for循環(huán)通常用于明確知道循環(huán)體需要執(zhí)行的次數(shù)的程序,此時(shí)使用for循環(huán)是最佳選擇。2.5.3跳轉(zhuǎn)語句Java語言有3種跳轉(zhuǎn)語句?!?break語句在Java中break語句有兩個用途,一是在switch語句中,表示一個case的結(jié)束,退出switch;二是作為循環(huán)控制語句,在循環(huán)體中表示退出循環(huán)。第一種用途已經(jīng)在前面進(jìn)行了介紹,這里主要討論第二種。● continue語句continue也是循環(huán)控制語句,也起中斷循環(huán)的作用,與break不同的是,continue只是中斷當(dāng)次循環(huán)。在循環(huán)體中,當(dāng)continue執(zhí)行時(shí),本次循環(huán)結(jié)束,進(jìn)入條件判斷,如果條件滿足,進(jìn)入下一次循環(huán)?!?return語句ava語言有3種跳轉(zhuǎn)語句。return語句用于函數(shù)或方法的返回,其一般形式如下所示。
return表達(dá)式;2.6字符串字符串指的是字符序列。Java中的字符串分為兩類:字符串常量和字符串變量。字符串常量,包括直接字符串常量和String類的對象。字符串常量的值一旦創(chuàng)建不會再變動。字符串變量,指的是StringBuffer類的對象。創(chuàng)建字符串變量的值之后允許對其進(jìn)行擴(kuò)充、修改。Java語言提供了兩種字符串類型,String類型(字符串類型)及StringBuffer類型(字符串緩沖器類型)。Java語言為String類、StringBuffer類提供了許多方法,如比較串、求子串、檢索串等,以提供各種串的運(yùn)算與操作,詳細(xì)內(nèi)容將在下面介紹。2.6.1String類型String類型建立的字符串不能更改,如果程序需要使用字符串常數(shù),String類型比較合適。1.String字符串創(chuàng)建創(chuàng)建String字符串的最簡單方式是使用字符串文本。要聲明字符串文本,須使用雙直引號(")字符。2.String類型字符串的操作在Java中為String類定義了一些操作字符串的方法,2.6.2StringBuffer類型StringBuffer類型存入的字符串是可以改變的,如果字符串內(nèi)容經(jīng)常改變,應(yīng)使用StringBuffer類型。1.StringBuffer對象的創(chuàng)建2.StringBuffer類的方法2.7數(shù)組數(shù)組是一種數(shù)據(jù)結(jié)構(gòu),其功能是用來存儲同一類型的值。與大多數(shù)語言一樣,Java中也有數(shù)組,本節(jié)將介紹如何對數(shù)組進(jìn)行聲明、創(chuàng)建、初始化。最后,將介紹有關(guān)數(shù)組應(yīng)用的一些常用操作與工具。2.7.1數(shù)組的聲明與創(chuàng)建數(shù)組中的元素可以是基本數(shù)據(jù)類型,也可以是對象引用類型。但不論其元素是何種類型,數(shù)組本身是對象,這是Java中數(shù)組不同于其他語言數(shù)組之處。1.?dāng)?shù)組聲明聲明數(shù)組時(shí),需要提供數(shù)組將要保存元素的類型以及該數(shù)組的維數(shù)兩方面的信息。維數(shù)通過方括號的對數(shù)來指出,方括號對可以位于數(shù)組左邊也可以位于其右邊。2.7.1數(shù)組的聲明與創(chuàng)建2.創(chuàng)建數(shù)組對象創(chuàng)建數(shù)組對象使用關(guān)鍵字new,基本語法如下。new元素類型[第一維維數(shù)][第二維維數(shù)]……下面的代碼說明了如何創(chuàng)建數(shù)組對象。newint[5] ; //創(chuàng)建了int型長度為5的一維數(shù)組對象newString[6][5]; //創(chuàng)建了String型,第一維長度為6第二維長度為5的二維數(shù)組對象2.7.2數(shù)組的初始化數(shù)組的初始化是指為數(shù)組中的元素賦初值。在Java中數(shù)組的初始化主要包括默認(rèn)初始化、利用循環(huán)初始化、枚舉初始化。下面將分別介紹這些內(nèi)容。1.默認(rèn)初始化不論是什么類型的數(shù)組,從創(chuàng)建開始,系統(tǒng)便會默認(rèn)為其每個元素賦初值。類型 默認(rèn)值 類型 默認(rèn)值boolean False int 0byte 0 long 0Lshort 0 float 0.0Fchar \u0000 double 0.02.7.2數(shù)組的初始化2.利用循環(huán)初始化3.枚舉初始化如果數(shù)組元素需要的初始值與默認(rèn)值不同,但又沒有明顯的規(guī)律,而且數(shù)量不多,則可以使用枚舉初始化。所謂枚舉初始化是指在創(chuàng)建數(shù)組對象的同時(shí)逐一列舉出所有元素的初始值,基本語法如下。數(shù)組類型[]數(shù)組引用標(biāo)識符=new數(shù)組類型[]{第一個元素的值,第二個元素的值,……}2.7.3數(shù)組的常用操作前面幾小節(jié)介紹了聲明、創(chuàng)建以及初始化數(shù)組的方法。本小節(jié)將介紹幾種數(shù)組中常用的操作,從而幫助讀者更加方便地操縱數(shù)組。1.?dāng)?shù)組排序?qū)?shù)組中的元素進(jìn)行排序也是開發(fā)中常用的,Java中也提供了完成這種功能的方法。Java中的數(shù)組排序方法可以分為兩種:對整個數(shù)組排序和對數(shù)組指定區(qū)間排序。他們對應(yīng)的方法格式分別如下所示。2.7.3數(shù)組的常用操作2.查找指定元素在實(shí)際開發(fā)中,經(jīng)常需要在指定的數(shù)組中查找特定元素的位置,Java中也提供binarySearch方法來幫助開發(fā)人員進(jìn)行查找操作,該方法格式如下所示。publicstaticintbinarySearch(X[]a,Xkey)2.7.3數(shù)組的常用操作3.比較數(shù)組中的元素在實(shí)際開發(fā)中有時(shí)需要比較兩個數(shù)組中的元素值是否相同,這在Java中也不用自己開發(fā)代碼,只要調(diào)用Arrays類的equals方法即可。2.8命名規(guī)范命名規(guī)范主要指的是標(biāo)識符的命名規(guī)范。前面的介紹中涉及到了Java中的類名、變量名、方法名等,它們都是標(biāo)識符。只要編寫代碼,就不可避免地要使用標(biāo)識符。標(biāo)識符的規(guī)范與否極大地影響著源代碼的正確性、可讀性和可維護(hù)性。本節(jié)將介紹如何為標(biāo)識符命名,主要包括命名標(biāo)識符的語法規(guī)則、提倡的標(biāo)識符命名習(xí)慣兩方面的內(nèi)容。2.8.1標(biāo)識符命名規(guī)則標(biāo)識符是一個以字母開頭,由字母或數(shù)字組成的字符序列,具體的命名規(guī)則如下。 字母包括“A”~“Z”、“a”~“z”、“_”、“$”以及在某種語言中代表字母的任何Unicode字符。與大多數(shù)編程語言相比,Java中“字母”的范圍要大得多,不單包含英文字母,還包括希臘字母。數(shù)字包括“0”~“9”。“+”和“?”這樣的特殊符號不能出現(xiàn)在標(biāo)識符中,空格也不行。標(biāo)識符中的字符大小寫敏感,而長度沒有限制。能將Java中的關(guān)鍵字(如int、double等)用做標(biāo)識符名。2.8.2Java中提倡的命名習(xí)慣 有些標(biāo)識符雖然是正確的,但是卻不提倡使用。因?yàn)椴磺‘?dāng)?shù)拿?xí)慣將會大大降低源代碼的可讀性。聲明標(biāo)識符時(shí),應(yīng)盡量采用一些有意義的英文單詞來組成標(biāo)識符,最好有規(guī)律地使用大小寫,以便增強(qiáng)源代碼的可讀性。下面從幾個不同方面介紹如何正確地使用大小寫。● 包名:盡可能的全部使用小寫,如com.silence?!?類名或接口名:通常應(yīng)該由名詞組成,名稱內(nèi)所有單詞的第一個字母都大寫,其他字母小寫,如WelcomeTom?!?方法名:通常第一個單詞應(yīng)該是動詞,第一個字母應(yīng)該小寫,如果有其他單詞,則其他單詞的第一個字母大寫,其余字母小寫,如isEmpty()?!?變量名:成員變量的大小寫規(guī)則與方法名相同,局部變量應(yīng)該盡可能全部使用小寫,只有臨時(shí)變量(如循環(huán)變量)可以使用單字符名稱,如currentIndex、name?!?常量名:名字應(yīng)該全是大寫字母,使用下劃線分隔單詞,如MAX_HEIGHT。2.9注釋與其他編程語言一樣,Java的源代碼中也允許出現(xiàn)注釋,并且注釋也不會影響程序的執(zhí)行,只是起到提示開發(fā)人員的作用。在Java中,有3種不同功能的注釋,分別為單行注釋、區(qū)域注釋與文檔注釋,本節(jié)將對這些注釋的使用進(jìn)行介紹。2.9.1單行注釋單行注釋用于為代碼中的單個行添加注釋??梢宰⑨尩魡涡写a,也可以為一段代碼實(shí)現(xiàn)的功能添加一個簡短的說明。單行注釋是最常用的一種注釋方式。其語法格式是:用“//”表示注釋開始,注釋內(nèi)容從“//”開始到本行結(jié)尾。下面的代碼中使用了單行注釋。System.out.println("HelloJava!!!"); //打印HelloJava!!!2.9.2區(qū)域注釋對于長度為幾行的注釋,可以使用區(qū)域注釋(又稱“多行注釋”)。開發(fā)人員通常使用區(qū)域注釋描述文件、數(shù)據(jù)結(jié)構(gòu)、方法和文件說明。它們通常放在文件的開頭和方法的前面或內(nèi)部。要創(chuàng)建區(qū)域注釋,請?jiān)谧⑨屝虚_頭添加/*,在注釋塊末尾添加*/。此方法允許創(chuàng)建很長的注釋,而無需在每一行的開頭都添加//。若對多個連續(xù)的行使用//,在修改注釋時(shí)可能會產(chǎn)生一些問題。2.9.3文檔注釋文檔注釋用于描述Java的類、接口、構(gòu)造器、方法以及字段(field)。文檔注釋(doccomments)是Java獨(dú)有的,并可通過javadoc工具轉(zhuǎn)換成HTML文件。每個文檔注釋都會被置于注釋定界符/**和*/之中,一個注釋對應(yīng)一個類、接口或成員。該注釋應(yīng)位于聲明之前,如下面的代碼所示。/***Doc類的主要功能是...*/publicclassDoc{...}2.10小結(jié)本章首先介紹了Java中8種基本數(shù)據(jù)類型及其之間的轉(zhuǎn)換;然后分別介紹了Java語言中的變量、運(yùn)算符、表達(dá)式和控制結(jié)構(gòu);另外,還介紹了數(shù)組和字符串兩種常用的引用類型;最后,介紹了Java中標(biāo)識符的命名規(guī)則和源代碼注釋的基本用法。在后續(xù)章節(jié)中,通過結(jié)合具體的操作,讀者對這些Java語言的基礎(chǔ)會有更深的了解,并能熟練應(yīng)用。第3章類與對象從本章開始,將深入講解面向?qū)ο蟮乃枷牒腿绾卫肑ava語言進(jìn)行面向?qū)ο缶幊獭n惡蛯ο笫荍ava面向?qū)ο缶幊讨蟹浅V匾母拍?。本章首先講述面向?qū)ο蟮幕A(chǔ)知識,而后講解Java類和對象的創(chuàng)建和使用,以及如何使用方法、包、訪問控制等特性。3.1面向?qū)ο蟪绦蛟O(shè)計(jì)概述面向?qū)ο蟪绦蛟O(shè)計(jì)(ObjectOrientedProgramming,OOP)是當(dāng)今主流的程序設(shè)計(jì)方式,取代了20世紀(jì)70年代的“過程化”程序設(shè)計(jì)。Java是純面向?qū)ο蟮恼Z言,用其進(jìn)行面向?qū)ο蟮能浖_發(fā)是非常方便、高效的。本節(jié)將在第1章的基礎(chǔ)上,對面向?qū)ο蟮幕A(chǔ)知識進(jìn)行簡單的介紹,主要包括面向?qū)ο蟪绦蛟O(shè)計(jì)的相關(guān)術(shù)語、面向過程與面向?qū)ο蟪绦蛟O(shè)計(jì)思想的對比、面向?qū)ο蠹夹g(shù)的優(yōu)點(diǎn)等3方面的內(nèi)容。3.1.1面向?qū)ο笮g(shù)語OOP是與具體的語言無關(guān)的,無論在C++還是在Java中,OOP的思想是通用的。OOP利用特殊約定的詞匯描述相關(guān)特性,盡管這些詞匯與生活習(xí)慣相近,但是為避免歧義,在學(xué)習(xí)OOP前,仍需要了解OOP相關(guān)術(shù)語。這里只對其中最為重要的進(jìn)行簡要的介紹,包括:類、對象、接口、封裝、繼承。3.1.1面向?qū)ο笮g(shù)語 1.對象前面的章節(jié)中曾詳細(xì)地講述了對象的概念。這里以現(xiàn)實(shí)世界中的一個對象為例,如一只貓、可以說貓具有許多屬性(或狀態(tài)),如貓名、貓齡和顏色;貓還具有各種行為,如睡覺、吃食和發(fā)出叫聲。在OOP的世界里,對象也具有許多屬性和行為。使用面向?qū)ο蟮募夹g(shù),就可以以一只貓建立一個模型。3.1.1面向?qū)ο笮g(shù)語 2.類類是OOP中最重要的術(shù)語。通常情況下,類被稱為模板或者藍(lán)本。對象就是由這些模板或者藍(lán)本產(chǎn)生的。屬于某個類的特性和行為總稱為該類的成員。這里仍以上面提到的貓為例,貓的特性,包括貓名、貓齡和顏色稱為類的屬性,用變量表示;而貓的行為如玩、睡覺稱為類的方法,用函數(shù)表示。3.1.1面向?qū)ο笮g(shù)語 3.繼承OOP的主要優(yōu)點(diǎn)之一是使用繼承實(shí)現(xiàn)類之間的共享數(shù)據(jù)和方法的機(jī)制。在我們?nèi)粘I钪?,兒子總會繼承父親的一些特性:所有種類的汽車都需要實(shí)現(xiàn)汽車的基本功能;所有種類的電腦都需要實(shí)現(xiàn)電腦的基本功能,諸如此類的例子很多。而這些現(xiàn)象,都可以使用繼承來實(shí)現(xiàn)。新建的類稱為子類,該類需要繼承的類稱為超類或者父類。3.1.1面向?qū)ο笮g(shù)語 4.接口接口可以描述為類定義的模板,實(shí)現(xiàn)接口的類實(shí)現(xiàn)該模板。在貓的示例中,接口類似于貓的藍(lán)圖:通過藍(lán)圖可了解需要的部分,但并不一定提供關(guān)于這些部分的組裝方法或工作原理的信息??蓪⒔涌诳醋魇怯糜趯蓚€若沒有接口便沒有任何關(guān)系的類關(guān)聯(lián)起來的“編程約定”。例如,多個程序員一起工作,每個程序員開發(fā)同一個應(yīng)用程序的不同部分(類)。設(shè)計(jì)應(yīng)用程序時(shí),約定不同的類使用一組方法進(jìn)行通信。因此,創(chuàng)建一個接口用以聲明這些方法、方法的參數(shù)及其返回類型。任何實(shí)現(xiàn)此接口的類都必須提供這些方法的定義,否則將出現(xiàn)編譯錯誤。3.1.1面向?qū)ο笮g(shù)語 5.封裝封裝是OOP中另一個非常重要的概念,也稱為數(shù)據(jù)隱藏。在完美的面向?qū)ο蟮脑O(shè)計(jì)中,對象被看作包含或封裝功能的“黑匣子”。程序員應(yīng)當(dāng)能夠在僅知道對象的屬性、方法和事件的情況下與對象進(jìn)行交互,而不需知道其實(shí)現(xiàn)的詳細(xì)信息。此方法使程序員可以在更高的抽象層次上思考,并能提供可用于構(gòu)建復(fù)雜系統(tǒng)的組織框架。同時(shí)利用封裝可以進(jìn)行成員訪問控制。成員的詳細(xì)信息對于對象外的代碼是私有的和不可見的。3.1.2面向?qū)ο蟪绦蛟O(shè)計(jì)方法的優(yōu)點(diǎn)利用面向?qū)ο蟮乃枷肭蠼鈫栴},使人們的編程與實(shí)際的世界更加接近,所有的對象被賦予屬性和方法,使編程更加富有人性化。同時(shí)利用OOP求解問題,具有更好的重用性、可擴(kuò)展性、更易管理和維護(hù)。3.1.2面向?qū)ο蟪绦蛟O(shè)計(jì)方法的優(yōu)點(diǎn)1.可重用性軟件由各個模塊組成,可重用性就是該軟件的模塊可以被重復(fù)利用,不僅用于該項(xiàng)目,還可用于其他項(xiàng)目。對于代碼級,可重用性指類或者方法的重復(fù)使用,避免對于同一功能多次實(shí)現(xiàn)產(chǎn)生多余代碼??芍赜眯允荗OP的一個核心思想。OOP中的抽象、繼承、封裝等都可服務(wù)于可重用性。利用可重用性構(gòu)建程序,優(yōu)點(diǎn)是顯而易見,不僅減少工作量,提高工作效率;利用已有的模塊進(jìn)行開發(fā),更能夠提高程序質(zhì)量。3.1.2面向?qū)ο蟪绦蛟O(shè)計(jì)方法的優(yōu)點(diǎn)2.可擴(kuò)展性可擴(kuò)展性即軟件或者程序能夠很方便地進(jìn)行修改和擴(kuò)充。對于軟件產(chǎn)品來說,修改和擴(kuò)充是必不可少的,一是不斷地修訂保證程序的穩(wěn)定;二是可以不斷滿足用戶新的需求。由于繼承、封裝、多態(tài)等特性,面向?qū)ο蠓椒梢栽O(shè)計(jì)出高內(nèi)聚、低耦合的系統(tǒng)結(jié)構(gòu),使得系統(tǒng)更靈活,更容易擴(kuò)展,而且成本較低。3.1.2面向?qū)ο蟪绦蛟O(shè)計(jì)方法的優(yōu)點(diǎn)3.易于管理和維護(hù)面向過程的開發(fā)方法,都是以函數(shù)為基本單元。所以當(dāng)開發(fā)項(xiàng)目不斷擴(kuò)大時(shí),這樣的函數(shù)單元將變得不計(jì)其數(shù),顯示這樣是不利于管理和維護(hù)的。而使用OOP后,以類作為開發(fā)的基本模塊,由于繼承的存在,即使改變需求,那么維護(hù)也只是在局部模塊,所以維護(hù)起來是非常方便的,成本也較低。3.2面向?qū)ο笈cUML建模上一節(jié)已經(jīng)詳細(xì)講述了對象以及面向?qū)ο缶幊痰幕靖拍?。面向?qū)ο笫侨藗兯伎棘F(xiàn)實(shí)世界的一種自然方法,也是編寫計(jì)算機(jī)程序的一種自然方法,在軟件的分析和設(shè)計(jì)過程中,面向?qū)ο蟮乃枷胍彩菬o處不在的。所以在構(gòu)建軟件的過程中,系統(tǒng)建模是非常關(guān)鍵的步驟,所以O(shè)OP也與建模緊密地結(jié)合在一起。本節(jié)主要介紹軟件工程中建模的重要性,UML以及使用UML表達(dá)面向?qū)ο蟆?.2.1為什么需要建模建模是一項(xiàng)經(jīng)過檢驗(yàn)并被廣為接受的工程技術(shù)。建立房屋和大廈的建筑模型,能幫助用戶得到實(shí)際建筑物的印象,甚至可以建立數(shù)學(xué)模型來分析大風(fēng)或地震對建筑物造成的影響。如果真正想建造一個相當(dāng)于房子或大廈類的軟件系統(tǒng),問題不僅僅是編寫許多軟件的問題。關(guān)鍵是要編出正確的軟件,并考慮如何少寫代碼,減少軟件的打消。所以要生產(chǎn)合格的軟件就要有一套關(guān)于體系的結(jié)構(gòu)、過程和工具的規(guī)范。如果對體系結(jié)構(gòu)、過程或工具的規(guī)范沒作任何考慮,猶如在沒有任何根基的地上蓋大樓,總有一天大樓會由于其自身的重量而倒塌。不成功的大樓將對大廈的租戶造成嚴(yán)重的影響,同樣,不成功的軟件也會對用戶和企業(yè)造成十分嚴(yán)重的影響。3.2.2UML建模語言UML就是統(tǒng)一建模語言(UnifiedModelingLanguage),是由OMG組織(ObjectManagementGroup,對象管理組織)在1997年發(fā)布的。UML的目標(biāo)之一就是為開發(fā)團(tuán)隊(duì)提供標(biāo)準(zhǔn)通用的設(shè)計(jì)語言來開發(fā)和構(gòu)建計(jì)算機(jī)應(yīng)用。UML提出了一套IT專業(yè)人員期待多年的統(tǒng)一的標(biāo)準(zhǔn)建模符號。通過使用UML,這些人員能夠閱讀和交流系統(tǒng)架構(gòu)和設(shè)計(jì)規(guī)劃—就像建筑工人多年來所使用的建筑設(shè)計(jì)圖一樣。3.2.3UML的面向?qū)ο蠓治鲈O(shè)計(jì)為了創(chuàng)建最好的解決方案,必須遵循從項(xiàng)目需求分析到開發(fā)這樣一個過程,如果按照面向?qū)ο蟮挠^點(diǎn),則稱其為面向?qū)ο蟮姆治龊驮O(shè)計(jì)(object-orientedanalysisanddesign,OOAD)。運(yùn)用UML進(jìn)行面向?qū)ο蟮南到y(tǒng)分析設(shè)計(jì),其過程通常由以下3個部份組成。1.識別系統(tǒng)的用例和角色2.進(jìn)行系統(tǒng)分析,并抽取類3.系統(tǒng)設(shè)計(jì),并設(shè)計(jì)類及其行為3.3Java語言與面向?qū)ο筇匦栽诮榻B完OOP后,本節(jié)將簡要介紹面向?qū)ο笏枷朐贘ava中的具體體現(xiàn),在后續(xù)的章節(jié)中將詳細(xì)介紹如何利用Java進(jìn)行面向?qū)ο缶幊?。Java是完全面向?qū)ο蟮恼Z言。對象是Java程序中最核心、最基礎(chǔ)的部分。在Java中,對象被映射為類(Class)。類是Java程序中最基本的單元。對象的任何行為都可以通過Java類中的方法實(shí)現(xiàn),而對象的屬性則可以通過Java類中的屬性來實(shí)現(xiàn)。1.Java中的類2.Java中的封裝3.Java中的繼承4.Java中的多態(tài)5.Java中的垃圾回收機(jī)制3.4類的定義和對象的創(chuàng)建在初步了解面向?qū)ο笏枷氲幕A(chǔ)上,從本節(jié)開始,將逐步介紹如何利用Java進(jìn)行面向?qū)ο缶幊?。類是Java中基本的編程單元,本節(jié)介紹如何定義類,如何利用類創(chuàng)建對象。3.4.1類的基本結(jié)構(gòu)如果一切都是對象,那么是什么決定某一類對象的外觀與行為呢?答案是“類”。類是構(gòu)造對象的模板或藍(lán)圖。就像建筑物與設(shè)計(jì)圖紙,通過一份設(shè)計(jì)圖紙,可以造出建筑物,而Java開發(fā)人員在編寫代碼時(shí),實(shí)際上是在編寫類代碼,對象只有程序運(yùn)行時(shí)才存在。當(dāng)用戶創(chuàng)建一個Java程序時(shí),可以通過類聲明來定義類,然后使用類來創(chuàng)建用戶需要的對象。類聲明是用來創(chuàng)建對象模板的抽象規(guī)格說明。在前面的一些章節(jié)中,已經(jīng)編寫過一些簡單的類,只是那些類一般只有main方法。3.4.2類之間的關(guān)系在面向?qū)ο笏枷胫?,類之間存在以下幾種常見的關(guān)系。1.“USES-A”關(guān)系“USES-A”關(guān)系是一種最明顯、最常見的關(guān)系,若類A的方法操縱了類B(對象)的成員,則稱之為類A“USES-A”(用到了)類B。例如,汽車啟動前檢查汽油是否足夠,例3-1說明了這個問題。2.“HAS-A”關(guān)系“HAS-A”關(guān)系是一種擁有關(guān)系,若類A中有B類型的成員引用變量,則類A“HAS-A”(擁有)類B。3.“IS-A”關(guān)系在面向?qū)ο笾小癐S-A”的概念是基于繼承的,旨在表達(dá)一個類是另一個類的子類。也就是說,若類A是類B子類的一種,則可以說類A“IS-A”(是一種)類B。例如,“蘋果”是“水果”的一種,則它們之間的關(guān)系為“蘋果”IS-A(是一種)“水果”。在后面章節(jié)中將結(jié)合繼承性對“IS-A”關(guān)系進(jìn)行詳細(xì)的介紹。3.4.3構(gòu)造函數(shù)在創(chuàng)建對象時(shí),對象的成員可以由構(gòu)造函數(shù)方法進(jìn)行初始化。構(gòu)造函數(shù)是一種特殊的方法,它具有和它所在的類完全一樣的名字。一旦定義好一個構(gòu)造函數(shù),創(chuàng)建對象時(shí)就會自動調(diào)用它。構(gòu)造函數(shù)沒有返回類型,這是因?yàn)橐粋€類的構(gòu)造函數(shù)的返回值的類型就是這個類本身。構(gòu)造函數(shù)的任務(wù)是初始化一個對象的內(nèi)部狀態(tài),所以用new操作符創(chuàng)建一個實(shí)例后,立刻就會得到一個可用的對象。3.4.4類成員定義了類之后,就可以在類體中聲明兩種類的成員,成員變量與成員方法。本節(jié)介紹與成員變量開發(fā)相關(guān)的一些知識,主要包括成員變量的開發(fā)與使用、成員變量的初始值以及對象引用變量的比較等內(nèi)容。1.成員變量的使用成員變量就是類的屬性,類定義中的屬性指定了一個對象區(qū)別于其他對象的值。例如,學(xué)生類的定義中包括年齡、姓名和班級這些屬性,每個對象的這些屬性都有自己的值。所有由類定義建立的對象都共享類的方法,但是,它們都擁有各自屬性變量的副本。2.成員變量的初始值每當(dāng)創(chuàng)建一個對象后,如果對象有成員變量,則系統(tǒng)會自動為其分配一個初始值,3.4.5對象的創(chuàng)建有了類就可以利用其來創(chuàng)建對象了,在Java中創(chuàng)建對象很簡單,只要使用new關(guān)鍵字即可。如下代碼創(chuàng)建了Student類的對象。
Students=newStudent();由類創(chuàng)建對象的過程稱為實(shí)例化,每個對象是類的一個實(shí)例,說明了類與對象的不同之處。學(xué)生類是對什么是學(xué)生做定義,而王強(qiáng)、李勇和馬躍是對象,是學(xué)生類的實(shí)例。
3.5方法在Java中,對對象的操作由方法來完成。要使一個對象完成某些工作,就要調(diào)用其相應(yīng)的方法。方法實(shí)際上描述的是一個行為,一種功能,決定了一個對象能夠接收什么樣的消息,做出什么反應(yīng)。本節(jié)介紹方法的定義以及方法的重載和遞歸。3.5.1方法的定義方法的基本組成包括:方法的聲明以及方法體,基本語法如下。
返回值類型方法名(參數(shù)序列){方法體}在sub方法中,入口參數(shù)有兩個,都是int型,方法的返回值為int型。。下面對方法的各組成部分進(jìn)行詳細(xì)介紹。1.參數(shù)序列2.方法體3.返回值類型3.5.2方法的重載方法重載是指在同一個類里面,有兩個或兩個以上具有相同名稱,不同參數(shù)序列的方法。例如,三角型類可以定義多個名稱為area的計(jì)算面積的方法,有的接收底和高做參數(shù),有的接收3條邊做參數(shù)。這樣做的好處是,使開發(fā)人員不必為同一操作的不同變體而絞盡腦汁取新的名字,同時(shí)也是使類的使用者可以更容易地記住方法的名稱。1.方法重載的規(guī)則2.重載方法的匹配3.5.3遞歸程序由方法組成,而方法又以層次的方式調(diào)用其他的方法,但有些時(shí)候,這些方法需要調(diào)用自身從而方便地求解一些特殊的問題。遞歸方法就是自調(diào)用方法,在方法體內(nèi)直接或間接地調(diào)用自己,即方法的嵌套是方法本身。遞歸的方式分為2種:直接遞歸和間接遞歸,下面分別介紹這2種遞歸。3.6靜態(tài)成員在Java中聲明類的成員變量和成員方法時(shí),可以使用static關(guān)鍵字把成員聲明為靜態(tài)成員。靜態(tài)變量也叫類變量,非靜態(tài)變量叫實(shí)例變量;靜態(tài)方法也叫類方法,非靜態(tài)方法叫實(shí)例方法。靜態(tài)成員最主要的特點(diǎn)是它不屬于任何一個類的對象,它不保存在任意一個對象的內(nèi)存空間中,而是保存在類的公共區(qū)域中。所以任何一個對象都可以直接訪問該類的靜態(tài)成員,都能獲得相同的數(shù)據(jù)值。修改時(shí),也在類的公共區(qū)域修改。本節(jié)介紹Java中靜態(tài)成員,包含靜態(tài)方法、變量和常量,以及一些特殊的靜態(tài)方法,如main方法和factory方法。3.6.1靜態(tài)方法和靜態(tài)變量通常情況下,方法必須通過它的類對象訪問。但是如果希望該方法的使用完全獨(dú)立于該類的任何對象,可以利用static關(guān)鍵字。通過該關(guān)鍵字可以創(chuàng)建這樣一個方法,它能夠被自己使用,而不必引用特定的實(shí)例。在方法的聲明前面加上static即可。使用static關(guān)鍵字的方法即靜態(tài)方法。如果一個方法被聲明為static,它就能夠在它的類的任何對象創(chuàng)建之前被訪問,而不必引用任何對象。但是在靜態(tài)方法中,不能以任何方式引用this或super。3.6.2靜態(tài)變量和常量在Java中沒有一個直接的修飾符來實(shí)現(xiàn)常量,而是通過靜態(tài)成員變量的方式來實(shí)現(xiàn)的,如下代碼說明了這個問題。
1 //聲明3個常量X、Y、Z2 publicstaticfinalintX=10;3 staticpublicfinalintY=20;4 finalstaticpublicintZ=40;
static表示屬于類,不必創(chuàng)建對象就可以使用,因?yàn)槌A繎?yīng)該不依賴于任何對象,final表示值不能改變。一般用作常量的靜態(tài)成員變量訪問權(quán)限都設(shè)置為public,因?yàn)槌A繎?yīng)該允許所有類或?qū)ο笤L問。3.6.3靜態(tài)成員的訪問上小節(jié)已經(jīng)介紹過靜態(tài)成員是屬于類的,因此對其進(jìn)行訪問應(yīng)該不需要創(chuàng)建對象,可以使用“<類名>.<靜態(tài)成員名>”的語法調(diào)用靜態(tài)成員變量。下面分別從兩個方面介紹同一個類中靜態(tài)成員與非靜態(tài)成員之間的訪問,靜態(tài)方法訪問非靜態(tài)成員和非靜態(tài)方法訪問靜態(tài)成員。3.6.4main()方法在Java中,main()方法是Java應(yīng)用程序的入口方法,也就是說,程序在運(yùn)行的時(shí)候,第一個執(zhí)行的方法就是main()方法,這個方法和其他的方法有很大的不同,比如方法的名字必須是main,方法必須是publicstaticvoid類型的,方法必須接收一個字符串?dāng)?shù)組的參數(shù)等等。因?yàn)閙ain()方法是由Java虛擬機(jī)調(diào)用的,所以必須為public,虛擬機(jī)調(diào)用main()方法的時(shí)候不需要產(chǎn)生任何對象,所以main方法聲明為static,且不需要返回值,所以聲明為void
所以最終格式如下所示。publicstaticvoidmain(String[]args)3.6.5Factory方法Java的靜態(tài)方法有一種常見的用途,就是使用Factory方法產(chǎn)生不同風(fēng)格的對象,例如NumberFormat類使用Factory方法產(chǎn)生不同風(fēng)格的格式對象。FactoryMethod是最常用的模式了,F(xiàn)actory方法在Java程序系統(tǒng)中可以說是隨處可見。Factory方法就相當(dāng)于創(chuàng)建實(shí)例對象的new,我們經(jīng)常要根據(jù)類Class生成實(shí)例對象,如Aa=newA(),FactoryMethod也是用來創(chuàng)建實(shí)例對象的,所以以后new時(shí)可以考慮實(shí)用工廠模式,雖然這樣做,可能多做一些工作,但會給系統(tǒng)帶來更大的可擴(kuò)展性和盡量少的修改量。3.7包在實(shí)際項(xiàng)目開發(fā)中,往往需要開發(fā)很多不同的類,能否方便高效地組織這些類對項(xiàng)目的開發(fā)與使用具有很重要的意義。Java中提供包(Package)將不同類組織起來進(jìn)行管理,借助于包可以方便地組織自己的類代碼,并將自己的代碼與別人提供的代碼庫分開管理。使用包的目的之一就是可以在同一個項(xiàng)目中使用名稱相同的類,假如兩個開發(fā)人員不約而同地建立了兩個相同名字的類,只要將其放置在不同的包中,就不會產(chǎn)生沖突。本節(jié)將從類的放置與導(dǎo)入兩個方面對包及其使用進(jìn)行介紹。3.7.1包的定義要想將類放入指定的包中,就必須使用package語句,語法如下。package<包名>;package語句必須放在源文件的最前面,其之前不可以有其他任何語句。每個源文件中最多有一句package語句,因?yàn)橐粋€類不可能屬于兩個包,就如同不能把一件衣服同時(shí)放進(jìn)兩個箱子一樣。包名可以是用點(diǎn)“.”分隔的一個序列,如java.lang,這就表示此源文件中的類在java包下的lang子包中。在實(shí)際開發(fā)中,包可能分很多級,越復(fù)雜的系統(tǒng),包越多,級也可能越多。3.7.2類的導(dǎo)入當(dāng)一個類要使用與自己處在同一個包中的類時(shí),直接訪問即可。若要使用其他包中的類就必須使用import語句,基本語法如下。import<包名>.*;import<包名>.類名;包名可以是一個由“.”分隔的序列,如“java.lang”、“java.util”等。第1種語法表示要使用指定包中所有的類,但不包括子包中的類,也稱為通配引入,“*”為通配符。第2種語法表示要使用指定包中一個特定的類。3.7.3靜態(tài)導(dǎo)入從JavaSE5.0開始,導(dǎo)入語句不但可以導(dǎo)入類,還具有導(dǎo)入靜態(tài)方法和靜態(tài)成員變量的功能,不過需要在關(guān)鍵字“import”和包名之間添加關(guān)鍵字“static”,語法如下。importstatic<包名>.<類名>.*;importstatic<包名>.<類名>.<具體方法/成員變量名>;“*”還是代表通配符,不過這里表示的是指定類下面所有靜態(tài)的方法或成員變量。如果要明確指明要使用的方法或成員變量,用第2行語法。碰到不同類下同名靜態(tài)方法或成員變量時(shí),解決沖突的方法類似上一小節(jié),這里不再贅述。3.8成員的訪問控制上一節(jié)已經(jīng)介紹了類的訪問控制,本節(jié)將介紹成員(包括方法和成員變量)的訪問控制。在介紹成員的訪問控制之前,首先需要了解的是成員的訪問指的是什么。成員的訪問是指以下兩種不同的操作。一個類中的方法代碼是否能夠訪問(調(diào)用)另一個類中的成員。一個類是否能夠繼承其父類的成員。3.8.1公共類型:public公共類型使用public關(guān)鍵字來進(jìn)行修飾,當(dāng)一個成員被聲明為public時(shí),所有其他類,無論該類屬于哪個包,均能夠訪問該成員。對于繼承而言,規(guī)則為如果父類的成員聲明為public,那么無論這兩個類是否在同一個包中,該子類都能繼承其父類的該成員。3.8.2私有類型:private本小節(jié)將介紹成員被標(biāo)識為私有類型后的含義與用法,并且在本小節(jié)最后將介紹面向?qū)ο笾械姆庋b及其優(yōu)點(diǎn)。標(biāo)識為私有類型的成員用private關(guān)鍵字修飾,其不能被該成員所在類之外的任何類中的代碼訪問。對于繼承而言,規(guī)則為如果父類的成員聲明為private,子類在任何情況下都不能繼承該成員。3.8.3默認(rèn)類型:default當(dāng)一個成員前面沒有寫任何訪問限制修飾符時(shí),其訪問權(quán)限為默認(rèn)類型。具有此訪問權(quán)限的成員,只對與此成員所屬類在同一個包中的類是可見的。也就是說,對同一個包中的類,默認(rèn)類型相當(dāng)于public,而對包外的類則相當(dāng)于private。下面的兩段代碼說明了默認(rèn)類型的使用。3.8.4保護(hù)類型:protected標(biāo)識為保護(hù)類型的成員用protected關(guān)鍵字修飾,其規(guī)則與默認(rèn)類型幾乎一樣,當(dāng)訪問該成員的類位于同一包內(nèi),則該類型成員的訪問權(quán)限相當(dāng)于public類型。只是有一點(diǎn)區(qū)別,若訪問該成員的類位于包外,則只有通過繼承才能訪問該成員。訪問限制修飾符不能用來修飾局部變量,否則將導(dǎo)致編譯報(bào)錯,而且局部變量作用域?yàn)榫植?,也沒有必要。3.9封裝封裝是一個面向?qū)ο蟮男g(shù)語,其含義很簡單,就是把東西包裝起來。換言之,成員變量和方法的定義都包裝于類定義之中,類定義可以看成是將構(gòu)成類的成員變量和方法封裝起來。通過限定類成員的可見性,可以使類成員中的某些屬性和方法能夠不被程序的其他部分訪問,它們被隱藏了起來,只能在定義的類中使用,這就是面向?qū)ο笾袑?shí)現(xiàn)封裝的方式。下面總結(jié)了Java中封裝需要遵循的規(guī)則。用訪問限制修飾符保護(hù)成員變量,通常是private。建立公有的訪問方法,強(qiáng)制調(diào)用代碼通過這些方法訪問成員變量。3.10利用系統(tǒng)已有的類通過前面幾節(jié)的介紹,讀者已經(jīng)對類的定義及對象的創(chuàng)建與使用有了一定的了解。本節(jié)將介紹Java類庫中提供的幾個常用的處理日期時(shí)間的類。通過對這幾個類的介紹,使讀者了解利用系統(tǒng)已有的類的思想。3.10.1Date類在標(biāo)準(zhǔn)Java類庫中包含一個Date類,其對象用來描述一個時(shí)間點(diǎn),如“September22,2007,23:59:59GMT”。在使用Date類時(shí)要在代碼的開始添加“importjava.util.Date”,這里可以理解為將其導(dǎo)入的意思,下一章將詳細(xì)介紹此語句的功能和用法。Date類與前面第3章介紹的Math類不同,在開發(fā)中不是訪問類的靜態(tài)方法,而是要使用其對象,可以用如下代碼創(chuàng)建Date對象。3.10.2GregorianCalendar類上小節(jié)中介紹的Date類,主要的功能是儲存時(shí)間點(diǎn)的信息,而對日期/時(shí)間的處理功能并不強(qiáng)大。其記錄的時(shí)間是距離一個固定時(shí)間點(diǎn)的秒數(shù)(可正可負(fù)),這個固定時(shí)間點(diǎn)是UTC時(shí)間1970年1月1日00:00:00(UTC即協(xié)調(diào)世界時(shí)間,是CoodinatedUniversalTime的縮寫,與GMT一樣是一種國際標(biāo)準(zhǔn)時(shí)間)。雖然Date類可以打印出類似于“February17,2007,23:59:59GMT”這樣的日期表示形式,但此形式只是公歷的表示方式,若需采用中國的農(nóng)歷表示日期,Date類就無能為力了。3.11小結(jié)本章簡單介紹了面向?qū)ο蟮乃枷?,并詳?xì)介紹了類的定義及其使用,訪問控制和封裝,最后通過對系統(tǒng)中提供的幾個類的介紹闡述了利用系統(tǒng)已有類的思想。通過本章的學(xué)習(xí),讀者可以構(gòu)造出自己的類,通過這些類的對象的相互協(xié)作,便能開發(fā)出具有一定功能的應(yīng)用程序。第4章繼承與多態(tài)上一章主要闡述了類和對象的概念。本章將學(xué)習(xí)面向?qū)ο蟪绦蛟O(shè)計(jì)中兩個重要的概念—繼承和多態(tài)。利用繼承,可以基于已經(jīng)存在的類構(gòu)造新類,還可以在新類中添加一些新的成員或修改繼承了的成員,以滿足新的需求。而多態(tài)是在繼承的基礎(chǔ)上引出的,可以解決子類父類中的成員重名問題。4.1繼承概述利用繼承可以很好地實(shí)現(xiàn)代碼重用問題。在利用已有的類構(gòu)造新類時(shí),新類保留已有類的屬性和行為,并可以根據(jù)要求添加新的屬性和行為。例如,卡車具有一般汽車的屬性,而特有的屬性就是載貨。在第3章中,曾經(jīng)介紹過類之間的關(guān)系:“USES-A”關(guān)系、“HAS-A”關(guān)系、“IS-A”關(guān)系。其中,“IS-A”關(guān)系是繼承的一個特征。4.1.1超類、子類被繼承的類一般稱為“超類”或“父類”,繼承的類稱為“子類”。當(dāng)子類繼承超類時(shí),不必寫出全部的實(shí)例變量和方法,只需聲明該類繼承了的已定義的超類的實(shí)例變量和方法即可。超類、子類是繼承中非常重要的概念,它們形象地描述了繼承的層次關(guān)系。繼承節(jié)省了定義新類的大量工作,可以方便地重用代碼。例如,把汽車作為父類,當(dāng)創(chuàng)建汽車的子類轎車時(shí),品牌、價(jià)格、最高時(shí)速等屬性會自動地被定義,調(diào)用剎車方法時(shí)會自動調(diào)用在汽車類中定義的剎車方法。但一個子類不必非要使用繼承下來的屬性和方法,一個子類可以選擇覆蓋已有的屬性和方法,或添加新的屬性和方法。4.1.2繼承層次繼承關(guān)系可以用樹形層次表達(dá)出來。為汽車類的繼承層次關(guān)系,注意,汽車類定義了品牌、價(jià)格、最高時(shí)速等屬性(成員變量),以及剎車、啟動等方法。當(dāng)定義繼承汽車類的子類卡車時(shí),它自動繼承汽車類的屬性和方法。繼承只是代碼重用的一種方式,濫用繼承會造成很嚴(yán)重的后果。只有當(dāng)需要向新類添加新的操作,并且把已存在類的默認(rèn)行為融合進(jìn)新類中時(shí),才需要繼承已存在的類。4.2Java中的繼承在Java中,實(shí)際上所有的類均直接或間接繼承自java.lang.Object類,也可以說Object類是Java中的總根類。實(shí)際開發(fā)中,如不特殊指定,開發(fā)人員自己定義的類均直接繼承自O(shè)bject類。4.2.1派生子類在Java中,類的繼承通過entends關(guān)鍵字實(shí)現(xiàn)。在創(chuàng)建新類時(shí),使用extends指明新類的父類,具體語法如下。class子類名extends父類名{
子類類體}4.2.2繼承規(guī)則當(dāng)類B成功繼承類A后,就涉及到成員變量的繼承問題。下面將從兩個方面介紹成員變量繼承的相關(guān)知識,主要包括成員變量的繼承規(guī)則與成員變量的隱藏。1.成員變量的繼承規(guī)則2.成員變量的隱藏對于成員變量來說,當(dāng)子類本身具有與繼承自父類的成員變量名稱相同的成員變量時(shí),便構(gòu)成了成員變量的隱藏。其含義是,在子類中直接調(diào)用該成員變量時(shí),將調(diào)用的是子類中本身具有的成員變量,而不是從父類繼承的成員變量,4.2.3方法的繼承與覆蓋在類繼承機(jī)制中,方法的繼承和覆蓋是其核心內(nèi)容之一。方法繼承允許子類使用父類的方法,而覆蓋是在子類中重新定義父類中的方法,更顯示了繼承的靈活性。1.方法的繼承從本質(zhì)上講,方法也是一種成員,因此繼承規(guī)則與成員變量的繼承規(guī)則完全一樣,其是否能被繼承同樣取決與訪問限制。2.方法的覆蓋子類的自身方法中,若與繼承過來的方法具有相同的方法名,便構(gòu)成了方法的重寫(有的資料稱之為方法的覆蓋)。重寫的主要優(yōu)點(diǎn)是能夠定義各子類的特有行為,4.2.4this與super在Java中,this和super與繼承是密切相關(guān)的。this常用來引用當(dāng)前對象,而super常用來引用父類對象。1.this方法中的某個對象與當(dāng)前對象的某個成員有相同的名字,這時(shí)為了不至于混淆,可以使用this關(guān)鍵字來指明要使用某個成員,使用方法是“this.成員名”,即使用this隱式地引用對象的實(shí)例變量和方法。2.supersuper用來引用父類的成員,包含父類的構(gòu)造函數(shù)、屬性以及方法。使用方法為super變量名或super.方法名(實(shí)參)。4.3強(qiáng)制類型轉(zhuǎn)換在前面的章節(jié)中曾經(jīng)介紹過,將一個類型強(qiáng)制轉(zhuǎn)換為另一個數(shù)據(jù)類型的過程稱為強(qiáng)制類型轉(zhuǎn)換。本節(jié)中的強(qiáng)制類型轉(zhuǎn)換只在繼承過程中發(fā)生引用類型轉(zhuǎn)換,而不是基本數(shù)據(jù)類型的轉(zhuǎn)換。引用類型轉(zhuǎn)換指對象引用的強(qiáng)制類型轉(zhuǎn)換,在學(xué)習(xí)對象引用的強(qiáng)制類型轉(zhuǎn)換之前,先介紹一下對象引用能指向什么樣的對象。通過前面幾章的學(xué)習(xí),可以知道不管什么類型的對象引用,均能指向其自身類型的對象實(shí)例,下面的代碼說明了這個問題。1 //汽車類型的引用c指向汽車類型的對象2 Carc=newCar();3 //卡車類型的引用t指向卡車類型的對象4.4動態(tài)綁定所謂的動態(tài)綁定,通俗的就是指,對象在調(diào)用方法的時(shí)候能夠自己判斷該調(diào)用誰的方法。所以動態(tài)綁定一般發(fā)生在繼承、方法重載時(shí)。那么發(fā)生方法重載時(shí),編譯器如何確定調(diào)用的方法呢?例如,調(diào)用c.f(arg)時(shí),首先需要將c聲明為B類的對象。此時(shí),如果在B類中,存在多個f方法,只是f的參數(shù)類型不同,調(diào)用f(int)或者f(String)時(shí),編譯器逐一列舉B類中所有名為f的方法以及B類超類中訪問權(quán)限為public的名為f的方法。如果存在與c.f(arg)中arg類型相匹配的方法,那么就調(diào)用這個方法。由此,調(diào)用哪個方法依賴于隱式參數(shù)的實(shí)際類型。這個過程可以就是一個動態(tài)綁定的過程。4.5終止繼承:Final類和Final方法關(guān)鍵字Final不但可以用來修飾變量,而且對類及其方法的繼承也有很大的影響,本節(jié)將從類與方法兩方面介紹final關(guān)鍵字的功能。4.5.1Final類當(dāng)關(guān)鍵字final用來修飾類時(shí),其含義是該類不能再派生子類。換句話說,任何其他類都不能繼承用final修飾的類,即使該類的訪問限制為public類型,也不能被繼承;否則,將編譯報(bào)錯。那么什么時(shí)候應(yīng)該使用final修飾類呢?只有當(dāng)需要確保類中的所有方法都不被重寫時(shí)才應(yīng)該建立最終(final)類,final關(guān)鍵字將為這些方法提供安全,沒有任何人能夠重寫final類中的方法,因?yàn)椴荒芾^承。4.5.2Final方法當(dāng)用final關(guān)鍵字修飾方法后,該方法在子類中將無法重寫,只能繼承,下面的代碼說明了這個問題。要恰當(dāng)使用final的方法,只有在子類覆蓋某個方法會帶來問題時(shí),再將此方法設(shè)為final的方法,一般情況下可以不必使用。因?yàn)榉乐棺宇惛采w會失去一些面
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 2024離婚雙方關(guān)于股權(quán)分配的合同
- 新課綱核心能力特色與說明課件
- 2024食品供應(yīng)商銷售協(xié)議簡版版
- 2024年施工員考試題庫附參考答案
- 2024石材行業(yè)綠色礦山建設(shè)與生態(tài)環(huán)境保護(hù)合同2篇
- 2024年勞動保障知識競賽題庫及答案(共120題)
- 2025年度10架AC311A直升機(jī)購銷及售后服務(wù)保障合同3篇
- 2024年門面房屋租賃合同范本(含違約責(zé)任及賠償)3篇
- 2025年度出租車運(yùn)營管理服務(wù)合同3篇
- 2024版:內(nèi)部技術(shù)交流保密協(xié)議
- 2025年部編版一年級語文上冊期末復(fù)習(xí)計(jì)劃
- 2024高考物理一輪復(fù)習(xí):觀察電容器的充、放電現(xiàn)象(練習(xí))(學(xué)生版+解析)
- 地理2024-2025學(xué)年人教版七年級上冊地理知識點(diǎn)
- 2024年度內(nèi)蒙古自治區(qū)國家電網(wǎng)招聘之電工類綜合練習(xí)試卷A卷附答案
- 零售服務(wù)質(zhì)量提升
- 2024-2030年中國電子郵箱行業(yè)市場運(yùn)營模式及投資前景預(yù)測報(bào)告
- 新型電力系統(tǒng)背景下新能源發(fā)電企業(yè)技術(shù)監(jiān)督管理體系創(chuàng)新
- 北京市海淀區(qū)2023-2024學(xué)年高二上學(xué)期期末考試 英語 含答案
- 幼小銜接-認(rèn)識植物-課件
- 蘇教版三年級上冊數(shù)學(xué)口算題1000道帶答案
- 南孔儒學(xué)完整版本
評論
0/150
提交評論