《Java程序設計基礎》全套教學課件_第1頁
《Java程序設計基礎》全套教學課件_第2頁
《Java程序設計基礎》全套教學課件_第3頁
《Java程序設計基礎》全套教學課件_第4頁
《Java程序設計基礎》全套教學課件_第5頁
已閱讀5頁,還剩700頁未讀 繼續(xù)免費閱讀

下載本文檔

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

文檔簡介

目錄第一章Java概述第二章Java語言基礎第三章Java面向過程編程第四章Java數組與字符串第五章Java類與對象第六章Java繼承與抽象類第七章多態(tài)與接口第八章異常處理第九章Java輸入/輸出第十章Java常用類介紹第十一章圖形界面設計第十二章事件處理全套可編輯PPT課件第一章Java概述1.1Java歷史簡介1.2Java的方向劃分1.3Java語言的特點1.4Java語言的地位1.5Java開發(fā)環(huán)境1.6第一個Java程序1.7Java編程規(guī)范本章小結

1.1Java歷史簡介

Java語言源于Sun公司在1990年12月開始研究的一個內部項目,Sun公司的工程師們在項目開發(fā)中發(fā)現(xiàn)C語言和可用的API(ApplicationProgrammingInterface,應用程序編程接口)難以完成項目開發(fā),1991年4月,Sun公司的JamesGosling博士和幾位工程師在改進C語言的基礎上創(chuàng)造出一門新的語言——Oak(橡樹)。Oak語言有望于控制嵌入在有線電視交換盒、PDA(PersonalDigitalAssistant,掌上電腦)等中的微處理器,后來更名為“Java”(爪哇咖啡)。Java既安全、可移植,又可跨平臺,而且人們發(fā)現(xiàn)它能夠解決Internet上的大型應用問題。

1.2Java的方向劃分

Java的版本演進到了Java2,根據其應用的不同層面進行劃分,Java2平臺被分為三個版本,各版本及其說明如表1-1所示。

1.3Java語言的特點

Java語言具有以下幾個特點:

1.簡單Java由C、C++發(fā)展而來,其語言風格與C++十分相似;另一方面,Java比C++簡單,它刪除了C++中難理解、易引起安全隱患的內容,如最典型的指針操作、多繼承等,降低了學習的難度;同時,Java還有一個特點,即它的基本語法部分與C語言的幾乎一模一樣,容易為人們接受。

2.面向對象

Java是一種面向對象的程序設計語言,在面向對象上相較于C++更加合理和易于理解,更接近于現(xiàn)實世界的概念。同時,Java語言支持靜態(tài)和動態(tài)風格代碼的繼承和重用,所采用的自動裝箱和拆箱技術讓Java的各個基本類型也可以作為對象進行處理。

3.分布式

Java具有支持分布式計算的特征。分布式計算中的“分布”指的是數據分布和操作分布。數據分布即應用系統(tǒng)所操作的數據可以分散存儲在不同的網絡節(jié)點上;操作分布即應用系統(tǒng)的計算可由不同的網絡節(jié)點完成。Java能實現(xiàn)這兩種分布。

4.安全

Java在語言機制和運行環(huán)境中都引入了多級安全措施,主要如下:

(1)內存分配及布局由Java運行系統(tǒng)規(guī)定,取消了指針的操作,不允許直接對內存進行操作,實現(xiàn)了內存管理自動化,內存布局由Java虛擬機(JavaVirtualMachine,JVM)決定。

(2)運行系統(tǒng)提供字節(jié)碼驗證、代碼認證與代碼訪問權限控制的安全控制模型。

①提供字節(jié)碼檢驗器,以保證程序代碼在編譯和運行過程中接受一層層的安全檢查,這樣可以防止非法程序或病毒的入侵。

②提供了文件訪問控制機制,嚴格控制程序代碼的訪問權限。

③提供了多種網絡軟件協(xié)議的用戶接口,用戶可以在網絡傳輸中使用多種加密技術來保證網絡傳輸的安全性和完整性。

5.編譯和解釋的結合

Java應用程序由編譯器編譯成字節(jié)碼,這個字節(jié)碼不是最終可執(zhí)行的程序,不能在具體的平臺上運行,還需要由運行系統(tǒng)上的字節(jié)碼解釋器將其解釋成機器語言,從而達到邊解釋邊執(zhí)行的目的。

6.可移植

Java的最大特點是“一次編程,多次使用”。任何機器只要配備Java虛擬機,便可以運行Java程序,因為Java語言不是針對某個具體平臺結構設計的。

7.多線程

多線程技術允許應用程序并行執(zhí)行,即同時做多件事,滿足了一些復雜軟件的要求。Java不但內置多線程功能,而且提供語言級的多線程支持,即定義了一些用于建立、管理多線程的類和方法,使得開發(fā)具有多線程功能的程序變得簡單和有效。.

1.4Java語言的地位.

1.課程地位Java語言在計算機相關專業(yè)中的課程地位如圖1-1所示,可以看出,Java最主要的前導課程是C語言,Java的面向過程以及結構化編程主要來自于C語言;Java的后續(xù)課程很多,主要是因為Java技術的應用范圍非常廣泛,而作為這些課程的基礎,如果不能很好地掌握Java語言,對于后續(xù)課程的學習將有很大影響,所以有關Java語言的課程在軟件開發(fā)中占有非常重要的地位。

圖1-1Java課程地位

Java程序員主要有三個開發(fā)方向:

(1)?Android移動端開發(fā):主要是移動端應用的開發(fā)。移動端包括搭載Android系統(tǒng)的手機、平板、電視盒子等設備。

(2)?Web開發(fā):主要有HTML5開發(fā)、B/S應用開發(fā)、微信開發(fā)等,包括企業(yè)的信息系統(tǒng)開發(fā),是Java應用的一個非常大的市場。

(3)通信服務器開發(fā):主要是通信服務器的開發(fā),如游戲服務器、騰訊的QQ服務器等。

Java是廣泛使用的編程語言,擁有龐大的客戶群。據估計,全球范圍內有超過30億臺設備在運行Java,超過其他任何一種語言。使用Java編寫的程序幾乎可用于任何設備,包括智能手機、服務器、自動取款機、銷售點終端機(POS)、藍光播放器、電視、機頂盒、物聯(lián)網網關、醫(yī)療設備、Kindle電子閱讀器、汽車等。

1.5Java開發(fā)環(huán)境

Java開發(fā)環(huán)境的安裝主要有三個步驟,如圖1-3所示。圖1-3Java開發(fā)環(huán)境安裝

1.5.1安裝JavaJDK

JDK(JavaDevelopmentKit)是Java語言的軟件開發(fā)工具包,是整個Java的核心,包括Java運行環(huán)境、Java工具和Java基礎類庫。要進行Java程序的開發(fā),首先要在電腦上安裝JDK,其下載地址為/technetwork/java/javase/downloads/index.html。其下載頁面如圖1-4所示。

圖1-4JDK下載示意圖

JDK的安裝方法和一般的軟件安裝一樣,跟隨軟件安裝的向導界面,按照默認的安裝設置進行即可。安裝完后可以在開始菜單中查看,也可以在控制面板中查看是否安裝成功,如圖1-5所示。

圖1-5檢查JDK是否安裝成功

雙擊Java圖標,然后在彈出的界面中點擊“關于”,可以查看Java的版本號,如圖1-6所示。圖1-6查看JDK版本

1.5.2環(huán)境變量設置

安裝好JDK后需要進行環(huán)境變量的設置,具體流程如圖1-7所示。

(1)右鍵點擊“計算機”→“屬性”,在彈出的系統(tǒng)屬性對話框中點擊“高級系統(tǒng)設置”→“高級”→“環(huán)境變量(N)…”。

(2)在“環(huán)境變量”窗口中的“系統(tǒng)變量(S)”下點擊“新建(W)…”,新建“JAVA_HOME”變量,變量值為JDK的安裝目錄名,默認安裝目錄為C:\ProgramFiles\Java\jdk1.8.0_161。

圖1-7Java環(huán)境變量設置流程

(3)在“系統(tǒng)變量(S)”欄找到Path變量,雙擊進行編輯,在變量值后輸入“%JAVA_HOME%\bin;%JAVA_HOME%\jre\bin;”,如圖1-8所示。

圖1-8編輯環(huán)境變量

4)再次在“系統(tǒng)變量(s)”欄點擊“新建(W)…”,輸入CLASSPATH,變量值后輸入“.%JAVA_HOME%\lib;%JAVA_HOME%\lib\tools.jar”(注意最前面有一個點),如圖1-9所示。圖1-9輸入環(huán)境變量

(5)檢驗是否配置成功,運行cmd,在黑色窗口中輸入“java?-version”(java和-version之間有空格)。若如圖1-10所示,顯示Java的版本信息,則說明安裝配置成功。圖1-10環(huán)境變量設置是否成功

1.5.3集成開發(fā)環(huán)境

Java的IDE很多,較為常用的有Eclipse、NetBeans、IntelliJIDEA等,如表1-2所示,但是這些IDE對于初學者來說過于龐大,功能過于復雜,且大多是以項目的方式組織程序的。

JCreatorLe5.0軟件可以在JCreator官網(/)下載,也可以在很多常用的軟件下載網站上搜索下載,下載完按照安裝向導提示進行安裝即可。安裝完畢后打開軟件,JCreator的主界面如圖1-11所示。圖1-11JCreator主界面

如果在使用JCreator過程中出現(xiàn)圖1-12所示的提示,表示后臺的JavaJDK還沒有和我們之前安裝的JCreator關聯(lián)起來,解決方法如下:在JCreator菜單Configure中選擇Options→JDKProfiles,檢查是否有JDK;如果為空,就點擊New按鈕,然后找到JDK安裝的目錄,如圖1-13所示。圖1-12JDK設置問題圖1-13設置JDKProfiles

1.6第一個Java程序

點擊JCreator中的菜單項File→New→File,出現(xiàn)新建文件向導,如圖1-14所示,選擇JavaClasses→JavaClass,點擊Next按鈕。

圖1-14新建Java類

在圖1-15所示的窗口中輸入文件名“HelloJava”,選擇源文件需要放置的路徑,如“D:\JavaCode\”,然后點擊Finish按鈕,即可進入到程序編輯界面。

圖1-15輸入類名及所在目錄

在程序編輯區(qū)域會看到下列程序代碼:

程序示例1-1第一個Java程序(空程序)。

程序分析:

(1)?Java是使用類(class)來組織程序的,在一個文件中可以有多個類,每個類有自己的區(qū)域{…},其中只能有一個類的類名與文件名相同,并且?guī)ublic公共修飾符,該類是作為該文件運行的主類,該類的main方法將是運行該文件的入口函數。

(2)在本書的前四章,我們都在一個文件中定義一個同名的主類,然后在該類中輸入一個main函數,作為程序的入口,類似于C語言,在main函數中編寫程序語句或者調用其它函數。

(3)?main函數的寫法:(可以使用JCreator的代碼提示:輸入main,出現(xiàn)提示后回車,即可自動完成main函數代碼。)

(4)?main函數中輸入的第一條Java語句“System.out.println("HelloJava!");”中,System.out.println()是一個輸出函數,將字符串或各種數據類型放入該函數的括號里面,能夠輸出相應形式的字符到顯示器上;點擊按鈕進行編譯,如果有語法錯誤會在BuildOutput窗口中顯示出來,如果沒有語法錯誤將顯示“Processcompleted.”,這時點擊按鈕運行程序。

程序示例1-2第一個Java程序:輸出字符串到顯示器上。

程序段:(HelloJava.java)

publicclassHelloJava{

publicstaticvoidmain(String[]args){

System.out.println("HelloJava!");

}

}

程序結果:

上面的結構可以改造為函數調用的方式,這將是我們前幾章用的比較多的結構,由于main函數是直接調用fun函數,fun函數需要使用static修飾。

1.7Java編程規(guī)范

1.7.1初識Java編程規(guī)范Java編程規(guī)范或者說編程風格,是指Java語言經歷了二十多年的發(fā)展之后,程序員們對于如何寫出規(guī)范的程序已經有了一些共同的認識。

上述兩個程序運行后的結果一樣,但是哪個可讀性強呢?從上述兩個程序的差別可以看出Java編程規(guī)范的優(yōu)點:

(1)好的編碼規(guī)范可以改善軟件的可讀性,讓開發(fā)人員更快更好地理解新的代碼。

(2)好的編碼規(guī)范可以減少軟件代碼的維護成本。

(3)好的編碼規(guī)范可以有效提高團隊開發(fā)的合作效率。

(4)規(guī)范性編碼可以讓開發(fā)人員養(yǎng)成良好的編碼習慣,思維更加嚴謹。

1.7.2Java編程規(guī)范歸納

1.命名規(guī)范

語言的各種元素命名應該正確并且具有一定含義,如對類、變量、函數名等的命名,應該使用完整的英文單詞,要能望文知意,如上述程序的getMaxFromArray函數的命名就比fun函數的命名有意義。

2.駝峰式命名規(guī)則

變量名、函數名、參數名等宜以lowerCamelCase風格編寫:首字母小寫,之后每個單詞首字母大寫。

3.正確的代碼縮進格式

一個排版良好的程序必定有正確的縮進形式,而代碼的正確縮進能有效增強程序的可讀性,并且還能有效避免邏輯錯誤。應使用Tab鍵進行代碼縮進,而不要使用空格鍵,且縮進必須要有正確的層次,如下面的程序段:

該程序共有4個縮進層次:

(1)?getMaxFromArray函數:該函數的函數體在一對“{}”之間,左花括號“{”寫在函數頭部之后,右花括號“}”對齊函數頭部第一個字符,該函數體內的所有語句縮進一個層次。

(2)?for循環(huán)語句:for語句的一對“{}”之間是循環(huán)體語句,所以循環(huán)體里的所有語句縮進一個層次。

(3)?if分支語句:if語句作為for循環(huán)體內部語句,所以縮進一個層次。

(4)“max=a[i];”語句:該語句是if的分支語句,如果條件成立,執(zhí)行分支語句;如果條件不成立,該語句不被執(zhí)行。

4.進行適當的程序注釋

程序的注釋能幫助閱讀程序的人更快理解程序的含義。注釋包括對類、函數、變量、算法、代碼等的注釋。Java的注釋形式主要有以下幾種:

(1)塊注釋,以“/*”開頭,以“*/”結束,在“/*”和“*/”之間的代碼都是注釋代碼,為多行注釋,注釋內容為綠色顯示。

(2)行注釋,以“//”開頭。例如:

intn=a.length; //n表示a數組的長度

for(i=1;i<n;i++){ //從第二個元素開始遍歷int數組

(3)文檔注釋,以“/**”開頭,以“*/”結束,一般一個類或接口對應一個文檔注釋。

本章小結

1.Java程序設計語言于1995年誕生,已經發(fā)展了20多年,是目前最為流行的面向對象編程語言之一,課程地位和市場地位都很重要,具有很高的學習價值。2.Java環(huán)境搭建主要有以下幾個步驟:(1)下載并安裝JDK(JavaDevelopmentKit)軟件;(2)設置環(huán)境變量;(3)安裝集成開發(fā)環(huán)境軟件,本書使用的是JCreator。

3.Java程序的新建,新建一個Java類文件,該文件中有一個與文件相同的類,而將該類中的main函數作為運行該文件入口函數,在該函數中編寫Java語句。

4.Java程序的運行,首先要將源文件(.java文件)通過編譯器編譯為與平臺無關的字節(jié)碼文件(.class文件),然后通過解釋器來解釋執(zhí)行字節(jié)碼文件。

5.良好的Java編程風格能夠增加程序的可讀性,有利于程序的維護。編程風格主要包括以下幾點:

(1)有意義的命名;

(2)駝峰式命名規(guī)則;

(3)正確的代碼縮進形式;

(4)適當的程序注釋等。第二章Java語言基礎2.1Java標識符與關鍵字2.2Java數據類型2.3Java運算符2.4Java數據類型轉換2.5Java的標準輸入/輸出語句本章小結

2.1Java標識符與關鍵字2.1.1Java標識符標識符即在程序中給類、函數、變量等取的名字,它是能被編譯器識別而在程序中不會沖突的名字。標識符的定義需要遵守以下規(guī)則:(1)標識符是由字母、“_”、“$”和數字組成的。(2)標識符以字母、“_”、“$”開頭。(3)標識符不能與關鍵字同名。(4)標識符區(qū)分大小寫,如student和Student是不同的標識符。

2.1.2Java關鍵字

關鍵字即Java語言本身提供的一種特殊的標識符,又稱Java保留字,是被Java已經使用了的名字,在編程時不能使用這些名字。

Java語言的關鍵字有50個,如表2-1所示。

2.2Java數據類型

Java基本數據類型源于C語言,與C語言有相同之處,同時也有很多差別。Java共有八種基本數據類型,如表2-2所示。

2.2.1整數類型

★與C語言的比較:

(1)?Java的整數類型有四種,即byte、short、int、long,各類型在內存中分別占1、2、4、8個字節(jié);C語言只有short、int和long三種。

(2)?Java的各種整數類型均可保存正整數、負整數和0。不同于C語言有unsigned的無符號的整數類型,Java的整數都是有正、負數的,在Java中不能寫成“unsignedinta=5;”的形式。

程序結果:

2.2.2字符類型

★與C語言的比較:

(1)?C語言的char類型,占1字節(jié),采用ASCII編碼方式,存放的字符個數為256個,不能存放中文字符;而Java的char類型,占2字節(jié),采用的是Unicode編碼,兼容ASCII碼,并可以保存中文字符集。

(2)?C語言的一個轉義字符如'\xhh',其單引號中以“\x”開頭,后面接1~2位的十六進制數,而在Java中則不可用C語言的這種形式“charc='\x61';”,應改成“charc5='\u0061';”的形式,以“\u”開頭,后面接1~4位的十六進制數。

程序結果:

Java中的轉義字符基本和C語言的相同,如表2-3所示。

2.2.3小數類型

小數類型(浮點類型)分為float單精度和double雙精度兩種。float類型保留8位有效數字的小數,在內存中分配4個字節(jié);double類型保留16位有效數字的小數,在內存中分配8個字節(jié)。Java和C語言一樣都是近似地表示小數,精度越高越接近小數字面值,所以一般對于小數處理大多使用double類型。

程序結果:

2.2.4布爾類型

★與C語言的比較:

(1)?C語言中沒有布爾類型變量,使用0和非0來代表邏輯假和邏輯真,所以任何合法的表達式都可以作為條件來使用。比如if(a+b)是合法的:如果a+b的值等于0,則條件為假,如果a+b的值為非0,則條件為真。

(2)?Java可以定義布爾變量來保存true、false,即“booleanb=true;”,并且不允許使用數字來代表邏輯真或邏輯假,如if(a+b)就是非法的,必須寫成if(a+b!=0),作為if的條件只能是boolean變量、條件表達式或邏輯表達式。

2.2.5引用變量

Java的變量主要分為兩類:基本數據類型變量和引用變量?;緮祿愋驮谏厦鎺坠?jié)已經做了說明,Java定義的變量除了基本數據類型之外,其它的都可以稱為引用變量,例如Java預定義類變量、數組類型變量、用戶自定義類變量等等。

例如:基本數據類型變量如“inta;”“charc;”“doubled;”“booleanb;”等,引用變量如“Strings;”“int[]a;”“Students;”“Animalan;”等。

★與C語言的比較:

(1)?C語言中有個很重要的概念——指針,由指針帶來的各種運算和操作使得C語言的程序靈活,效率高,但同時也會讓程序變得復雜,可讀性降低,容易出錯。

(2)?Java中沒有了指針這個概念,舍棄了指針的相關運算和操作,程序變得簡潔易讀,安全可靠。

Java的引用變量源于C語言的指針變量,同樣是保存內存地址,都是通過地址完成對內存數據的操作,但是二者之間有一定區(qū)別:

(1)變量長度:C語言的指針變量用于保存內存地址編號,長度為int的4個字節(jié);Java引用變量也用于保存內存地址,但Java封裝了地址,可以轉換成字符串查看,不必考慮其長度。

(2)初始值:Java引用變量的初始值為Java的關鍵字null,表示該指針變量為空;C語言的指針變量是int,如不初始化指針,那它的值就是不固定的,沒有初始化就進行指針操作是很危險的。

(3)計算:Java引用變量不可以進行內存地址的計算,使用更加安全可靠;C語言的指針變量是int,可以計算,如++、--以及地址變化等,使用較為靈活,但也容易出問題。

(4)內存溢出:Java引用變量的使用權限比較小,不容易產生內存溢出;C語言的指針變量是容易產生內存溢出的,所以程序員要小心使用,及時回收。

2.3Java運算符

Java的運算符來源于C語言,和C語言的運算符大體相同,略有區(qū)別。Java的運算符如表2-4所示。

★與C語言的比較:

(1)Java取消了C語言的sizeof()運算符。sizeof()用于求括號中的內容在內存中所占字節(jié)數。

(2)?Java新增了一個instanceof的運算,一般形式為

對象名instanceof類名;

用以判斷左邊的對象是否是右邊類的實例,運算返回true或false。

(3)Java的關系運算和邏輯運算的結果為boolean,即邏輯真或邏輯假,而C語言的關系運算或邏輯運算得到的結果是用整數1和0代表真和假。

2.4Java數據類型轉換

2.4.1自動類型轉換Java中的自動類型轉換與C語言中的類似,系統(tǒng)支持某個基本數據類型直接賦值給另外一種數據類型,即稱為自動類型轉換。Java的自動類型轉換按照圖2-1所示,當有兩種不同數據類型運算時,左邊的數據類型將會自動向右邊的數據類型轉換,然后進行運算。

圖2-1基本數據類型自動轉換

程序結果:

2.4.2強制類型轉換

可以使用強制類型轉換運算符即(類型名)來強制進行類型轉換,以便進行同類型數據運算,但是要注意Java對類型要求較為嚴格,進行強制類型轉換時一定要考慮是否可以轉換,一旦轉換失敗就會導致程序異常終止。

程序結果:

程序分析:

(1)在語句“inta1=349;”中,a1是int類型,在內存中占4個字節(jié)32bit,二進制表示形式為101011101,左邊補0補足32bit;將a1強制類型轉換為byte類型賦值給b1,b1在內存中只占1個字節(jié)8bit,所以a1左邊的24bit被丟掉了,剩下后面8個bit(01011101),轉換為十進制為93,如圖2-2所示。

(2)在語句“inta2=477;”中,二進制形式為(111011101)2,進行強制類型轉換(byteb2=(byte)a2;),取低位的8bit賦值給b2,即(11011101)2,最高位為1,所以b2為負數,按照補碼的規(guī)則,11011101減1取反得到00100011→-35,如圖2-2所示。

(3)?a3是小數97.153,(int)a3強制轉換為整數則丟掉小數部分得到97;(char)a3強制轉換為char類型,先丟掉小數部分得到int的97,再強制轉換為char,得到字符'a'。

圖2-2基本數據類型強制轉換

2.5Java的標準輸入/輸出語句

2.5.1Java標準輸出語句Java標準輸出指的是將程序中的數據輸出到顯示器。在JCreatorIDE中進行操作指的是將數據輸出到JCreator軟件的控制臺(console),該輸出操作使用函數System.out.println()來完成。

程序結果:

程序結果:

2.5.2Java標準輸入語句

Java標準輸入指的是從鍵盤將數據輸入到程序中。Java中用System.out來表示標準輸出設備,如顯示器;用System.in來表示標準輸入設備,如鍵盤??梢允褂肧canner類完成輸入操作,使用該類對象聯(lián)合System.in能夠較為方便地完成從鍵盤輸入數據到程序中。

首先,我們要創(chuàng)建一個Scanner的對象sc:

Scannersc=newScanner(System.in);

之后,可以通過sc的相關函數完成從鍵盤輸入各類數據的操作,Scanner類的常用方法如表2-5所示。使用這些方法從鍵盤輸入數據的時候,要注意數據類型與方法的匹配,類型要一致,否則會有異常發(fā)生。

程序結果:

★與C語言的比較:

(1)?C語言的基本程序組織單位是函數,將不同函數分類放在各個頭文件中,如數學函數math.h、字符串處理函數string.h、常用函數stdio.h等,然后使用包含語句,如#include<string.h>包含了string.h頭文件,之后的程序就可以使用該文件里的字符串處理函數。

(2)?Java基本的程序組織單位是類,在一個類中有多個成員函數,將多個類文件分類放在不同的包(文件夾)中,通過導包語句“importjava.util.Scanner;”或者“importjava.util.*;”就可以使用包中的類和類里的成員函數。

程序結果:

本章小結1.Java語言定義的變量,其類型分為兩類:基本數據類型和引用數據類型。2.Java的基本數據類型主要有八種,即byte、short、int、long、char、boolean、float和double,要注意與C語言的比較:(1)?Java的整數都能保存正、負數,沒有無符號整數類型。(2)?Java新增了boolean類型,對于邏輯類型數據的處理更加嚴謹。(3)?Java的char類型數據占2個字節(jié),使用的是Unicode編碼。

3.Java的引用數據類型變量,保存的是內存地址,類似于C語言中的指針變量,但是有一定的區(qū)別。

4.Java的運算符與C語言的有很多相同的地方,也有不同之處,例如取消了C語言的sizeof(),新增了instanceof()等。

5.Java對于類型的控制更加嚴格,在運算時盡量保持數據類型一致,Java同樣具有自動類型轉換和強制類型轉操作。

6.Java使用System.out.print()以及System.out.println()函數來完成標準輸出??梢詫⒆址?、基本數據類型、表達式等放入上述函數中,函數將這些數據轉換為字符串形式,輸出到顯示器。

7.采用Scanner類和System.in生成Scanner對象,通過其對象的各個成員方法,能夠從鍵盤輸入不同數據(整數、小數、布爾值、字符以及字符串)給程序中的變量。第三章Java面向過程編程3.1Java的順序結構3.2Java的分支結構3.3循環(huán)結構3.4結構嵌套3.5函數本章小結

3.1Java的順序結構

面向過程編程中,我們采用結構化的方式進行編程,每個結構具有一個入口和一個出口,按照解決問題的步驟一個一個結構順序地執(zhí)行,直到程序結束。這些結構內部包括各種基本語句,比如定義變量、變量賦值、分支、循環(huán)、輸入/輸出等,或者包括這些語句的嵌套。

相對于分支結構和循環(huán)結構,順序結構主要是指定義變量、變量賦值、表達式運算、輸入/輸出等語句。這里用一個C語言的程序示例來說明。該程序的功能是求兩個正整數的最大公約數。過程描述:從鍵盤輸入2個整數,判斷是否為正數,如果否,則結束函數,返回0;如果都為正數,則使用循環(huán)結構來求兩個數的最大公約數,最后輸出結果。

★與C語言的比較:

(1)?C語言的變量定義都要在程序開始處,而Java可以在程序需要的地方定義變量。

(2)?C語言的輸入/輸出使用scanf()和printf(),而Java的輸入使用Scanner類對象及相應的成員函數進行,輸出使用System.out.println()。

(3)?C語言的main函數使用return語句來結束函數運行,而Java使用“System.exit(0);”語句來終止程序。

程序結果:

3.2Java的分支結構分支結構主要有單分支、雙分支和多分支三種結構,程序運行到該結構時根據分支條件來判斷走哪條“路”:(1)單分支:分支條件成立,執(zhí)行分支語句,否則不執(zhí)行。(2)雙分支:分支條件成立,執(zhí)行第一條分支語句,否則執(zhí)行第二條分支語句。(3)多分支:從第一個分支條件開始自上向下判斷分支條件,哪個分支條件成立就執(zhí)行哪條分支語句,然后退出整個多分支結構。

3.2.1if語句

if語句的三種結構形式如下:

(1)單分支結構:

(2)雙分支結構:

(3)多分支結構:

下面以雙分支的if-else結構為例進行說明,圖3-1是雙分支結構的流程圖,程序從a進入到該結構碰到分支條件,當條件為真時執(zhí)行S2語句(或語句塊),條件為假時執(zhí)行S1語句(或語句塊),不管執(zhí)行哪條語句,都要從b出口退出該分支結構。簡單來說就是條件為真走S2這條“路”,條件為假走S1這條“路”,S1和S2這兩條路,只能選擇一條。圖3-1選擇結構

分支條件說明:

(1)條件可以由關系表達式、邏輯表達式或布爾邏輯變量等構成。

(2)關系表達式是由==、!=、<、>、>=、<=等這些關系運算符連接起來的運算式。

(3)邏輯表達式是由邏輯非(!)、邏輯與(&&)、邏輯或(||)三個邏輯運算符連接起來的運算式。

各運算符的優(yōu)先級別為:

!>算術運算符>關系運算符>&&>||>賦值運算符

(4)?&&?和?||?運算符的結合性是從左到右。

(表達式1)&&(表達式2)若表達式1為假,則表達式2不會被運行

(表達式1)||(表達式2)若表達式1為真,則表達式2不會被運行

(5)?0<x<10在數學中表示x大于0且小于10,但是在程序中表達這個條件時應該寫為

x>0&&x<10

程序結果:

(3)不管使用哪種分支結構,程序的邏輯要正確,不要有漏洞。if只能管制一條語句,可以使用花括號將多條語句構成一個{語句塊}歸屬if管制,if和else后面固定使用{}包圍分支語句(不管是一條還是多條)是一個良好的編程習慣。

3.2.2switch語句

Java與C語言一樣可以使用switch的多分支結構,switch語句的一般形式如下:

switch語法說明:

(1)?switch語句中的表達式類型只能是byte、short、int、char和枚舉等類型,在JDK1.7后可以有string表達式類型。

(2)?case后面的值1、值2、…、值n必須是整型、字符型常量以及字符串,各個case后面的常量值不能相同。

(3)?switch語句的主要流程是把表達式的值依次與各個case子句中的值比較,如果值相等,表示匹配成功,找到對應的分支,執(zhí)行該case后面的子句。

(4)可以把switch后面的表達式看成選路的依據,case后面的值是分支路徑的路標,如果表達式的值與路標相同,表示找到了分支路徑,開始執(zhí)行該路徑下的語句。

(5)一般在每條分支最后都有break語句,作用是執(zhí)行完一個case分支后,使程序跳出switch語句,不再執(zhí)行其它語句;如果某個子句后不使用break語句,則繼續(xù)向下執(zhí)行后面的語句,直至碰到下一個break或運行到switch的右花括號結束。

(6)關于default語句,當switch表達式的值與所有case語句中的值都不匹配時,就會找到default,開始執(zhí)行default分支的語句。

程序結果:

3.3循環(huán)結構

循環(huán)結構示意圖如圖3-2所示,當滿足循環(huán)條件時就執(zhí)行循環(huán)語句,執(zhí)行完循環(huán)語句后,再進行條件判斷,如果條件還為真,則繼續(xù)執(zhí)行循環(huán)語句,直到條件為假時退出循環(huán)體。

圖3-2循環(huán)結構

3.3.1while循環(huán)結構

while循環(huán)結構,又稱為當型循環(huán):當條件成立時,進入循環(huán)體;當條件不成立時,退出循環(huán)體。當型結構如圖3-2所示,一般結構形式如下:

程序結果:

3.3.2for循環(huán)結構

如果清楚知道循環(huán)次數,或者循環(huán)的步進變化很明確,這時使用for循環(huán)更為方便。從for循環(huán)的頭部就能很直觀地讀出循環(huán)的次數,其結構形式如下:

for循環(huán)的結構如圖3-3所示。圖3-3for循環(huán)結構

程序結果:

3.3.3循環(huán)控制語句

break語句:“break;”如果在循環(huán)體中被執(zhí)行,則退出整個循環(huán)結構;在多層嵌套循環(huán)中被執(zhí)行,則只能跳出本層循環(huán)結構。

continue語句:“continue;”如果在循環(huán)體中被執(zhí)行,表示本次循環(huán)結束,進入下一次循環(huán)。

break語句和continue語句在循環(huán)體中出現(xiàn)時一般都需要放入一個if分支結構中,即在某個條件成立時,break語句用于退出所在循環(huán),continue語句則結束本次循環(huán)而繼續(xù)下一次循環(huán)。

3.4結構嵌套結構嵌套主要指的是順序結構、分支結構和循環(huán)結構語句相互嵌套,比如在循環(huán)結構中有循環(huán)結構,循環(huán)結構中有分支結構,分支結構中有循環(huán)結構等,如何正確地完成這些結構的嵌套呢?這需要根據解決問題的算法來進行,在編程之前需要對問題進行解讀,對算法進行分解,分解的步驟邏輯要正確,思路要清晰,從而才能規(guī)劃好程序的結構,有條不紊地進行編程。分解好算法步驟之后要用正確的語法來實現(xiàn)這些步驟,并通過運行、調試解決程序中出現(xiàn)的問題,直到得到正確的程序。

程序示例3-8從鍵盤輸入一個正整數n(n>2),求小于n的所有素數之和。

如圖3-4所示,對這個問題進行算法分解,將程序分為兩個主要結構:1是如何判斷一個數是否為素數,2是一個循環(huán)結構,對2~n-1所有的數依次進行判斷。首先要能完成1結構,然后將1結構嵌入到2循環(huán)結構中。下面我們將依次完成這個程序。圖3-4結構嵌套

(2)求小于n的所有素數之和(結構2)

將上述程序段1嵌入到2~n-1循環(huán)中,重新分配變量?,F(xiàn)在是對2~n-1中的每個數i進行判斷,如果是素數則加入到sum中,否則循環(huán)繼續(xù)。

程序結果:

3.5函數

3.5.1函數的定義與調用在面向過程編程中,函數是非常重要的。如何定義和調用函數,對于C語言和Java都是必須掌握的重要知識點。函數定義時要注意的三個要素(圖3-5):(1)函數參數:調用該函數時要傳入什么數據。(2)函數返回值類型:函數調用結束,返回一個什么類型的數據。(3)函數體:代表了該函數要完成的任務或提供的功能。

圖3-5函數三要素

可以將上一節(jié)判斷一個數是否為素數的結構1程序,寫成一個函數isPrime,聲明為

publicstaticbooleanisPrime(intn)

說明:

(1)?main函數如果要直接調用該函數,該函數也需要static修飾。

(2)該函數傳入一個正整數n,用于判斷該n是否為素數。

(3)該函數返回值為布爾類型,返回true則表示n是素數,返回false則表示n不是素數。

(4)函數體功能如函數名isPrime所示,用以判斷某個數是否為素數。

程序結果:

3.5.2Java函數與幫助文檔

1.?Java編程接口

應用程序編程接口(ApplicationProgrammingInterface,API)是一組預定義函數總和,目的是提供應用程序,以方便開發(fā)人員訪問這些函數的聲明和功能,而無需訪問源碼或理解內部工作機制的細節(jié)。Java具有一個很龐大的API,Java程序員能夠使用這些函數來構建自己的程序,減輕工作量。

打開JDK1.6API幫助文檔,如圖3-6所示。

圖3-6JDK幫助文檔

2.包和類的概念

Java的基本程序組織單位是類,類中可以有多個函數(成員方法)。由于Java編程面向各個領域,預定義的類非常多,JDK1.6版本大概有3700多個類。為了方便管理這么多類,這些類被分類放在不同的包中,包就是文件夾。比如java.io包,就是java/io文件夾,其中有與Java輸入/輸出相關的類80多個,如File文件類、FileReader文件輸入類、FileWriter文件輸出類、BufferedReader帶緩沖的輸入類、BufferedWriter帶緩沖的輸出類等等,這些類中有很多成員函數,提供了相應的函數功能供程序員使用。

點擊圖3-6的“顯示”按鈕,可以展開“索引”和“搜索”選項卡,其中用的比較多的是“索引”,在“索引”中輸入想要查詢的類名,找到類才能找到想要找的函數,如圖3-7所示。

圖3-7JDK幫助文檔索引

3.幫助文檔的使用

以字符串類String為例(該類在后面要詳細說明),輸入String后點擊進入,可以看到對String類的描述,如圖3-8所示。圖3-8查詢String類

雙擊左邊的String,右邊出現(xiàn)String類的具體描述,向下拉動右邊的滾動條,可以看到對字符串處理的函數說明在“方法摘要”里,如圖3-9所示。

圖3-9查詢String類的函數

點擊第一個函數鏈接,可以進一步看到該函數的詳細說明,如圖3-10所示。圖3-10charAt函數說明

API中的兩種函數為對象成員函數和類成員函數。

(1)對象成員函數。上述第一個函數charAt就是對象成員函數,即首先由String類產生字符串對象,再由對象來調用的函數。

charAt函數使用時需要傳入一個整數,表示字符串的下標索引,某個字符串對象調用該函數,能夠將該字符串對象指定下標索引處的字符返回,如charc="abcdef".charAt(3)返回字符'd'。(注:字符串下標從0開始計數,字符串常量也是一個字符串對象。)

"abcdef"是一個字符串對象,該對象采用成員運算符(.)調用charAt函數,找到第四個字符返回,所以該函數的調用返回字符?'d'?賦值給c變量。

我們可以看到圖3-9中charAt后面的函數全是對象成員函數,直到最后一個copyValueOf函數。

(2)類成員函數。圖3-9的最后一個函數copyValueOf和上面函數的不同之處在于它有一個static靜態(tài)修飾符,如圖3-11所示,這種帶static修飾符的函數稱為類成員函數。調用該函數可以不用產生對象,直接由類名調用:

Strings=String.copyValueOf(ch);

上述語句表示,調用字符串類的copyValueOf函數,將字符數組ch中的所有字符構造成為一個字符串對象返回給s對象。圖3-11copyValueOf函數說明

從上述兩個函數的查詢可以看出,要使用Java預定義的函數,首先要找到類,類中的函數分為對象成員函數和類成員函數,對象成員函數的使用必須要先產生對象,由對象來調用函數,而類成員函數可以使用類名,也可以使用對象名來調用。

查詢幫助文檔,使用Java的預定義函數來幫助構建程序,使得Java編程者更多關注如何解決問題和如何構建程序,而屏蔽了一些具體函數的編寫,這樣大大減輕了Java程序員的工作量,也是Java和C語言編程方式的一個不同之處。

本章小結

1.Java面向過程編程源于C語言,同樣是結構化的編程,具有順序、分支和循環(huán)三種結構。2.順序結構是面向過程編程的主要方式,每一個結構都有一個入口和一個出口,程序由多個結構構成,按一個結構一個結構的順序運行。3.Java的分支語句分為單分支if、雙分支if-else、多分支if-elseif和switch語句。

4.Java中作為分支、循環(huán)結構條件的只能是關系表達式、邏輯表達式或者邏輯變量。

5.Java循環(huán)主要有while語句、do-while語句以及for語句循環(huán)。在不清楚循環(huán)次數時多用while循環(huán),在明確了循環(huán)次數時多用for循環(huán),二者是可以相互轉換的。

6.在循環(huán)中可以使用break語句來強制退出循環(huán),可以使用continue語句來結束本次循環(huán)而繼續(xù)下一次循環(huán),一般需要和if語句一起使用。

7.分支、循環(huán)結構的嵌套是本章的難點,需要一定量的編程練習才能掌握。對于問題的解決,要對算法進行分析,分解算法步驟,使用正確的語法實現(xiàn)各個步驟,調試運行。

8.函數定義需要注意函數的三個要素,即函數參數、函數返回值類型和函數體。

9.Java函數主要分為自定義函數和Java預定義的函數,要會根據要求定義函數,也要學會查詢JavaAPI幫助文檔,使用Java定義好的函數來構建程序。

10.Java類中的函數分為兩種,帶static修飾符的稱為靜態(tài)函數/類函數,可以由類名進行調用;不帶static修飾符的稱為成員函數,需要先定義類對象,再由對象來調用。第四章Java數組與字符串4.1數組4.2字符串本章小結

4.1數組

4.1.1數組的基本概念數組是一組類型相同、在內存中連續(xù)存放的數據集合。數組中的每個數據稱為一個數組元素,例如定義了一個具有10個元素的整數數組a,則內存中的情況如圖4-1所示。圖4-1數組示意圖

(1)?a數組有10個元素,每個元素都是一個int變量,在內存中地址連續(xù)。

(2)數組的元素使用數組下標元素符[]標識,下標索引i從0開始,到9結束,a[i]是a數組的第i+1個數組元素,i必須在0~n-1之間(n是a數組的長度)。如果i>=n或者i<0,在Java中都屬于越界行為,是不允許的,程序會終止運行并報異常。

(3)數組一旦定義長度n,就不可改變長度(數組的容量固定)。

4.1.2數組的定義與初始化

1.?C語言的數組情況

Java的數組與C語言的具有很多不同,首先來看一下C語言中對數組的定義,例如定義一個數組為“inta[5];”,內存如圖4-2所示。圖4-2C語言數組示意圖

C語言數組的語法規(guī)則:

(1)?a是數組名,代表了這個數組的首地址,是一個不可改變的量,不能對a進行賦值。

(2)“inta[5];”定義之后,就可以對a數組的各個元素進行賦值和運算了。

(3)可以在定義的時候整體賦值,即“inta[5]={1,2,3,4,5};”,而定義之后就只能夠對數組的單個元素進行賦值操作。

(4)?C語言對于數組的下標越界的處理態(tài)度是“后果自負”。

2.?Java的數組情況

Java的數組定義語句為

int[]a=newint[5];

(1)等號左邊定義了一個整數數組類型(int[]視為一個類型)的變量a。a是數組名,同時a的本質是一個引用變量,類似于一個能夠指向整數數組的指針變量。既然是變量,就可以對a進行賦值操作,讓它指向另外一個整數數組,即“a=b;”。

(2)等號右邊使用new在內存中分配了一段空間,即5*4→20字節(jié),a就指向該內存空間的首地址。

(3)?Java在定義a數組的時候也可以使用花括號進行數組的初始化:

int[]b={1,2,3,4,5}; //根據花括號里面的值,b的長度為5

(4)整體賦值只能發(fā)生在定義的時候,定義語句之后就只能對b的單個元素進行賦值。

(5)該數組在內存中的情況與上述C語言的一致,如圖4-2所示。

3.棧內存與堆內存

Java中定義一個數組會在內存中兩個區(qū)域進行操作,一個區(qū)域是棧內存,保存了引用變量a;另一個區(qū)域是堆內存,保存了數組的實際元素集合,如圖4-3所示。

1)棧內存

當函數被調用時,函數進入棧內存空間,即函數得到分配的內存空間。棧內存空間具有棧的特性:先進后出,后進先出。main函數是程序入口,最先進棧,被壓入棧底;如果main函數調用fun函數,則fun函數進棧,壓在main函數上面;只有fun函數運行結束后出棧了,main函數才能繼續(xù)運行,直到運行結束后退棧(即釋放函數得到棧內存空間)。圖4-3Java數組內存示意圖

2)堆內存

在C語言中也有堆內存的概念。在標準C語言中,使用malloc等內存分配函數從堆內存中獲取內存空間,從堆中分配的內存需要程序員手動釋放,如果不釋放,而系統(tǒng)內存管理器又不自動回收這些內存空間,這樣很容易產生內存溢出的情況。

Java中同樣也有堆內存的概念,Java定義的對象、數組等存放在堆內存空間中。堆的優(yōu)勢是可以動態(tài)地分配內存大小,生存期也不必事先告訴編譯器,因為它是在運行時動態(tài)分配內存的。Java的堆內存是由Java的垃圾回收機制*來負責的,Java的垃圾收集器會自動收走這些不再使用的數據,釋放內存。其缺點是由于要在運行時動態(tài)管理內存,需要消耗一定的資源,對程序速度有一定影響。

程序結果:

4.1.3數組遍歷

1.數組的遍歷

數組的遍歷即對數組的每個元素訪問一次,這是數組最常見的操作,一般是用for循環(huán)進行,采用三個表達式的形式,i從0開始步進變化到n-1。

程序結果:

程序示例4-3對程序示例4-1進行改造,將上述程序的功能寫成一個函數。

函數的功能是對傳入的整數數組找尋最大值及下標,由main函數初始化數組,將數組傳入該函數,調用該函數完成尋找最大值及下標的功能。我們都知道函數只能返回一個值,如何讓一個函數傳回兩個及以上的值給調用函數呢?方法是再將一個數組傳入該函數,作為結果數組,將函數找到的多個值賦值給該數組的多個元素即可,如圖4-4所示。

圖4-4數組作為函數參數

具體的內存示意圖如圖4-5所示,該圖是main函數調用fun函數的內存瞬時示意圖。圖4-4數組作為函數參數

程序結果:

2.?foreach語法

對數組進行遍歷,除了常規(guī)的for循環(huán)之外,還有一種較為簡潔的foreach寫法,例如要輸出a數組的數組元素,寫法如下:

4.1.4二維數組

Java對二維數組的處理方式是將二維數組看成多個一維數組的一維數組。這與C語言處理二維數組的方式是相同的,但是Java的二維數組可以是m行n列的矩陣形式,也可以是不規(guī)則的矩陣形式。

1.定義形式1

例如:

int[][]a=newint[4][5];

該形式定義了一個4行5列的二維數組,可以將這個二維數組(圖4-6)看成一個具有4個元素的一維數組,每個元素又是一個一維數組,每個一維數組具有5個元素。

a[0]、a[1]、a[2]、a[3]分別是這4個一維數組的數組名。

這樣的定義是兼容了C語言的二維數組定義方式,該語句被執(zhí)行,就得到了20個元素,如圖4-6所示。

圖4-6Java二維數組形式

2.定義形式2

定義的時候只說明有幾個一維數組,即說明有幾行,但是每行有幾列不說明,之后再對每個一維數組進行初始化,例如:

int[][]a=newint[4][];

a[0]=newint[4];

a[1]=newint[3];...

Java的這種處理方式,能定義出不規(guī)則的二維數組,如圖4-7所示。

圖4-7Java不規(guī)則二維數組

形成上述二維數組結構的程序段如下:

int[][]a=newint[4][];

a[0]=newint[4];

a[1]=newint[3];

a[2]=newint[5];

a[3]=newint[2];

3.二維數組的遍歷

對于二維數組的遍歷,與C語言類似,需要使用嵌套循環(huán)來完成,外層循環(huán)是對行進行遍歷,內存循環(huán)是對每行的各列進行遍歷。

程序結果:

程序結果:

4.1.5Arrays類

數組是程序設計中必不可少的數據結構。為了減輕Java程序員的工作量,對數組(主要是基本數據類型數組)的很多常用操作已經寫好并放在java.util包中的Arrays類的成員函數中了。該類的這些函數主要完成以下數組操作:

1.數組的排序

例如:

inta[]={2,5,3,8,4};

Arrays.sort(a);

說明:

(1)調用Arrays類中的靜態(tài)函數sort對a數組從小到大進行排序。

(2)只有升序排序,無降序排序。

2.數組元素的定位查找

例如:

intfind;

int[]a={2,3,4,5,8};

find=Arrays.binarySearch(a,8);

說明:

(1)對a數組進行二分查詢,查找8這個數字是否在a數組中出現(xiàn)。

(2)如果沒有出現(xiàn),則返回-1;如果出現(xiàn),則返回出現(xiàn)的下標。

(3)要求a數組有序才能進行二分查詢。

3.數組元素的顯示

例如:

int[]a={2,5,3,8,4};

StringaString=Arrays.toString(a);

System.out.println(aString);

說明:可以使用Arrays的toString方法快速顯示數組的全部內容,包括對二維數組也可以。

程序結果:

4.2字符串

4.2.1字符串基本概念字符串就是用雙引號括起來的一串字符,如字符串常量"HelloJava"。C語言中的字符串保存在字符數組中,如“chara[10]={"abcXY123"};”定義了一個10個元素的字符數組,用以保存"abcXY123"字符串常量,并以'\0'字符作為結束標記,其在內存中的示意圖如圖4-8所示。

圖4-8C語言數組在內存的示意圖

程序結果:

C語言對字符串的處理,主要使用的是string.h頭文件里的字符串處理函數;其次是對字符串數組遍歷,在遍歷過程中進行處理。標準C語言的字符串處理函數大概有20多個,常用的函數如表4-1所示。

對于程序示例4-7,Java只需要下列3句就完成了:

Strings="abcXY123";

s=s.toUpperCase();

System.out.println(s);

(1)定義一個字符串對象s,將"abcXY123"保存在s對象中。

(2)調用字符串對象的成員函數,將字符串中小寫字母全部轉換為大寫字母。

(3)輸出字符串對象的內容。

4.2.2String類

1.String類對象的初始化

String類對象的初始化主要有以下幾種方式:

(1)“Strings="abcXY123";”是最為常用且比較方便的定義及初始化字符串對象的方式,字符串對象s保存了"abcXY123"字符串字面值。

(2)從char數組構建出String類對象。

(3)從byte數組構建出String類對象。

(4)從另外一個String類對象構建出String類對象。

程序結果:

2.String類對象的成員函數

String類對象具有很多成員函數,使用這些成員函數能夠很方便地完成各種字符串處理操作。常用的成員函數如表4-2所示(其它沒在表里的函數請查閱JDK幫助文檔)。

程序示例4-9從鍵盤輸入一個字符串給s2,判斷該字符串在指定字符串s1中是否出現(xiàn),如果出現(xiàn),計算次數。

算法分析:判斷子字符串的函數,通過查詢幫助文檔,發(fā)現(xiàn)可以使用indexOf這個函數。對于子字符串,該函數有兩種形式。

①?intindexOf(String

str):返回指定子字符串在此字符串中第一次出現(xiàn)處的索引。

②?intindexOf(String

str,int

fromIndex):返回指定子字符串在此字符串中第一次出現(xiàn)處的索引,從指定的索引開始。

程序結果:

3.字符串處理示例

1)字符串比較

程序結果:

程序分析:

(1)使用“==”比較的是String類型引用變量的值,引用變量保存的是地址,類似于指針變量,所以“==”比較的實際上是地址;而使用equals函數比較的是字符串的內容。

(2)?s1、s2使用new在堆內存中生成的String類對象,不管內容如何,地址肯定不一樣。

(3)從程序結果可以看出來只有s3和s4是相等的,說明s3和s4指向的是同一個地址,如圖4-9所示。圖4-9字符串常量池

2)字符串的篩選

程序示例4-11從鍵盤輸入一個字符串給s2,將s2中的數字字符連接到s1后面。

程序結果:

4.2.3StringBuffer和StringBuilder類

上一節(jié)的程序中有“s1=s1+c;”這樣的字符串拼接操作,一定要注意Java的這個知識點,即字符串是不可變的字符串序列,任何對字符串的修改都會產生新的字符串,然后原字符串引用變量再指向新的字符串。字符串修改包括插入字符、字符串連接、刪除字符等操作。如果對String類對象頻繁使用修改操作就會在內存中出現(xiàn)每次修改后的新字符串,這樣會導致內存消耗增加,并且效率很低。Java提供了StringBuffer和StringBuilder類兩個類來解決該問題,它們可以看成是String類的補充。

StringBuffer和StringBuilder類提供的方法基本相同,主要是append和insert方法,對字符串進行添加和插入操作。StringBuilder類作為可變的字符序列是5.0版新增的,被設計用作StringBuffer的一個簡易替換;此類提供一個與StringBuffer兼容的API,但不保證同步,在字符串緩沖區(qū)被單個線程使用的時候使用(這種情況很普遍);建議優(yōu)先采用該類,因為在大多數實現(xiàn)中,它比StringBuffer效率要高。

程序結果:

程序分析:

(1)語句“String[]st=s.split("-");”使用“-”對s字符串進行分隔,形成字符串數組返回給st,st里的字符串元素為[adaf,123,ff,252,35,kkk]。

(2)對字符串數組st進行遍歷,如果st的字符串元素以數字開頭,就向StringBuilder對象sr里添加一個“$”以及該字符串。

(3)也可以不用StringBuilder對象,直接進行字符串拼接“result=result+"$"+st[i];|,這樣程序結果是一樣的,但是效率不同,尤其是拼接次數多的時候。

本章小結

1.在Java數組的定義中要注意棧內存和堆內存的概念,數組名是在棧內存空間的引用變量,數組真正的元素是放置在堆內存中的。2.一般是用for循環(huán)來遍歷一維數組,在遍歷的過程中對數組元素進行操作。3.Java的二維數組與C語言一樣,二維數組可看成多個一維數組的一維數組,但是Java可以定義出不規(guī)則的二維數組,各行的元素個數不同。

4.二維數組的遍歷一般使用二重循環(huán)來處理,外層循環(huán)表示行,內層循環(huán)表示某行的各列。

5.使用Arrays類的類成員方法能讓程序員很方便地對數組進行排序、查找、顯示等操作。

6.Java使用String類來處理字符串,String類中有很多個字符串處理函數,只需要調用這些函數就能完成相應的字符串處理功能。

7.字符串是不可修改的,一旦修改就會產生新的字符串序列,所以使用StringBuilder和StringBuffer類來作為String類的補充,以便于對字符串的各種修改操作。第五章Java類與對象5.1面向對象編程基礎5.2類與對象5.3構造函數5.4成員修飾符本章小結

5.1面向對象編程基礎

1.面向對象編程的優(yōu)點

(1)方便建模:雖然面向對象語言中的對象與現(xiàn)實生活中的對象并不是同一個概念,但很多時候可以將現(xiàn)實生活中對象的概念抽象后稍作修改來進行建模,大大方便了建模的過程。

(2)模塊化:通過封裝可以定義對象的屬性和方法的訪問級別,通過不同的訪問修飾符控制對外的接口,防止內部數據在不安全的情況下被修改。

(3)易維護:采用面向對象思想設計的結構可讀性高,繼承的存在增加了代碼的復用性,即使改變需求,維護也只是在局部模塊,方便且成本較低。

(4)易擴展:通過繼承、多態(tài)等技術減少冗余代碼,并易于擴展現(xiàn)有代碼,即在標準的模塊上構建程序,而不必一切從頭開始,從而提高了編程效率。

2.面向對象編程的三大特征

(1)封裝。封裝即把對象的屬性和方法封裝成一個獨立的單位,并隱蔽對象的內部細節(jié)。這主要體現(xiàn)為兩方面內容:

①封裝體:把對象的屬性和方法結合在一起,形成一個不可分割的獨立單位。

②信息隱蔽:可以通過訪問控制符來控制信息對外的公開程度,對象的使用者只是通過預先定義的接口關聯(lián)到某一對象的行為和數據,而不知道其內部細節(jié)。

(2)繼承。繼承是在已有的類的基礎上進行擴充、改造,得到新的數據類型,可以實現(xiàn)程序的代碼復用,它是存在于面向對象程序中的兩個類之間的一種關系:當一個類獲得另一個類中所有非私有的成員屬性和行為時,就稱這兩個類之間具有繼承關系。被繼承的類稱為父類或超類,繼承了父類或超類的屬性和行為的類稱為子類。

(3)多態(tài)。在繼承的基礎上,某些類的方法只有在程序運行過程中才能看出具體表現(xiàn)出來的行為,稱之為多態(tài)性。多態(tài)性是增強程序擴展性、可維護性的重要手段和技術。

5.2類與對象

5.2.1類的基本概念類(Class)用來描述具有相同的屬性和方法的對象的集合,可以看成是對象的模板,它定義了該集合中所有對象共有的屬性和方法,而對象是類的具體實例。

程序設計所面對的問題域——客觀世界是由許多事物構成的,這些事物既可以是有形的(比如一個學生、一張桌子),也可以是無形的(比如一次購買、一次會議),把客觀世界中的事物映射到面向對象的程序設計中就是對象,對象是面向對象程序設計中用來描述客觀事物的程序單位。客觀世界中的許多對象,無論是其屬性還是其行為常常有許多共同性,抽象出這些對象的共同性便可以構成類,所以類是對象的抽象和歸納,對象是類的實例。

Java中的類被認為是一種自定義數據類型,C語言中則可以使用已有的類型作為自定義結構體類型的成員,從而生成新的結構體類型;但是C語言中的結構體類型只是封裝了成員變量,Java中的類除封裝了成員變量外,還封裝了成員方法,由類可以定義具體的實例——對象,每個對象具有自己的成員變量和成員方法。

5.2.2類的結構與定義

1.學生屬性(field)

在學生類眾多的屬性中,程序設計時有些屬性是必要的,如學生的學號、姓名、性別,有些屬性就需要根據程序的上下文(軟件的需求)進行取舍,比如軟件主要用于處理學生的成績,那么學生的籍貫、身高、愛好、體重、外貌、習慣、特長等等這些屬性就可以不用設計到學生類中,這些屬性對應到類的結構中,就稱為成員變量。

2.學生行為(method)

真的需要將現(xiàn)實世界中學生的行為設計到學生類中嗎?吃飯、學習、睡覺、跑步、游泳等等行為就算想在程序中實現(xiàn),也很難設計到學生類中(在一些特定的軟件環(huán)境中可能真的需要對這些行為進行程序實現(xiàn),比如3D游戲)。大多數情況下對于學生類行為設計指的是方法(函數)的定義,對應學生類結構中的成員方法,這些成員方法主要是對學生類數據進行處理,比如顯示學生的信息、獲取學生的年齡、修改學生的成績、求學生成績的平均值等等,它們代表了學生類中提供的功能和服務,并不真的需要實現(xiàn)現(xiàn)實世界中學生的動態(tài)行為。

3.構造函數(Constructor)

學生類中有一類特殊的函數,用于構造出學生類的實例,即具體的學生對象(如名叫張三的學生),這類函數被稱為構造函數,在構造學生對象的時候使用new來調用。構造函數的作用是生成學生類對象,在函數中一般是對學生屬性進行初始化。如果一個構造函數什么也不做,那生成的學生實例就類似一張白紙,只表示有這么一個學生,但是學生的各個屬性沒有值。

上述內容定義一個學生類的主要結構,如圖5-1所示。圖5-1Student類結構

(1)定義一個學生類使用class關鍵字,如:

publicclassStudent1{

}

該類的名字Student1要與文件名Student1.java一致,花括號{}之間是類的定義。

(2)該類有五個成員變量,對應學生類的五個屬性,即學號、姓名、性別、分數1、分數2。對每個屬性需要定義屬性的類型,比如學號的類型可以是int,也可以是String,這需要根據學生的學號取值來定。如果學號全是整數,可以使用int,也可以使用String;如果有其它字符,就只能使用String。

(3)成員變量還有一些其它的修飾符,如訪問控制符,靜態(tài)修飾符static,終態(tài)修飾符final等,會在后面具體說明。

(4)該類具有一個空的構造函數(目前暫時不用,具體在后面進行說明),使用new來調用該函數能夠生成一個Student類的對象。

(5)成員方法1用于求一個學生對象兩科分數的平均分。

(6)成員方法2用于顯示學生對象各個成員變量的信息。

5.2.3對象的基本概念

對象(object)是類的一個具體實例(instance),每個對象都有自己的成員變量和成員方法,在堆內存中具有一段內存空間以保存自己的成員變量,例如張三是學生類的一個具體學生對象。

上一節(jié)定義好了Student類,將現(xiàn)實世界的學生抽象到了程序中,這一節(jié)在程序中由該類產生具體的學生對象實例,如圖5-2所示。

圖5-2Student類與對象

定義好了Student類,就可以由類生成對象,主要語法是使用new調用類的構造函數,在堆內存區(qū)域獲得一個對象的內存空間,在該空間中存放該對象的成員變量的值。例如語句“Students1=newStudent();”表示使用Student類生成了一個該類的對象,使用s1這個引用變量指向該對象,具體的內存示意圖如圖5-3所示。圖5-3Student對象內存示意圖

5.2.4對象的初始化

1.對象成員的類型

如何給s1對象中的成員進行賦值呢?首先要分清楚對象的成員有哪些類型,對象成員變量的類型主要有基本數據類型、JDK預定義類型和用戶自定義類型。

1)基本數據類型

如果某個成員變量是基本數據類型,即使沒有進行初始化,Java也會確保其有一個默認值,如表5-1所示。

2)?JDK預定義類型

預定義類型即JDK自帶的類,例如常用的字符串類String,學生類中很多成員變量都是String字符串類型的,如名字、性別、班級等等。JDK龐大的類庫能夠方便程序員構造程序,比如可以使用Date或者Calendar類來作為學生類的出生日期成員變量(出生日期)。在使用這些類作為成員變量類型時可查詢JDK幫助文檔,了解這些類的用法。

3)用戶自定義類型

也可以使用用戶自定義的類型來作為成員變量的類型,比如可以在學生類中定

溫馨提示

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

評論

0/150

提交評論