面向?qū)ο蟪绦蛟O(shè)計GxwJavapart.ppt_第1頁
面向?qū)ο蟪绦蛟O(shè)計GxwJavapart.ppt_第2頁
面向?qū)ο蟪绦蛟O(shè)計GxwJavapart.ppt_第3頁
面向?qū)ο蟪绦蛟O(shè)計GxwJavapart.ppt_第4頁
面向?qū)ο蟪绦蛟O(shè)計GxwJavapart.ppt_第5頁
已閱讀5頁,還剩260頁未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

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

文檔簡介

1 面向?qū)ο蟪绦蛟O(shè)計 ForJAVA 教材 JAVA語言導(dǎo)學(xué)出版 機(jī)械工業(yè)出版社編著 MaryCampione KathyWalrathet al參考文獻(xiàn) JAVA語言程序設(shè)計 基礎(chǔ)篇編著 Y DanielLiang出版 機(jī)械工業(yè)出版社 2 第11章Java起步 3 Java簡史 Internet迅猛發(fā)展Java語言正式問世被美國著名雜志PCMagazine評為1995年十大優(yōu)秀科技產(chǎn)品之一 JamesGosling領(lǐng)導(dǎo)的Green小組開發(fā)了面向數(shù)字家電的Oak語言 推出了Java2平臺 性能上有所提高 而且對Java的基本模式進(jìn)行了完善 并提供了更為豐富的API 1991 1995 1998 4 Java2版本劃分 5 Java語言主要特性 WriteOnceRunAnywhere JVM 在語言級支持多線程 C 必須第三方庫 取消了多重繼承 指針 自動地內(nèi)存垃圾回收 分布式 Java程序可以在多臺機(jī)器上協(xié)同計算 RMI 動態(tài)性 JVM的ClassLoader支持類的動態(tài)裝載 甚至允許動態(tài)地重新裝入已修改的代碼 同時應(yīng)用程序繼續(xù)執(zhí)行 反射機(jī)制 可靠性 由于取消指針 內(nèi)存自動回收 使得程序更為健壯 安全性 ClassLoader將類裝載入JVM運(yùn)行前會進(jìn)行安全檢查 用戶可以配置安全策略 6 Java程序及其運(yùn)行機(jī)制 Java虛擬機(jī) 在真實機(jī)器中用軟件模擬實現(xiàn)的一種抽象的機(jī)器 Java虛擬機(jī)規(guī)范 負(fù)責(zé)解釋和執(zhí)行Java程序編譯后產(chǎn)生的字節(jié)碼 JavaAPI是Java系統(tǒng)提供的預(yù)先定義好的軟件組件的集合 它們提供許多可供程序員調(diào)用的常用功能豐富的API為程序員提供了極大的方便 但也是學(xué)習(xí)的難點(diǎn) 7 Java語言規(guī)范 API JDK IDE Java語言規(guī)范 JavaLanguageSpecification JLS Java語言的語法和語義技術(shù)性定義 應(yīng)用程序接口 ApplicationProgramInterface API Java預(yù)定義類和接口 Java開發(fā)工具包 JavaDevelopmentKit JDK 包含軟件庫 編譯器 解釋器以及其它工具 集成開發(fā)環(huán)境 IntegratedDevelopmentEnvironment IDE 在圖形界面中 完成編輯 編譯 調(diào)試和在線幫助等功能 8 JavaAPI手冊及JDK 9 Java程序運(yùn)行機(jī)制 操作系統(tǒng) 源代碼 可執(zhí)行代碼 目標(biāo)碼 編譯 連接 運(yùn)行 源代碼 字節(jié)碼 編譯 解釋執(zhí)行 Java解釋器 傳統(tǒng)語言的運(yùn)行機(jī)制 Java語言的運(yùn)行機(jī)制 10 Java程序類型 Java應(yīng)用程序 JavaApplication 是獨(dú)立完整的程序在命令行調(diào)用獨(dú)立的解釋器軟件即可運(yùn)行主類必須有main方法 這也是程序的入口Java小程序JavaApplet 是指在瀏覽器里運(yùn)行的Java小程序 一般來說客戶端是指用戶所使用的瀏覽器 JavaServlet 是在服務(wù)器端執(zhí)行的Java程序 為了能夠支持Servlet的運(yùn)行 服務(wù)器端必須安裝包含Java虛擬機(jī)的服務(wù)器軟件 Tomcat WebLogic WebSphere 這種能夠支持服務(wù)端小程序的服務(wù)器一般被稱為應(yīng)用服務(wù)器 Servlet容器 11 Java開發(fā)環(huán)境 JDK J2SDK JavaDeveloperKit JDK1 2 J2SDK1 3 J2SDK1 4 JDK5 0 J2SDK1 5 JDK6 0Java集成開發(fā)環(huán)境 IDE VisualJ 不再支持 不要使用 NetBeansJBuilderEclipseWSAD JCreator 建議開始不要使用IDE 使用JDK 通過命令行方式編譯和運(yùn)行Java程序 不要過度依賴IDE 12 JDK的安裝與設(shè)置 從 13 Java運(yùn)行環(huán)境配置 建議創(chuàng)建一個批處理文件 bat文件 在批處理文件里設(shè)置環(huán)境變量rem假設(shè)JDK安裝在D JDK6目錄下setJAVA HOME D JDK6 binsetpath path JAVA HOME setclasspath classpath E ch05 bin 14 Java實用程序簡介 javac Java編譯器 將Java源代碼編譯為字節(jié)碼 java Java解釋器 用來解釋執(zhí)行Java程序的字節(jié)碼文件 class appletviewer 小程序瀏覽器 一種執(zhí)行HTML文件上的Java小程序類的Java瀏覽器 javadoc 根據(jù)Java源代碼及其說明語句生成的HTML文檔 jdb Java調(diào)試器 可以逐行地執(zhí)行程序 設(shè)置斷點(diǎn)和檢查變量 javah 產(chǎn)生可以調(diào)用Java過程的C過程 或建立能被Java程序調(diào)用的C過程的頭文件 Javap Java反匯編器 顯示編譯類文件中的可訪問功能和數(shù)據(jù) 同時顯示字節(jié)代碼含義 所有這些命令可以列出幫助信息command help 15 編輯源代碼 一般情況下 我們可以使用系統(tǒng)平臺下的任何文本編輯器進(jìn)行源代碼的編輯 在Windows平臺下常用的是Window系統(tǒng)自帶的 記事本 程序或 寫字板 程序Java源碼大小寫敏感Java源碼文件的擴(kuò)展名 javaJava源程序文件也不能隨意命名 其文件名必須與程序中主類 public 的類名完全相同 包括大小寫在內(nèi)一個Java源文件里只能有一個public類 16 創(chuàng)建 編譯和執(zhí)行Java程序 創(chuàng)建和編輯源代碼可以使用任何文本編譯器創(chuàng)建和編輯源代碼 文件名必須與公共的類名一致 文件后綴為 java編譯在控制臺中執(zhí)行 javac源文件名生成 class字節(jié)碼文件執(zhí)行在控制臺中執(zhí)行 java類名 17 MyFirstJavaApp java 注意類名和文件名相同 含main的類必須用public Java也支持多行注釋 包含在 中的為javadoc注釋 在每個包 Package 每個類 及屬性方法前加上javadoc注釋可以自動生成基于HTML的幫助文檔packageCh11 defineapackagecontainingalldemosourcecodeofchapter11 TheMyFirstJavaAppclassimplements ansimpleapplicationthatdisplay HelloWorld totheconsole authorXiwuGu publicclassMyFirstJavaApp paramargs commandlinearguments publicstaticvoidmain String args JAVA是純OOP 沒有全局函數(shù) main也必須 封裝在類里System out println HelloWorld out是System的類變量 靜態(tài)數(shù)據(jù)成員 PrintStream類型 println是out的方法 18 編譯JAVA程序 設(shè)置好path及classpath在JAVA源文件所在目錄下輸入javacMyFirstJavaApp java在當(dāng)前目錄下會生成MyFirstJavaApp class可以指定輸出的 class文件保存的目錄javacMyFirstJavaApp java dbin 將輸出的 class文件保存在當(dāng)前目錄的子目錄bin下 19 運(yùn)行Java程序 要執(zhí)行一個Java程序非常簡單 只需在字節(jié)碼文件所在目錄下輸入下列命令就可以了 java字節(jié)碼文件名注意不要 class后綴 20 Suggestionfordevelopingprogrammingskill Thebestwaytostartprogrammingistohaveaterminalrunninganinteractivelanguageandafriendsittingnearbywhoalreadyknowsthelanguageandhassomethingelsetodobutcanbeinterruptedwithquestions Andyoujusttrystuff tillmoreandmoreyougetthefeelofit Andyoufindyourselfwritingprogramsthatwork Nelson Ted ComputerLib MicrosoftPress 1987 21 第12章面向?qū)ο缶幊?22 面向?qū)ο蟮木幊谈拍?對象和類類和對象的UML表示面向過程vs面向?qū)ο笙⒗^承接口 23 什么是對象 對象 軟件對象 是變量和相關(guān)方法的軟件組合 是對現(xiàn)實世界世界對象的抽象對象具有狀態(tài)和行為同一類對象的行為一致 但狀態(tài)不同 24 什么是類 類 class 定義了同一類對象共有的屬性和方法 類是對象的模板 藍(lán)圖 對象是類的實例 25 類的示例 下面是一個圓類 classCircle doubleradius 1 0 Circle radius 1 0 Circle doubler radius r doublefindArea returnradius radius 3 14159 數(shù)據(jù)字段 方法 構(gòu)造函數(shù) Circle c1radius 1 0 Circle c2radius 10 0 Circle c3radius 15 0 26 類和對象的UML表示 類的UML表示 類名 數(shù)據(jù)字段 方法 對象的UML表示 對象名 類名 數(shù)據(jù)字段值 構(gòu)造函數(shù) 27 面向過程vs面向?qū)ο?面向過程以數(shù)據(jù)結(jié)構(gòu)來描述問題以過程 函數(shù) 來描述算法數(shù)據(jù)結(jié)構(gòu)和算法是分離的 不易維護(hù)及軟件復(fù)用面向?qū)ο髷?shù)據(jù)結(jié)構(gòu)及算法描述被封裝在類里用類的繼承來實現(xiàn)軟件復(fù)用支持多態(tài)只要接口不變 父類的具體實現(xiàn)改變了不會影響子類 易于維護(hù) 28 消息及其組成 消息的發(fā)送者A及目的對象B希望對象B要執(zhí)行的方法的名稱 ChangeGears方法所需參數(shù) lowerGear 汽車 駕駛員 ChangeGears lowerGear 單獨(dú)的一個對象沒什么作用 一個復(fù)雜的軟件系統(tǒng)的功能通過多個對象間的交互實現(xiàn) 對象之間的交互是通過相互發(fā)送消息實現(xiàn)的 當(dāng)對象A 駕駛員 希望對象B 汽車 執(zhí)行時方法 切換到低檔 時 對象A發(fā)送消息給對象B 消息包括 消息發(fā)送具體實現(xiàn) 在對象A的某個方法里調(diào)用對象B的ChangeGears lowerGear 29 繼承 繼承是子類能自動地共享父類中定義的數(shù)據(jù)和方法的機(jī)制 30 單重繼承和多重繼承 單重繼承 一個子類只有一個直接父類多重繼承 一個子類可以有多個直接父類JAVA只支持單重繼承JAVA繼承都是public繼承 因此在JAVA術(shù)語里只有子類 父類 沒有基類和派生類 java lang Object類是所有JAVA類的祖先類 31 接口 interface 接口interface也是一種類 包含常量和方法的定義 無論如何 接口定義的所有變量都是publicstaticfinal類型 所有方法都是publicabstract方法 注意 abstract方法即C 的純虛函數(shù) 因此 接口相當(dāng)于抽象類 不能擁有對象 接口是無關(guān)對象進(jìn)行彼此交互的協(xié)議 無關(guān)對象是指在類的層次結(jié)構(gòu)中沒有相關(guān)性 32 接口示例 publicinterfaceFlyer voidtakeOff voidland voidfly classAirplaneimplementsFlyer publicvoidtakeOff 加速直到離地升空 收起起落架 publicvoidland 放下起落架 減速并降低副翼直到降落 剎車 publicvoidfly 保持引擎運(yùn)轉(zhuǎn) 接口方法的訪問Flyerf newAirPlane f takeOff f fly f land 33 接口和繼承 34 接口 Java類可以實現(xiàn)多個接口 若要能產(chǎn)生實例對象 則必須覆蓋定義每個接口的函數(shù) 接口中的常量也可以被隱藏 可使用接口名限定訪問被隱藏的接口常量 如果類被定義為public的 通常要求存儲在與類同名的Java文件 35 Main java 因classMain為public的interfaceI1 ints 1 t 2 缺省是且只能是publicstaticfinal的intf 缺省是publicabstract interfaceI2 ints 1 缺省是且只能是publicstaticfinal的intf 缺省是publicabstract classTestimplementsI1 I2 intt 隱藏了I1 注意這里的t是實例變量publicintf returnI1 t I2 s publicclassMain publicstaticvoidmain String args System out println newTest f 36 Java程序結(jié)構(gòu) Java程序由若干包構(gòu)成 可以使用無名的缺省包 JAVA里的包作用相當(dāng)于C 的namespace包由package定義 包由一系列的類和接口構(gòu)成同一個包不能定義同名類和接口 一個包可以引用其它包定義的公共類和接口 import 包必須和目錄名建立對應(yīng) 而類名則和該目錄下的java文件的主文件名對應(yīng) 程序的入口main函數(shù)必須位于一個public類中main 且main函數(shù)必須在類中必須是publicstatic的 37 第13章Java語言基礎(chǔ) 38 數(shù)據(jù)類型 原子類型和引用類型 原子類型為值類型 39 原子類型 類型char 采用unicode編碼 每字符2字節(jié)類型byte 一字節(jié)有符號整型類型short 兩字節(jié)有符號整型類型int 4字節(jié)有符號整型類型long 8字節(jié)有符號整型類型float 4字節(jié)單精度浮點(diǎn)數(shù)類型double 8字節(jié)雙精度浮點(diǎn)數(shù)類型boolean 1字節(jié)布爾類型 實際使用1位二進(jìn)制 常量有true和false整數(shù)常量后帶L或l表示long類型 浮點(diǎn)數(shù)后帶D或d表示雙精度浮點(diǎn)數(shù) 帶F或f表示單精度浮點(diǎn)數(shù) 40 引用類型 相當(dāng)于C 的指針類型 在堆上上分配內(nèi)存 但內(nèi)存分配與回收由java自己完成由class interface和數(shù)組構(gòu)成的類型都是引用類型與C 指針不同的是 每次訪問Java的引用類型變量時 訪問的是 相當(dāng)于C 指針?biāo)赶虻?存儲單元的值或內(nèi)容 所有引用類型都是從Object對象派生的 引用類型變量必須用new進(jìn)行實例化 即在堆上分配內(nèi)存和調(diào)用構(gòu)造函數(shù)初始化 Objectx newObject 原子類型自動在棧上分配內(nèi)存 只需要初始化 例如 intx 3 41 原子類型變量 值類型 和引用類型變量的區(qū)別 變量表示存儲數(shù)據(jù)的內(nèi)存單元 原子類型變量存儲的是原子類型的值 引用類型變量存儲的是對象的引用 當(dāng)變量未引用任何對象時 它是值為null 42 標(biāo)識符 Java中使用標(biāo)識符 identifier 來命名變量 常量 方法 類 包等實體 標(biāo)識符命名規(guī)則標(biāo)識符是由字母 數(shù)字 下劃線 美元符號 組成的字符序列 標(biāo)識符必須以字母 下劃線 美元符號 開頭 不能以數(shù)字開頭 標(biāo)識符不能是保留字 標(biāo)識符不能為true false或null 標(biāo)識符可以為任意長度 43 Java保留字 44 變量名 變量名使用合法的表示符做變量名稱 變量名可以被對象名 類名中或包名 類名限定 必要時要多級限定 如類變量System out java lang Math PI 這類變量叫成員變量 局部變量通常指的是函數(shù)中聲明的變量 其作用范圍就是該函數(shù) 成員變量是指類的成員 可分為類變量和實例變量 實例變量必須依賴于對象的存在而存在 在類的函數(shù)成員以外訪問時 通常需要實例變量是可見的 且需要使用 對象 實例變量 進(jìn)行限定訪問 只讀變量使用final關(guān)鍵字聲明 finaldatatypeCONSTANT NAME value 約定 變量名 方法名以小寫字母開始 若后面連接單詞 則單詞首字母大寫 如radius getRaidus 常量全部使用大寫字母 約定 類名每個單詞的首字母大寫 如AirPlane 45 運(yùn)算符 operator 包括單目 雙目和三目的 三目運(yùn)算符為 算術(shù)運(yùn)算符 單目 雙目 單目 也分前置和后置 其意義和C 一致但 不允許出現(xiàn)在 左邊如 i 1 錯關(guān)系運(yùn)算符 op2 op1右移op2位 左邊填符號位 即最高位 op1 op2 op1右移op2位 左邊填0 無符號右移 46 運(yùn)算符 位邏輯運(yùn)算符 按位與 按位或 按位求反 按位異或 位邏輯運(yùn)算符只能用于整數(shù)類型 byte short int long 賦值及簡捷賦值運(yùn)算符 Java要求賦值運(yùn)算符左邊必須是變量 不能是表達(dá)式 算術(shù)簡寫 位簡寫 移位簡寫 三目運(yùn)算符 數(shù)組下標(biāo)運(yùn)算符 成員訪問運(yùn)算符 對象創(chuàng)建運(yùn)算符 newRTTI類型識別運(yùn)算符 instanceof函數(shù)調(diào)用運(yùn)算符 以逗號分開的參數(shù)列表 強(qiáng)制類型轉(zhuǎn)換運(yùn)算符 目標(biāo)類型 47 運(yùn)算符 JAVA里布爾值的結(jié)果為true和false 而不像C 是0或1 并且不能將其他類型強(qiáng)制轉(zhuǎn)換為布爾類型instanceof用于判定前一個變量 或?qū)ο?是否為后面的類型 類 的實例 48 表達(dá)式 expression 表達(dá)式由字面量 literal 變量 操作符和方法調(diào)用構(gòu)成 用于求出單個值Java的表達(dá)式?jīng)]有C 的左值概念 表達(dá)式求值 evaluate 要注意操作符優(yōu)先級和結(jié)合性 見書P62表20 49 語句 statements 語句是完整的可執(zhí)行單元 以分號結(jié)束以下表達(dá)式加上 就成為了語句賦值表達(dá)式 方法調(diào)用對象創(chuàng)建表達(dá)式 new表達(dá)式 Java的語句基本同C 除異常可有finally外 無論出現(xiàn)異常與否 都必須執(zhí)行finally的部分 C 實際上也有 不過保留字為 finally 條件語句 if if else if elseif switch循環(huán) while do while for異常處理 try catch finally 50 第14章對象基礎(chǔ)和簡單數(shù)據(jù)對象 51 對象的生命周期 對象的生命周期 創(chuàng)建 使用 清除 52 對象的創(chuàng)建 創(chuàng)建 類型名引用變量 new類名 構(gòu)造器的參數(shù) 必須用new創(chuàng)建 new會自動地調(diào)用類的構(gòu)造函數(shù) 一個類可以定義多個重載的構(gòu)造器 如果new創(chuàng)建的對象沒有賦給任何變量 該對象除當(dāng)時訪問外 將無法在以后訪問 構(gòu)造器沒有返回類型 構(gòu)造器的名字與類名相同 即使將返回類型說明為void 也會導(dǎo)致其成為非構(gòu)造函數(shù) 每個Java類 不含接口 都至少有一個構(gòu)造器 如果類沒有顯示定義 系統(tǒng)會默認(rèn)地為該類提供一個不包含任何參數(shù)的無參構(gòu)造器 53 對象的創(chuàng)建 CirclemyCircle newCircle 1 聲明一個引用變量 變量類型為Circle 變量名為myCircle 2 創(chuàng)建對象 返回對象的引用 3 將對象的引用賦值給變量myCircle 以上語句等價于 CirclemyCircle 聲明一個Circle類型的引用 變量 其值為null 稱為空引用myCircle newCircle 創(chuàng)建對象 并將 該對象的引用賦給myCircle 使myCircle引用被創(chuàng)建的對象 null 引用類型CirclemyCircle myCircle 對象的引用 myCircle newCircle myCircle 54 對象的使用 對象的使用有兩種方式 操作或者檢查它的變量 數(shù)據(jù)成員 調(diào)用它的方法要使用對象的實例成員 首先要得到該對象的引用 對于基于RMI的分布式對象 可以通過名字透明地得到一個運(yùn)程對象的引用 屏蔽了網(wǎng)絡(luò)協(xié)議 網(wǎng)絡(luò)地址 端口號等細(xì)節(jié) 當(dāng)獲得一個對象 不管是本地的還是運(yùn)程的 的引用后 就可以訪問對象的屬性或調(diào)用其方法 55 對象的使用 類的成員分兩種 實例成員與類成員 實例成員包括實例變量與實例方法實例成員依賴于實例 即對象 存在 同一個類的不同實例都擁有一份實例變量的拷貝 對某個實例變量的操作不影響到其它實例變量 實例變量與對象生命周期一樣 隨對象的創(chuàng)建而創(chuàng)建 隨對象的消亡而消亡 必須通過實例的引用來調(diào)用實例方法 所謂的依賴 類成員包括類變量與類方法類成員不依賴于實例存在 無任何對象時也可訪問 即值已存在 同一個類的不同實例共享同一個類變量 對類變量的改變會影響所有實例 類變量的生存期不依賴于對象 其它類可以不用通過該類的實例 直接通過類名就訪問它們 同樣 類方法也可直接通過類名訪問 56 實例變量與靜態(tài)變量 實例變量 instancevariable 未用static修飾的成員變量 屬于類的具體實例 對象 只能通過引用變量訪問 即 對象名 變量名 類變量 staticvariable 是用static修飾的變量 在一個類的所有實例間共享 也稱類變量 靜態(tài)變量可以通過類名訪問 即類名 變量名 也可用對象名訪問 二個對象的radius實例變量存儲于不同空間 彼此不影響 所有對象共享靜態(tài)成員變量存貯在公共內(nèi)存某個對象對其修改會影響其他對象 57 靜態(tài)常量 靜態(tài)常量是用staticfinal修飾的變量 例如 Math類中的常量PI定義為 publicstaticfinaldoublePI 3 14159265358979323846 58 類方法 類方法 staticmethod 是用static修飾的方法 例如 mainMath random類方法可以通過類名和對象名調(diào)用 類方法只能訪問類的靜態(tài)成員 不能訪問類中的實例成員 59 實例方法 實例方法 staticmethod 是沒有用static修飾的方法 實例方法只能通過對象名 引用 調(diào)用 實例方法可以訪問類的靜態(tài)成員和實例成員 60 成員的訪問 實例成員通過對象限定使用 類成員可通過類名限定使用 也可通過對象限定使用 提倡用第一種使用形式 classTest 等價于classTestextendsObject 即Test繼承自O(shè)bject對象 intt staticintw 3 定義及初始化wpublicTest intx t x 在構(gòu)造函數(shù)中初始化w與否根據(jù)需要確定 注意JAVA在類的定義結(jié)束后不要 同時JAVA類的方法都必須在類體里實現(xiàn)publicclassMain publicstaticvoidmain String args Testx newTest 3 inty x t t的訪問權(quán)限不是private 是defaulty x w 不提倡以這種形式使用 為什么 y Test w 61 Object對象 所有類都直接或間接繼承自O(shè)bject類 Object為父類 所有可實例化類的內(nèi)存管理都是由Object通過引用計數(shù)完成的 A繼承自B的關(guān)系使用extends說明 如classAextendsB 子類在其構(gòu)造器的第一條語句缺省調(diào)用父類無參構(gòu)造函數(shù) 如果子類中沒有顯式地調(diào)用父類的構(gòu)造函數(shù) 編譯器會自動地在子類構(gòu)造函數(shù)第一條語句前加上super 也可以顯示地調(diào)用 必須是子類構(gòu)造函數(shù)的第一條語句 62 Object對象 Object對象負(fù)責(zé)了對象內(nèi)存管理 包括垃圾自動回收 Object類定義了所有類都必須有的基本狀態(tài)和行為 clone 對象克隆 缺省是淺拷貝 一般需要覆蓋 finalize 相當(dāng)于析構(gòu) equals 比較二個對象是否相等 hashCodetoString 將對象轉(zhuǎn)換為字符串 getClass 得到一個對象的類別信息 RTTI notify notifyAll以及wait 線程同步 其中clone finalize的訪問權(quán)限是protected 其它為public 此外 getClass notify notifyAll及wait被定義為final方法 不能被子類覆蓋 63 classA Object對象負(fù)責(zé)管理內(nèi)存 通過對象的引用次數(shù)判定內(nèi)存可否回收intx publicA intx this x x publicclassMain 注意生命期和作用域的不一致staticAf Aa newA 3 Ab a Ac newA 4 returna 對象2生命起止在f內(nèi)publicstaticvoidmain String args Ax f f返回 c的作用域結(jié)束導(dǎo)致對象2的引用計數(shù)為0 f返回 a b的作用域結(jié)束 返回值賦給x 導(dǎo)致對象1引用計數(shù)為1 main返回 x的作用域結(jié)束對象1的引用計數(shù) 0 64 對象的生命周期 由于JAVA在對象的引用計數(shù) 0時才清除對象 導(dǎo)致作用域和生命周期的不一致 在上例中 引用a的作用域在f內(nèi) 但a引用的對象的生命周期在函數(shù)f結(jié)束后還沒結(jié)束這是JAVA和C 的一個重要區(qū)別 C 如果函數(shù)返回一個引用 該引用了函數(shù)內(nèi)的局部對象 則函數(shù)返回的引用引用的是一個失效的對象 編譯沒問題 但會產(chǎn)生runtimeerror JAVA 函數(shù)返回一個引用可以引用函數(shù)內(nèi)生成的對象 函數(shù)返回后通過該引用還是可以訪問該對象 因為該對象的生命周期沒結(jié)束 65 finalize 方法 finalize 方法在Object中有缺省實現(xiàn) 在用戶自定義的類中 它可以被覆蓋 但一般在最后要調(diào)用父類的finalize 方法 來清除對象所使用的所有資源 相當(dāng)于C 的析構(gòu)函數(shù) 在對對象進(jìn)行垃圾收集前 Java運(yùn)行時系統(tǒng)會自動調(diào)用對象的finalize 方法來釋放系統(tǒng)資源 注意 finalize 是protected 不可在類外通過對象進(jìn)行調(diào)用 在變量的生命期結(jié)束時 例如前例中的變量c 系統(tǒng)并不一定馬上調(diào)用垃圾收集程序 即與C 的析構(gòu)函數(shù)立即執(zhí)行有所不同 某些情況下 程序員可能需要實現(xiàn)finalize 方法來釋放不由垃圾收集器所控制的資源 例如 需要關(guān)閉對象打開的文件 考慮到finalize 只在垃圾收集前被調(diào)用 而垃圾收集可能被延遲 在急需關(guān)閉文件以供其它任務(wù)打開時 最好強(qiáng)制系統(tǒng)進(jìn)行垃圾收集 即調(diào)用System gc 從而引起finalize 執(zhí)行 一般情況下 如果自定義的對象僅使用了內(nèi)存 而且不是通過native函數(shù) 例如通過C Java不自動回收C 分配的內(nèi)存 申請的 就沒有必要自己實現(xiàn)finalize 方法 66 對象相等的判定 用來判定是否引用同一個對象 如上例中判定a b的結(jié)果為true 如果存在另一個對象Ad newA 3 判定a d 則結(jié)果為false 即兩個對象的地址不同 Object提供了函數(shù)equals 來判斷對象是否相等 但其實現(xiàn)是比較二個引用是否指向同一個對象 因此往往需要在自定義類型中覆蓋該函數(shù) 一般來說 如果自定義類型中包含了引用類型的實例變量 成員 則需要覆蓋equals hashCode clone 缺省行為是淺拷貝賦值 toString 通常是必須覆蓋的 用于將當(dāng)前對象轉(zhuǎn)化為可打印的字符串 67 Object類的equals方法 Object是所有Java類的祖先類 它實現(xiàn)了一些有用的方法 如前面介紹的eauals方法publicbooleanequals Objectobject 檢驗兩個對象是否相等語法 object1 equals object2 該方法只是比較二個引用變量是否相等 即object1和object2是否指向同一個對象 而不是比較二個引用變量指向的對象的內(nèi)容是否相等 所以子類很有必要覆蓋該方法 classCircle privatedoubleradius 1 0 Circle Circle doubler radius r publicbooleanequals Objecto if oinstanceofCircle returnthis radius Circle o radius elsereturnfalse 例如二個Circle對象 如果半徑相等就相等 我們可以在Circle類里覆蓋該方法 68 Object類中的clone方法 protectedObjectclone 復(fù)制對象 缺省為淺拷貝 對象引用變量的賦值是不能復(fù)制對象的 要創(chuàng)建有單獨(dú)內(nèi)存空間的新對象 使用clone 方法newobject someobjet clone newobject someobject子類要實現(xiàn)clone方法 首先應(yīng)該實現(xiàn)Cloneable接口 同時覆蓋從Object類繼承的clone方法 并將該方法改為public 69 Object類中的toString方法 publicStringtoString 返回代表這個對象的字符串 Object類的默認(rèn)實現(xiàn)是返回由 包名 類名 hashCode組成 Circlecircle newCircle circle toString Circle 15037e5Object的toString方法提供的信息不是很有用 因此通常子類應(yīng)該覆蓋該方法 提供更有意義的信息 classCircle privatedoubleradius 1 0 Circle Circle doubler radius r publicStringtoString return Acirclewithradius radius 字符串 數(shù)值結(jié)果為字符串 70 簡單數(shù)據(jù)對象 除了提供原子類型如char int等原子類型外 Java還提供了這些類型的包裝類 Wrapper 如Character Integer等 作用包裝提供了額外的信息 例如通過Integer類型 我們能夠獲知最小或最大的整數(shù)值是多少 由值類型變成了引用類型 用于需要對象引用的場合 比如函數(shù)需要引用參數(shù)voidswap inti1 inti2 callbyvaluevoidswap Integero1 Integero2 callbyref這些類還定義了一些有用的方法 用于將值轉(zhuǎn)換為其他類型 轉(zhuǎn)換為字符串等等 BigInteger和BigDecimal從精度上擴(kuò)展了原始數(shù)據(jù)類型 這些類可用于反射 Reflection 反射機(jī)制允許程序收集JVM中任何對象或類的信息 71 簡單數(shù)據(jù)對象 Number Byte Short Integer Long Float Double Character Boolean Object 每個Wrapper類對應(yīng)一種原子數(shù)據(jù)類型 每個Wrapper類實現(xiàn)了接口Comparable BigInteger BigDecimal 72 包裝類的構(gòu)造函數(shù) 構(gòu)造函數(shù)以一個對應(yīng)的基本數(shù)據(jù)類型為參數(shù)以字符串為參數(shù) 除了Character 如Integer類和Double類的構(gòu)造函數(shù)如下 publicDouble doublevalue publicDouble Stringvalue 例如DoubledoubleObject newDouble 5 0 DoubledoubleObject newDouble 5 0 包裝類沒有無參構(gòu)造方法 73 數(shù)值包裝類的常量 每一個數(shù)值包裝類都有常量MAX VALUE和MIN VALUE MAX VALUE對應(yīng)本數(shù)據(jù)類型的最大值 對Byte Short Integer和Long MIN VALUE對應(yīng)最小值對Float和Double MIN VALUE對應(yīng)最小正值如System out println Themaximumintegeris Integer MAX VALUE System out println Theminimumpositivefloatis Float MIN VALUE 74 從包裝類對象 基本數(shù)據(jù)類型 Byte Short Integer Long Float Double類都分別實現(xiàn)方法byteValue shortValue intValue longValue floatValue doubleValue 這些方法原型如下publicbytebyteValue Byte類實例方法publicshortshortValue Short類實例方法publicintintValue Integer類實例方法publiclonglongValue Long類實例方法publicfloatfloatValue Float類實例方法publicdoubledoubleValue Double類實例方法如inti newInteger 10 intValue 另外每個類的toString 方法將數(shù)值轉(zhuǎn)換成字符串 75 字符串轉(zhuǎn)換成數(shù)值 Byte Short Integer Long Float DoublepublicstatictypeparseType Strings publicstatictypeparseType Strings intradix 如inti Integer parseInt 11 2 3inti Integer parseInt 12 8 10inti Integer parseInt 1A 16 26doubled Double parseDouble 3 14 3 14 76 靜態(tài)方法valueOf 該方法創(chuàng)建一個新的對象 并將它初始化為指定字符串的值如 DoubledoubleObject Double valueOf 12 4 IntegerintegerObject Integer valueOf 12 77 基本類型與包裝類之間的自動轉(zhuǎn)換 JDK1 5允許基本類型和包裝類之間的自動轉(zhuǎn)換 將基本類型的值轉(zhuǎn)換為包裝類對象 稱為裝箱 boxing 將包裝類對象轉(zhuǎn)換為基本類型的值 稱為開箱 unboxing IntegerintObject 2 裝箱IntegerintObject1 2 intObject2 3 inti intObject1 開箱 78 數(shù)據(jù)的格式化 高級算術(shù)功能 自學(xué) 79 字符 字符串對象 JavaAPI提供了三個處理字符數(shù)據(jù)的類 Character String StringBuffer String是一個finalclass 不能被其它類繼承 Character用于處理單個字符 String用于處理字符串常量 而StringBuffer用于可變字符串的處理 80 Character類 Character類的作用將char類型的數(shù)據(jù)封裝成對象包含處理字符的方法和常量Character char 構(gòu)造函數(shù)靜態(tài)方法isDigit方法判斷一個字符是否是數(shù)字isLetter方法判斷一個字符是否是字母isLetterOrDigit方法判斷一個字符是否是字母或數(shù)字isLowerCase方法判斷一個字符是否是小寫isUpperCase方法判斷一個字符是否是大寫toLowerCase方法將一個字符轉(zhuǎn)換成小寫toUpperCase方法將一個字符轉(zhuǎn)換成大寫 81 Character類 實例例方法compareTo Character 比較兩個字符對象包含的值 該實例方法返回一個整數(shù)值 表示當(dāng)前對象中的值是大于 等于還是小于參數(shù)所包含的值 equals Object 比較當(dāng)前對象包含的值與參數(shù)對象包含的值 如果兩個對象包含的值相等 那么這個實例方法返回true Character類覆蓋了該方法 因此比較的是對象的內(nèi)容 toString 這個實例方法將當(dāng)前對象轉(zhuǎn)換為字符串 charValue 這個實例方法以原始char值的形式返回當(dāng)前字符對象包含的值 82 Character類示例 Charactera newCharacter a Characterb newCharacter b intdiff pareTo b 比較大小 1booleanb1 a equals b falseStrings a toString a booleanb2 Character isDigit a falseCharacterc Character toUpperCase b B booleanb3 Character isUpperCase c truecharc a charValue 83 字符串 String Java提供兩個類用于存儲和操作字符串String用于其值不能改變的字符串StringBuffer用于可被修改的字符串由于String對象存貯的是不可變的字符串 因此比StringBuffer更高效 對于程序任何位置出現(xiàn)的雙引號標(biāo)記的字符串常量 系統(tǒng)都會自動創(chuàng)建一個String對象 相同字符串常量僅建立一個共享對象 可通過String對象的方法對字符串常量進(jìn)行操作 84 String的構(gòu)造函數(shù)很多 85 創(chuàng)建字符串對象 第一種方法是用new運(yùn)算符如 StringstrRef newString stringLiteral Stringmessage newString WelcometoJava 調(diào)用String String 構(gòu)造函數(shù) 這種方法不推薦第二種方法是直接用賦值形式StringstrRef stringLiteral 如 Stringmessage WelcometoJava 但 這二種方法有著本質(zhì)的不同 第二種方法效率高的多 86 二種方式的區(qū)別 對于程序任何位置出現(xiàn)的雙引號標(biāo)記的字符串常量 系統(tǒng)都會自動創(chuàng)建一個String對象 因此Stringmessage newString WelcometoJava 實際上創(chuàng)建了另一個完全相同的對象 而且需要調(diào)用構(gòu)造函數(shù) 其過程為 1 以字符串對象 WelcometoJava 為參數(shù)調(diào)用構(gòu)造函數(shù)String String 產(chǎn)生新的字符串對象 2 將新對象的引用賦給引用變量message WelcometoJava WelcometoJava newString message 87 二種方式的區(qū)別 Stringmessage WelcometoJava 由于字符串常量 WelcometoJava 已經(jīng)是一個字符串對象 因此上面的語句的語義是將對象 WelcometoJava 的引用賦值給message 導(dǎo)致message也該對引用了該對象這個過程中沒有調(diào)用構(gòu)造函數(shù)產(chǎn)生新的第二個字符串對象 WelcometoJava message 88 小測試 代碼1Stringsa newString Helloworld Stringsb newString Helloworld System out println sa sb 代碼2Stringsc Helloworld Stringsd Helloworld System out println sc sd false true 相同字符串常量僅建立一個共享對象 89 字符串 String 對任何可包裝類型如Character String等的常量 其常量對象 字面量 Literal 的引用被共享 地址相同 Characterc1 a a 為Character類型的字面量 常量 Characterc2 a System out println c1 c2 trueIntegerintObj1 1 1為Integer類型的字面量 常量 IntegerintObj2 1 System out println intObj1 intObj1 true可通過String對象的方法對字符串常量進(jìn)行操作 如 inti Hello length 5 90 String對象是不可變的 字符串對象創(chuàng)建之后 其內(nèi)容是不可修改的 Strings abc s s defg System out println s 程序運(yùn)行的結(jié)果是什么 abcdefg s的內(nèi)容不是改變了嗎 不是s的內(nèi)容變了 而是s引用了新的字符串對象 91 調(diào)用intlength 方法可以獲取字符串的長度 Stringmessage WelcometoJava message length 返回15charcharAt index 方法可以獲取指定位置的字符 index的值必須在0到length 1之間 message charAt 0 返回字符 W 字符串長度和獲取單個字符 92 截取子串 substring用于截取字符串的一部分 返回新字符串 publicStringsubstring intbeginIndex intendIndex 返回字符串的子串 子串從beginIndex開始 直到endIndex 1publicStringsubstring intbeginIndex 返回字符串的子串 子串從beginIndex開始 直到字符串的結(jié)尾 Strings message subString 0 11 s內(nèi)容為 Welcometo Strings message subString 11 s內(nèi)容為 Java 93 搜索字符或子字符串 String類提供的indexOf 和lastIndexOf 方法返回字符串中特定字符或子字符串在字符串中的位置 indexOf 返回字符或字串第一次出現(xiàn)的位置索引值lastIndexOf 返回字符或字串最后一次出現(xiàn)的位置索引值 94 搜索字符或字符串 indexOf返回字符串中字符或字符串匹配的位置 返回 1表示未找到 WelcometoJava indexOf W returns0 WelcometoJava indexOf x returns 1 WelcometoJava indexOf o 5 returns9 WelcometoJava indexOf come returns3 WelcometoJava indexOf Java 5 returns11 WelcometoJava indexOf java 5 returns 1 WelcometoJava lastIndexOf a returns14 95 比較字符串 booleanequals Object 方法用于比較兩個字符串是否包含相同的內(nèi)容 兩個字符串內(nèi)容相同 返回true兩個字符串內(nèi)容不同 返回falsebooleanequalsIgnoreCase String 忽略大小寫比較內(nèi)容是否相同booleanstartsWith String 判斷是否以某個字符串開始booleanendsWith String 判斷是否以某個字符串結(jié)束 96 比較字符串 booleanregionMatch booleanignoreCase intthisOffset Stringother intotherOffset intlen 比較部分內(nèi)容是否相同boolean 是否忽略大小寫thisOffset 要比較的this字符串從索引thisOffset開始比較other 要比較的另外一個字符串otherOffset 要比較的other字符串從索引otherOffset開始比較len 要比較的字符數(shù)intcompareTo String 方法用于比較兩個字符串的大小 即第一個不同字符的差值 pareTo s2 的返回值 當(dāng)兩個字符串相同時 返回 當(dāng)s1按字典排序在s2之前 返回小于 的值當(dāng)s1按字典排序在s2之后 返回大于 的值 97 比較字符串 Strings0 Java Strings1 Welcometo s0 Strings2 WelcometoJava Strings3 welcometojava booleanb s1 s2 false 用于比較兩個變量是否引用同一個對象b s1 equals s2 true equals用于比較兩個字符串的內(nèi)容是否相同b s2 equals s3 falseb s2 equalsIgnoreCase s3 true equalsIgnoreCase忽略大小寫b s2 regionMatches 11 s0 0 4 true regionMatches比較部分字符串b s3 regionMatches 11 s0 0 4 falseb s3 regionMatches true 11

溫馨提示

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

評論

0/150

提交評論