Java面向對象程序設計課件_第1頁
Java面向對象程序設計課件_第2頁
Java面向對象程序設計課件_第3頁
Java面向對象程序設計課件_第4頁
Java面向對象程序設計課件_第5頁
已閱讀5頁,還剩402頁未讀 繼續免費閱讀

下載本文檔

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

文檔簡介

面向對象概述1.1面向過程與面向對象的

方法論比較2023-11-183系統建模方法軟體危機與系統建模方法的發展兩種流行的建模方法:面向過程建模方法面向對象建模方法2023-11-184面向過程的建模方法和建模語言始於20世紀70年代的結構化分析設計(StructuredAnalysisandDesign,SAD)方法。把一個系統看作是功能的集合,可以進行分解。用數據流圖設計系統的模組結構。IDEF(ICAMDEFinitionmethod)圖形化建模語言是面向過程建模技術的代表。2023-11-185IDEF的基本表示法盒子代表活動,連到盒子上的箭頭表示由活動產生的、或活動所需要的資訊或真實對象。盒子左邊及上方進入的箭頭表示為完成此活動所需要的數據,控制說明了控制變換的條件或環境,或者說是約束;右邊離開盒子的箭頭表示執行活動時產生的數據;下方的箭頭作為執行的機制,可以是執行活動的人或設備。箭頭限制了盒子間的關係,而不是表示活動的順序。2023-11-186面向對象的建模方法與建模語言發源於20世紀60年代,Simula語言中引入了類(Class)的概念;但真正的面向對象程式設計是Smalltalk語言奠定基礎的,“面向對象”一詞也是Smalltalk首先採用的;C++的問世促進面向對象技術的發展,也使之成為標準化的面向對象程式設計語言。20世紀90年代初,Booch、Jocobson、Rumbaugh一起開發了統一建模語言(UnifiedModelingLanguage,UML)。UML可以用於確定、展示和記錄軟體系統,UML中的圖形標記尤其適用於面向對象的軟體設計。2023-11-187UML的基本表示法UML有一套複雜的標記法,這裏只給出對類的基本表示,就是在一個矩形框中可以詳細描述類(抽象類、介面、對象實例等)的名稱、屬性和操作。2023-11-188面向過程程式設計方法從程式設計範型(Paradigm,指設計程式的規範、模型和風格)看:

程式=過程(定義)+(過程)調用。從程式語言角度出發,依靠各種迴圈、函數調用、參數傳遞維護程式。重視程式流程,不在乎數據的傳遞方式,只要程式能運行就可以了。2023-11-189面向過程程式設計方法的缺點副程式(過程)的抽象級別(函數)太低,難以重用。需要花相當多的成本維護程式與程式之間的關聯性。數據和操作相分離,當一個或多個數據的結構發生了變化,這種變化將波及程式的很多部分甚至遍及整個程式,往往變數和參數傳來傳去,傳到最後根本就不知道這個變數的作用何在,故程式的複雜性很難控制。已不適宜描述複雜的數據對象。2023-11-1810面向對象軟體開發方法面向對象程式的基本元素為對象(Object)。程式結構一般由類的定義和類的使用兩部分組成。程式中的一切操作都是通過向對象發送相應的消息來實現:對象接收到消息後,啟動有關的方法完成相應的操作。從面向對象程式設計範型看:

程式=對象+消息。2023-11-1811面向對象技術的優點直觀性可增加程式的模組性(Modularity)可提高程式的可複用性(Reusability)增加可擴展性(Extendibility)可改善程式的可維護性(Maintainability),減少維護負荷可控制程式的複雜性可改進品質,降低成本2023-11-1812面向對象技術的缺點與困難面向對象需要完全改變每個人的思想以及開發文化面向對象不僅僅是編程面向對象需要更關注於需求、分析和設計開發人員必須和用戶緊密合作面向對象的許多優點要經過較長的時間才能顯示出來面向對象技術不能保證你能構建出正確的系統2023-11-1813討論面向過程方法的優勢面向對象方法的優勢結合面向過程與面向對象方法的應用優勢歷史反思1.2面向對象技術的基本原則2023-11-1815OO(ObjectOrientation)四原則抽象(Abstraction)封裝(Encapsulation)模組化(Modularity)分層(Hierarchy)2023-11-1816問題域的合理抽象實體抽象一個對象表示一個問題域的實體的有用模型。動作抽象一個對象提供一個通用化的操作集,它們的執行是相似或有關聯的功能。子系統抽象一個對象是一組對象和操作的集合,它們是一個大系統的特定組成部分。對象設計成敗的關鍵就是抽象類型必須符合人們對該客觀事物的認識習慣,這就要求設計人員對問題域應該有深入的理解,並且具有較強的綜合分析能力,而達到這一步往往是有難度的。1.3面向對象技術的基本要素2023-11-1818寫字課老師:強調“飛鳳家”

——遙遠的記憶,仍耳熟能詳…面向對象老師:強調“PIE”

——多態(Polymorphism)

——繼承(Inheritance)

——封裝(Encapsulation)

“寫好飛鳳家”對於學習面向對象的啟示

2023-11-1819封裝性外界要改變一個對象的狀態,也就是對它所包含的數據進行操作,只能向該對象發出請求消息,然後由該對象的對應方法來改變其自身的狀態。是一種典型的“黑箱”機制。有利於代碼複用和資訊隱藏。2023-11-1820資訊隱藏(Informationhiding)如果一個類想獲取另一個類的資訊,必須先征得同意,而不是直接拿來就用;意味著類模組中除了向外界提供的介面以外,還有大量不為外界所知的用以支持這些介面實現的屬性和方法。2023-11-1821繼承性繼承是在類、子類以及對象之間自動地共用屬性和方法的一種機制。繼承具有傳遞性,即如果有類C繼承B,B(間接)繼承A,則C(間接)繼承A。一個類實際上繼承了層次結構中在其上面的所有類的全部描述。2023-11-1822繼承性保證類可合理層次化2023-11-1823多態性同一個方法名的操作不僅僅定義一種行為,因此有比較強的表達能力和更多的用途。多態形式:

參數多態(即重載,Overload)

包含多態(即覆蓋,Override)多態為描述客觀事物提供了極大的能動性。2023-11-1824不同人對play()請求的回應2023-11-1825面向對象概念和術語abstractclass(抽象類)對象不能從中實例化的類abstraction(抽象)某專案(如類或操作)的基本特徵aggregation(聚合)表示兩個類或組件之間是“ispartof”關係aggregationhierarchy(聚合層次)通過聚合聯繫的一組類association(關聯)對象和其他對象發生聯繫attribute(屬性)類知道的東西(數據/資訊)cardinality(基數)表示概念“多少”?class(類)相似對象的軟體抽象,創建對象的範本cohesion(內聚)封裝單元(例如組件或類)的相關程度collaboration(協作)類協作來完成它們的職責2023-11-1826面向對象概念和術語(續)component(組件)可以獨立開發、分發以及與其它組件一起構建較大單元的內聚功能單元composition(組合)更強類型的聚合,其中“整體”完全負責它的各組成部分,每“部分”對象僅和一個“整體”對象相聯系concreteclass(具體類)可以進行對象實例化的類coupling(耦合)兩個專案的依賴程度encapsulation(封裝)把相關的概念(例如類或組件)歸組到一個專案informationhiding(資訊隱藏)限制外部對屬性的訪問inheritance(繼承)表示“isa”、“islike”或“iskindof”關係inheritancehierarchy(繼承層次)通過繼承相聯系的一組類instance(實例)對象是類的一個實例2023-11-1827面向對象概念和術語(續)instantiate(實例化)從類中實例化對象interface(介面)定義內聚行為集的一個或多個操作特徵標記的集合message(消息)消息是資訊請求或執行一個動作的請求messaging(消息傳遞)為了協作,類互相發送與接收消息method(方法)類完成的事情(與結構化編程中的函數相似)multipleinheritance(多重繼承)類直接從一個以上的類繼承object(對象)一個人、地址、物品、事件、概念、螢幕顯示或者報表objectspace(對象空間)主存,加上網路上所有可供使用的存儲空間optionality(可選性)表示概念“你想要嗎?”override(覆蓋)有時在子類中你需要覆蓋(重定義)屬性與方法2023-11-1828面向對象概念和術語(續)pattern(模式)考慮到相關因素時通用問題的可複用方案persistence(持久性)對象怎樣永久被保存的問題persistentobject(持久對象)一個保存到永久存儲的對象polymorphism(多態)以不同方式回應同一消息的不同對象,使對象可以不必知道相互的類型而交互singleinheritance(單一繼承)一個類直接從唯一一個類繼承stereotype(原型)表示一種建模元素的通用用法subclass(子類)如果類B繼承自類A,我們說B是A的子類superclass(父類)如果類B繼承自類A,我們說A是B的父類transitoryobject(臨時對象)一個沒有被保存到永久存儲的對象1.4面向對象的軟體開發體系2023-11-1830面向對象框架下軟體開發的生命週期

2023-11-1831OO框架下軟體專案開發的一般過程

業務模型需求模型分析模型設計模型實現模型測試模型關鍵UML元素業務流程(用例)、業務域對象系統、角色、用例、交互業務包/類/對象/消息軟硬體配置、包/類/對象/消息組件、節點、編碼測試計畫和測試案例關鍵問題業務建模系統黑箱建模不含實現細節的問題域業務元素建模面向特定實現(如軟硬體配置)分析圖及其說明書更改分佈式環境物理元素建模以及按需求編碼單元(類/操作)測試、集成系統測試目標(元素之間的低耦合高聚合)足夠的業務或企業資訊足夠的用例/方案資訊以及遞增/迭代計畫滿足需求的最簡單業務/問題域模型支持最大編碼或手工編碼的足夠資訊優化組件框架(網路性能等)足夠的測試內容靜態結構圖業務域對象角色方框圖及用例圖包/類圖包/類圖組件與配置圖,逆向類圖-2023-11-1832OO框架下軟體專案開發的一般過程(續)業務模型需求模型分析模型設計模型實現模型測試模型動態時基圖業務流程(用例)用例圖、各用例方案的順序圖、活動圖各用例方案的順序圖,狀態基類型的狀態圖及複雜操作的活動圖各用例方案的順序圖,狀態基類型的狀態圖及複雜操作的活動圖選擇性更改顯示分佈資訊的順序圖-關鍵團隊成員業務分析師業務分析師業務分析師開發工程師架構師,開發工程師開發工程師,測試工程師模型確認專案經理、架構師、客戶專案經理、架構師、客戶專案經理、架構師、客戶專案經理、架構師專案經理、架構師專案經理、架構師、客戶2.1Java語言的特點2023年11月18日20時53分34Java的由來1991年初,SunMicrosystems公司設立一項較大規模“消費者電子產品先進軟體發展專案”,該專案是為了發展小型、可靠、可移植、分佈式、即時的嵌入式系統。

專案小組開發了一種與平臺無關的新語言,命名為“Oak”。其靈感來源於專案主持人JamesGosling辦公室外的一棵橡樹(Oak),它就是Java語言的前身。

但因Oak名稱與其它產品雷同,最後將開發的新語言取名為“Java”。據說是專案小組成員經常在公司附近一家咖啡廳喝咖啡,因此把咖啡原產地Java作為新語言的名稱。1995年,SunMicrosystems公司正式發佈Java產品。

2023年11月18日20時53分35與Java有關的一些圖片Java的標識Java的吉祥物DukeJava之父JamesGosling2023年11月18日20時53分36Java語言的特點

在Java語言白皮書中,Java被描述為“是一種簡單、面向對象、分佈式、解釋、健壯、安全、結構中立、可移植、高效能、多線程、動態的語言。Asimple,object-oriented,network-savvy,interpreted,robust,secure,architectureneutral,portable,high-performance,multithreaded,dynamiclanguage。

—JamesGosling,HenryMcGilton.TheJava?LanguageEnvironment,AWhitePaper.

2023年11月18日20時53分37簡單的面向對象程式設計語言

“爪哇”——Java總給人以小巧玲瓏

和C++很相近,但刪除許多極少被使用、不容易理解和令人混淆的C++功能,主要包括運算符重載、多重繼承以及廣泛的自動強迫同型。

自動垃圾收集(Automaticgarbagecollection)功能,這不僅簡化了Java程式的記憶體分配與釋放工作,而且能大幅度減少程式中的漏洞。

Java程式非常小,對於在嵌入式的系統中使用是很重要的,同時也可以通過網路輕易下載。

2023年11月18日20時53分38健壯安全的分佈式語言

Java擁有廣泛的能輕易處理TCP/IP協議(如HTTP與FTP等)的類庫,更容易創建網路連接。

除了運行時異常檢查外,Java提供了廣泛的編譯時異常檢查,以便儘早的發現可能存在的錯誤。同時,在Java中對象的創建機制(只能用new操作符)和自動垃圾收集機制大大減少了因記憶體管理不當引發的錯誤。

Java的驗證技術是以公鑰加密演算法為基礎。

2023年11月18日20時53分39結構中立、可移植性強的解釋型語言

為了讓Java應用程式能夠在網路上任何地方執行,其編譯器會產出一種結構中立的位元組代碼(Bytecode)。位元組代碼可以在提供Java運行時系統的多種不同處理器上面執行。

Java嚴格定義了基本數據類型的大小和算術運算符的行為,因此不存在軟硬體平臺不相容的情況。

Java系統本身具備相當好的移植性。它的編譯器用Java寫成,而Java運行時程式則是參照POSIX(一個可移植介面工業標準)規格使用ANSIC寫成的。

2023年11月18日20時53分40高效能

位元組代碼可以動態地為執行應用程式的特定CPU解釋成機器碼。位元組代碼格式在設計上即顧及機器碼的產生,因此實際的機器碼產生程式相當簡單。

解釋器運行時不需檢查運行環境,自動垃圾收集器設為優先順序最低後臺線程,以保證記憶體得到更有效的應用。

對於運算量很大的程式可以採用原生代碼編寫,再經由Java平臺轉換。Just-In-Time編譯技術更是讓位元組代碼的執行速度大幅度提升。

2023年11月18日20時53分41支持多線程的動態語言

在Java核心類庫中包含Thread類,同時Java運行時系統提供了線程監視器和同步鎖定機制。多線程的其他優點包括更好的互動式回應能力與即時執行行為。

Java是一種比C或C++更具動態特性的語言。它在設計上強調為進化中的運算環境提供支援。甚至可以在不中斷網路服務的情況下替換相關的組件。

2023年11月18日20時53分42Java與幾種常用語言的比較

2.2Java執行環境2023年11月18日20時53分44Java執行環境

2023年11月18日20時53分45Java虛擬機(JVM)執行引擎負責把位元組代碼導入虛擬機;記憶體管理

負責分配記憶體給對象和數組,並進行垃圾收集;錯誤和異常管理

負責異常的捕獲或拋出;線程介面

負責對線程的支持;對原生方法(NativeMethod)的支持

支持調用C/C++等語言編寫的方法。

2023年11月18日20時53分46什麼是JVM?Java虛擬機(JavaVirtualMachine,JVM)實際上是一個類似於真實電腦系統的抽象機(AbstractComputingMachine),它擁有一組指令集,用來解釋“.class”位元組代碼;也就是說,JVM並不認識所謂的Java語言,而僅僅能夠讀懂class檔中有限的指令、符號及其它一些輔助資訊。2023年11月18日20時53分47JVM類似於數控機床的數控系統數控機床數控機床抽象數控機床可以加工各種形狀的物體原因在於它擁有一個可以能讀懂指令的核心系統MachineVirtualMachine2023年11月18日20時53分48解釋產品(問題域)編程人員是熟悉的!但數控系統(JVM)是不認識的!!編程人員根據自己的想法,在相應的平臺上編寫出符合產品形狀要求的程式(.java)2023年11月18日20時53分49解釋這是程式員可以理解的程式(.java),因其是接近自然語言的。但對數控系統(JVM)來說太複雜,它是讀不懂的!2023年11月18日20時53分50解釋於是程式員利用相應的平臺把它編譯成數控系統(JVM)可以理解的程式(.class)於是數控機床(JVM)動起來啦!產品也做出來啦!可是最終數控機床(JVM)也沒有明白它做出的產品是什麼,只知道走了許許多多的直線或圓弧(JVM指令集)!2023年11月18日20時53分51演示虛擬的真實的2023年11月18日20時53分52JREJVM協同類加載器、位元組代碼校驗器和Java類庫一起,組成了整個Java運行環境JRE。

一次編寫隨處運行

(WriteOnceRunAnywhere,WORA)2023年11月18日20時53分53保護域機制與沙箱模型

保護域(Protectiondomain)是有關系統安全的基本概念和重要模組。域界定了作為主體的系統實體對各種對象集直接訪問的被許可程度。保護域概念提供一種在受保護單元中分組和隔離不安全因素的便利機制。

2023年11月18日20時53分54類加載器——啟動引擎的點火器

加載當JVM加載類時,它尋找類或介面的二進位表示,並從這個二進位表示(通常是Java編譯器生成的類檔)生成Class對象。Class對象封裝類或介面的運行時狀態。鏈接鏈接是取得加載的類或介面,並將其與JVM運行時環境結合起來,以準備執行的過程。初始化初始化在JVM調用類或介面初始化方法時發生。2023年11月18日20時53分55類加載器——啟動引擎的點火器JVM在啟動獨立Java應用程式時的第一步是生成初始Class對象,表示包含publicstaticvoidmain(String[]args)方法的Java的類。JVM鏈接與初始化這個類並調用main()方法。這個方法推動所需要的其他類和介面的加載、鏈接與初始化。

2.3JDK的組成與安裝設置2023年11月18日20時53分57Java平臺的組成結構

2023年11月18日20時53分58JDK版本主要特點

2023年11月18日20時53分59SETPATH的作用SETPATH=c:\j2sdk1.4.0\bin含義是告訴操作系統到哪里可以找到Java的編譯器等可執行檔的位置。2023年11月18日20時53分60SETCLASSPATH的作用SETCLASSPATH=.;c:\j2sdk1.4.0\lib\tools.jar含義是告訴操作系統到哪里可以找到編譯或解釋運行時所需位元組代碼的位置。2023年11月18日20時53分61在運行環境中的設置方法如果系統平臺為Windows9X,則把以上的設置內容加入系統根目錄下的autoexec.bat檔中;如果系統平臺為WindowsNT、Windows2000及以後版本,則把以上的設置內容加入【控制面板】|【系統】|【高級】|【環境變數】中。2.4典型例子及常見問題2023年11月18日20時53分63演示編譯器javac的使用解釋器java的使用小程式觀察器appletviewer的使用反編譯器javap的使用2023年11月18日20時53分64應用程式編程舉例//:HelloWorld.java//packageg3ds.joop.ch2;publicclassHelloWorld{//anapplication publicstaticvoidmain(String[]args){ System.out.println("HelloWorld!"); }}程式保存為HelloWorld.java編譯時執行javacHelloWorld.java

得到位元組代碼HelloWorld.class。運行時執行javaHelloWorld

2023年11月18日20時53分65小程式編程舉例//:HelloWorldApplet.java//packageg3ds.joop.ch2;importjava.awt.Graphics;importjavax.swing.JApplet;publicclassHelloWorldAppletextendsJApplet{//anapplet publicvoidpaint(Graphicsg){ g.drawString("HelloWorld!",150,50);}}<HTML><!--HelloWorldShow.html--><APPLETCODE="HelloWorldApplet.class"WIDTH=300HEIGHT=100></APPLET></HTML>保存為HelloWorldShow.html或HelloWorldShow.htmappletviewerHelloWorldShow.html

進一步討論2023年11月18日20時53分67反編譯程序樣式javap–cHelloWorld

則可以獲得位元組碼的助記符版本:CompiledfromHelloWorld.javapublicclassHelloWorldextendsjava.lang.Object{publicHelloWorld();publicstaticvoidmain(java.lang.String[]);}MethodHelloWorld()0aload_01invokespecial#1<Methodjava.lang.Object()>4returnMethodvoidmain(java.lang.String[])0getstatic#2<Fieldjava.io.PrintStreamout>3ldc#3<String"HelloWorld!">5invokevirtual#4<Methodvoidprintln(java.lang.String)>8return2023年11月18日20時53分68哪些類被加載了2023年11月18日20時53分69使用Java的一些注意事項Java中規定,在一個.java的原始檔案中最多只能有一個(另一個意思是可以沒有)publicclass。當這個publicclass存在時,要求該類名必須與.Java原始檔案的名字一致。如果你想編寫一個應用程式(通常被聲明為publicclass),在這一個類中必須定義一個publicstaticvoidmain(String[]agrs)方法,在這個方法中,除了變數名agrs可以改變,其他內容均不可改變,甚至排放的順序都是幾乎不可改變的。2023年11月18日20時53分70應用程式的主方法JVM解釋應用程式需要一個程式執行入口,也就是程式中邏輯運行的啟動模組,或者稱為應用程式的驅動器,這就是對應類中的main方法,它的聲明publicstaticvoidmain(String[]agrs)也叫main方法的標誌性簽名。JVM解釋某個應用程式時,就會首先查找對應類的這個main方法,當無法匹配時就引發如上述的異常報告:

Exceptioninthread"main"java.lang.NoSuchMethodError:main

2023年11月18日20時53分71小程式的生命週期

3.1類型、值與基本變數2023-11-1873基本概念:字元集

ASCII(AmericanStandardCodeforInformationInterchange)字元集:使用7位代碼表示大小寫字母、數字0~9以及若干控制字元,如NUL和EOT。ISO8859-1Latin-1字元集:在西歐,用戶希望字元集能夠表示他們本國字元集的所有字元,ASCII字元集因而被擴展到8位,即增加了128個字元,用於表示英文中不存在的各種西歐語言的字元。Unicode字元集:是ISO標準16位字元集,支持65536個不同的字元。其中大約有21000個字元專門用於中文、日文和韓文的表意文字。ASCII、ISOLatin-1都是Unicode的子集。Java內部使用2個位元組表示每個字元,採用Unicode編碼。2023-11-1874基本概念:關鍵字、值、識別字關鍵字(Keyword):也稱保留字(Reservedword),全部由小寫的英文字母所組成。關鍵字總共有50多個,其中一些留作將來供語言設計者擴充語言功能時使用。值(Literal):是指不能由程式員規定的代表某一特定常量或數字的可知的或未知的字母或符號,一般譯作“直接量”或“字面值”,實際上泛指賦給各種不同類型(常指基本類型、字串類型、空類型等)的有效值。本書將它簡稱為“值”,而另一個單詞“Value”則稱為“數值”。識別字(Identifier):是程式員提供的名字,在Java中,識別字的長度不受限制,但必須以字母、下劃線或$符號開始,隨後位置也可以包含數字。Java識別字支持幾萬個Unicode字母中所包含的世界上任何重要語言中的任何字母。舉例:IdentifierTest.java

2023-11-1875Java關鍵字abstractdefaultifprivatethisbooleandoimplementsprotectedthrowbreakdoubleimportpublicthrowsbyteelseinstanceofreturntransientcaseextendsintshorttrycatchfinalinterfacestaticvoidcharfinallylongstrictfpvolatileclassfloatnativesuperwhileconstfornewswitchcontinuegotopackagesynchronizedconst和goto是保留字true,false和null為相應類型的值,不屬於關鍵字2023-11-1876強類型語言

(Stronglytypedlanguage)Java屬於強類型的程式設計語言。所有變數和運算式在編譯時都有明確的類型,它有助於編譯時的錯誤檢測:類型限制了一個變數能夠擁有的或者一個運算式能夠生成的值;類型還限制了各種操作對這些值的支持程度以及決定操作的含義。2023-11-1877Java語言的類型結構Java類型基本類型引用類型數值類型布爾類型整型浮點型類/介面類型數組類型byteshortintlongcharbooleanfloatclassdoubleinterfaceType[](空類型)(null)2023-11-1878基本類型

(PrimitiveType)boolean用於邏輯運算。int、long、byte和short用於整數算術運算。char主要用於輸入輸出。double和float用於實數(即浮點數)的算術運算。整型數值缺省為int型,long型在數值之後加l或L浮點型數值缺省為double型,float型在數值之後加f或F2023-11-1879基本類型的特點基本類型在所有的平臺和實現中的定義相同,類型名稱屬於Java保留的關鍵字。基本類型的值不允許共用,任何一個基本類型的變數都會獨自擁有一份相同類型的值。基本類型的變數的值只能通過賦值操作才能被改變。2023-11-1880基本類型的值(1)類型位數取值範圍byte8bits–128~127short16bits–32768~32767int32bits–2147483648~2147483647long64bits–9223372036854775808~9223372036854775807char16bits'\u0000'~'\uffff'(0~65535)2023-11-1881基本類型的值(2)類型位數取值範圍float32bits–3.40282347e+38f~–1.40239846e-45f0.0f1.40239846e-45f~3.40282347e+38fdouble64bits–1.79769313486231570e+308~

–4.94065645841246544e-3240.04.94065645841246544e-324~1.79769313486231570e+3082023-11-1882基本類型的值(3)類型位數取值範圍boolean1bittrue/false轉義字元Unicode字元含義\b\u0008backspaceBS(退格)\t\u0009horizontaltabHT(Tab鍵)\n\u000alinefeedLF(換行)\f\u000cformfeedFF(換頁)\r\u000dcarriagereturnCR(回車)\"\u0022"(doublequote,雙引號)\'\u0027'(singlequote,單引號)\\\u005c\(backslash,反斜杠)2023-11-1883舉例整數值的不同進製錶示:NumeralExpression.java字元的表達方式:CharacterExpression.java浮點數運算:FloatingTest.java數值類型的取值範圍:ValueScope.java2023-11-1884引用類型類類型(Classtype)介面類型(Interfacetype)數組類型(Arraytype)2023-11-1885類類型使用關鍵字“class”,它定義了一個新的引用類型,並描述這一類型的具體實現。Java語言定義的根類(Rootclass)是Object類,也就是說除了Object類以外,其他類都是Object類的直接或間接子類(Subclass),這些類只能擴展(使用關鍵字“extends”

)自唯一一個業已存在的類。Object類是缺省的繼承父類,如果有一個類直接繼承自Object類,“extendsObject”可以省略不寫。2023-11-1886類體的結構組成類的成員類型:類成員(使用關鍵字static)和實例成員(無關鍵字static)形式:域(Field;也習慣地叫屬性,Attribute)、方法(Method)、內嵌類(Nestedclass)和內嵌介面(Nestedinterface)實例初始化或者類初始化的語句塊(Block)實例對象構造器(Constructor,也稱構造方法)舉例:ClassExample.java2023-11-1887介面類型使用關鍵字“interface”,定義一套必須由類或組件實現的操作特徵標記。一般有一個或多個操作特徵標記以及零個或多個屬性集合的定義。標識介面(Taginterface):不包含任何成員的介面類型,如java.io.Serializable、java.lang.Cloneable通過類來實現,使用關鍵字“implements”,多個介面類型之間用“,”隔開。類必須包括介面中定義的方法。介面可以進行多繼承,也使用關鍵字“extends”

。介面類型中不存在被其他所有介面類型繼承的根介面類型。2023-11-1888介面體的結構與特點包含與該介面有關的成員,這些成員可以是內嵌類、內嵌介面、常量或抽象方法。所有介面的成員都被隱式聲明為“public”;所有的內嵌類或介面都被隱式聲明為“static”;所有的成員屬性都被隱式聲明為“static”和“final”,亦即所有的成員屬性都是常量;所有的成員方法都被隱式聲明為“abstract”,亦即所有的成員方法都不包含任何具體的實現,但成員方法不能被聲明為“static”,因為靜態方法不能是抽象的。舉例:InterfaceExample.java

2023-11-1889數組類型一個數組對象包含一定數量的數組變數,稱為數組的組件或元素。數組元素通過一個非負的整型索引數值被引用。如果數組中包含有n個元素,則數組元素的索引值分別為0~(n-1)。數組元素的個數可以為零,這時該數組被稱為empty(空)數組。數組元素的類型可以是基本類型,也可以是其他的引用類型,一個數組中的所有元素的類型都是一樣的。2023-11-1890數組表示法Java語言中正式使用的表示法是,假如數組元素的類型表示為Type,則數組表示為Type[]x。如int[]x,讀作int數組x。另一種表示法是提供給那些有C/C++編程經驗的人們使用的,將方括號移到變數名稱的後面,即Typex[],如intx[]。2023-11-1891數組的一些特點Java語言中沒有直接的多維數組定義,而是把多維數組的實現理解為數組的數組。Java語言中,多維數組中每維數組的長度可以不同,數組空間也不一定是連續分配的。數組的直接超類是Object類,因此可以調用Object類中的所有方法。每個數組類型都已經實現了java.io.Serializable和java.lang.Cloneable介面,也就是可以對數組對象直接進行串行化處理和對象複製,但對於多維數組也是只能實現單層複製。數組中元素的個數可通過數組屬性length進行訪問。舉例:ArrayExample.java2023-11-1892基本類型的包裝類包裝類對應的基本類型字串轉換成數值數值轉換成字串包裝類中定義的常量Bytebyteb=Byte.parseByte(s)b=newByte(s).byteValue()s=String.valueOf(b)TYPE,MAX_VALUE,MIN_VALUEShortshortsh=Short.parseShort(s)sh=newShort(s).shortValue()s=String.valueOf(sh)TYPE,MAX_VALUE,MIN_VALUECharacterchars=String.valueOf(c)TYPE,MAX_VALUE,MIN_VALUEIntegerintn=Interger.parseInt(s)n=newInteger(s).intValue()s=String.valueOf(n)TYPE,MAX_VALUE,MIN_VALUELonglongg=Long.parseLong(s)g=newLong(s).longValue()s=String.valueOf(g)TYPE,MAX_VALUE,MIN_VALUEFloatfloatf=Float.parseFloat(s)f=newFloat(s).floatValue()s=String.valueOf(f)TYPE,MAX_VALUE,MIN_VALUE,NaN,NEGATIVE_INFINITY,POSITIVE_INFINITYDoubledoubled=Double.parseDouble(s)d=newDouble(s).doubleValue()s=String.valueOf(d)TYPE,MAX_VALUE,MIN_VALUE,NaN,NEGATIVE_INFINITY,POSITIVE_INFINITYBooleanbooleanb=newBoolean(s).booleanValue()s=String.valueOf(b)TYPE,FALSE,TRUE2023-11-1893與字串相關的封裝類String和StringBuffer類分別用於處理不變字串(常量)和可變字串。Java語言中還提供了一種快速創建String對象的方式,非常像基本類型的賦值方式:

Stringstr=”Iamastringconstant.”

String被設計為存儲字串常量的類,這種實例化形式在大多數情況下是更好的String構造技術,這與所創建的字串存儲在字串常量池使其可被共用有關。字串常量池的工作機制是,當需要某一個字串時,先到池裏查找,如果已經存在,則直接引用;如果還沒有就在池中創建一個新的字串對象。也可以說,字串常量池中內容相同的String對象只有一個,該對象直到JVM退出時才被清除。舉例:StringExample.java2023-11-1894類型轉換類型轉換方式分為窄化(Narrowing)和拓寬(Widening)轉換。編譯時可以自動執行拓寬轉換(稱為Promotion,提升)。而窄化轉換則總是要求顯式執行強制轉換(稱為Cast,轉型)。2023-11-1895基本類型的拓寬轉換原則如果存在一個double型,則按double型執行運算。否則,如果存在一個float型,則按float型執行運算。否則,如果存在一個long型,則按long型執行運算。否則,按照32位的int型計算精度執行運算。當在整型與浮點型之間進行轉換時,計算精度不僅僅是數據類型的取值範圍問題,它還包括浮點能夠存儲的十進位數的位數。舉例:PrimitiveWidening.java2023-11-1896基本類型的窄化轉換窄化轉換意味著餘數轉換,這種從一個大容量的數據類型到另一個小容量的數據類型的賦值只會取其較小的數值範圍,這可能造成數量級的損失。如果需要把一個範圍較大的整型數值賦給一個範圍較小的數據類型的變數,原則上都需要對數值執行強制轉換。對於byte、short、char類型的變數,在相應類型的取值範圍內時,允許不需要顯式強制類型轉換而直接賦給int型數值,因為這樣做並不會引起數據丟失;當所賦數值不在其取值範圍內時,則必須顯式進行類型強制轉換,否則將出現錯誤而不是警告。如果把浮點型數值轉換成整型數值,小數點後面的數值將被圓整去掉。舉例:PrimitiveNarrowing.java

2023-11-1897引用類型的轉換從子類型轉換為父類型即屬於引用類型的拓寬轉換,特別是從任何引用類型(包括類、介面、數組)轉換成Java的根類Object都屬於此種轉換形式。引用類型的拓寬轉換可以自動進行,不會引發任何異常。引用類型的窄化轉換指的是從父類型轉換為子類型,特別是從Object類轉換成其他任何引用類型都屬於這種轉換形式。引用類型的窄化轉換同樣需要強制進行,即所謂的轉型,這種轉換的使用十分廣泛,它體現了面向對象的多態性。轉型將在運行時進行類型匹配檢查,如果類型不匹配將引發異常ClassCastException。舉例:ReferenceConversion.java2023-11-1898類型轉換討論自動轉換——

不要以為擴大取值範圍就萬無一失浮點型的有效位問題引用型的屬性問題強制轉換3.2運算符和運算式2023-11-18100Java語言中的算術運算符與運算式運算元數目運算符運算式描述一元++op正值--op負值++++op,op++自增1----op,op--自減1二元+op1+op2加-op1-op2減*op1*op2乘/op1/op2除%op1%op2取模(求餘)2023-11-18101Java語言中的關係運算符與運算式運算符運算式返回true的情況>op1>op2op1大於op2>=op1>=op2op1大於或等於op2<op1<op2op1小於op2<=op1<=op2op1小於或等於op2==op1==op2op1與op2相等!=op1!=op2op1與op2不等2023-11-18102Java語言中的邏輯運算符與運算式運算元取值運算式運算結果op1op2op1&&op2op1||op2!op1falsefalsefalsefalsetruefalsetruefalsetruetruetruefalsefalsetruefalsetruetruetruetruefalse2023-11-18103Java語言中的位運算符與運算式運算符運算式描述&op1&op2二元運算,邏輯與,參與運算的兩個運算元,如果兩個相應位都為1(或true),則該位的結果為1(或true),否則為0(false)。|op1|op2二元運算,邏輯或,參與運算的兩個運算元,如果兩個相應位有一個為1(或true),則該位的結果為1(或true),否則為0(false)。^op1^op2二元運算,邏輯異或,參與運算的兩個運算元,如果兩個相應位值相反,則該位的結果為1(或true),否則為0(false)。~~op1一元運算,對數據的每個二進位位按位取反。<<op1<<op2二元運算,運算元op1按位左移op2位,每左移一位,其數值加倍。>>op1>>op2二元運算,運算元op1按位右移op2位,每右移一位,其數值減半。>>>op1>>>op2二元運算,運算元op1按位右移op2位,正整數運算與>>同,負整數則求該數的反碼,但符號位不變。舉例:BitOperand.java2023-11-18104其他運算符條件運算符:三元運算符,其運算式為

someCondition?tureExpression:falseExpression賦值運算符與表達式:=、+=、-=、*=、/=、%=、<<=、>>=、>>>=、&=、|=、^=

instanceof運算符2023-11-18105Java語言運算符優先順序以及

同等優先順序運算符的組合順序運算符描述優先順序(數越大優先順序越高)同等優先順序結合順序()圓括號15左→右new創建類實例15左→右[]數組下標運算符15左→右.成員(屬性、方法)選擇15左→右++、--尾碼自增(自減)114右→左++、--首碼自增(自減)113右→左~按位取反13右→左!邏輯非13右→左-、+算術負(正)號13右→左(Type)強制類型轉換13右→左*、/、%乘、除、取模運算12左→右+、-加、減運算11左→右<<、>>、>>>左右移位運算10左→右2023-11-18106Java語言運算符優先順序以及

同等優先順序運算符的組合順序(續)運算符描述優先順序(數越大優先順序越高)同等優先順序結合順序instanceof、

<、<=、>、>=關係運算9左→右==、!=相等性運算8左→右&位邏輯與7左→右^位邏輯異或6左→右|位邏輯或5左→右&&條件與4左→右||條件或3左→右?:條件運算符2右→左=、*=、/=、%=、+=、-=、<<=、>>=、>>>=、&=、^=、|=賦值運算符1右→左舉例:EvaluationOrder.java2023-11-18107關於斷句無雞鴨亦可無魚肉亦可青菜一小碟足矣2023-11-18108整型支持的操作運算比較運算,其結果為boolean型:大小比較<、<=、>、>=相等比較==、!=數值運算,其結果為int或long型:加減運算+、-乘除運算*、/、%符號運算+、-前(後)綴自增運算++前(後)綴自減運算--位運算<<、>>、>>>按位取反運算~按位邏輯運算&、|、^條件運算?:類型轉換運算(Type)字串連接運算+Byte、Short、Integer、Long、Character等包裝類中的方法Java中存在一個稱為的java.math.BigInteger類,支持無限制的整數運算。2023-11-18109浮點型支持的操作運算比較運算,其結果為boolean型:大小比較<、<=、>、>=相等比較==、!=數值運算,其結果為float或double型:加減運算+、-乘除運算*、/、%符號運算+、-前(後)綴自增運算++前(後)綴自減運算--條件運算?:類型轉換運算(Type)字串連接運算+Float、Double等包裝類中的方法以及java.lang.Math類,Math類中包含許多與數學運算有關的方法,如冪運算方法exp(doublea)、亂數生成方法random()、正弦函數計算方法sin(doublea),等等。Java語言存在一個稱為java.math.BigDecimal的類,支持無限制的實數運算。2023-11-18110布爾型支持的操作運算關係比較運算==、!=邏輯非運算!邏輯運算&、|、^條件與和條件或&&、||條件運算?:字串連接運算+,布爾型的值true和false都可以轉換成字串,並作字串連接運算。Boolean包裝類中的方法。3.3語句2023-11-18112編組語句代碼塊由一對花括弧“{}”界定,中間包含零或多個語句以及局部變數聲明組成,且能夠以任何順序存在。

無論任何位置,只要允許單個語句存在,都可以放置代碼塊。空語句僅僅是分號“;”本身。

空語句不執行任何動作,無論何處,只要可以放置普通語句,都可以使用空語句。

空語句總是可以完全正常執行。2023-11-18113運算式語句賦值、方法調用、類的實例化、自增(減)1運算等,都是運算式語句。常用的語句格式如下:newStringBuffer(“Hello”);//創建不被引用的實例對象newJFrame().setVisible(true);//方法調用i++;//自增運算a=b;//賦值2023-11-18114選擇語句if語句的一般語法格式如下: if(boolean-expression) statement1; [else statement2;]switch語句的一般語法格式如下: switch(expression){ casevalue1:statement1; break; casevalue2:statement2; break;

… casevalueN:statemendN; break; [default:defaultStatement;] }舉例:Kid.java2023-11-18115迴圈語句while語句 [initialization]//初始化部分 while(termination){//布爾型運算式,迴圈終止條件 body;//循環體部分 [iteration;]//迭代部分 }do-while語句 [initialization]//初始化部分 do{ body;//循環體部分 [iteration;]//迭代部分 }while(termination);//布爾型運算式,迴圈終止條件for語句 for(initialization;termination;iteration){//初始化部分;迴圈終止條件;迭代部分 body;//循環體部分 }無限迴圈語句

while(true){…}

for(;;){…}2023-11-18116討論:迭代與遞歸迭代(Iteration)法通常採用迴圈語句(如for語句、while語句、do-while語句等)來完成運算,遞歸(Recursion)法通常採用選擇語句(如if語句、if-else語句、switch語句等)來完成運算。本質上迭代和遞歸都包含著迴圈:迭代法是顯式調用了迴圈語句,而遞歸法則通過自我調用的策略來實現迴圈。舉例:Fibonacci.java2023-11-18117控制轉移語句標識語句continue語句break語句return語句4.1對象的聲明與創建2023-11-18119基本術語:類類(Class)

可以由用戶自己定義的引用類型,它是相似對象的軟件抽象、創建對象的模板。每一個類都組合了一些能夠反映某種類型屬性的字段和反映某種類型動作的方法。2023-11-18120基本術語:對象對象(Object)

是一個人、地址、物品、事件、概念、屏幕顯示或者報表,它屬于某一個類,對象擁有自己的屬性值和方法調用。作為類設計的初衷,每一個類都將存在許多相互獨立的對象。通常我們說一個對象是類的一個實例,一個對象的生命週期包括聲明、創建、使用和清除四個狀態。2023-11-18121基本術語:對象引用在Java語言中只能引用對象,無法聲明一個直接包含對象的變數。類類型變數稱為引用變數,它們並不直接保留對象,只是保留對象的地址,而不是擁有對象本身,通過引用變數即可以得到一個對象。所有對象總是且只是通過記憶體引用訪問的,這種方式稱為間接尋址。對象引用可以在需要的時候自動撤銷。2023-11-18122類、對象和對象引用的關係示意圖

2023-11-18123基本術語:類變數類變數必須在類體中聲明,並且使用關鍵字“static”,因此也稱為靜態變數。類變數在類被加載時完成相應的初始化工作。類變數在一個運行系統中只有一份供整個類和實例對象共用的值,該值有可能被類(及其子類)和它們所創建的實例改變,每一次的改變都將影響到該類(及其子類)和其他實例的調用。類變數的作用域是整個類。2023-11-18124基本術語:實例變數實例變數在類體中聲明但不使用關鍵字“static”,也稱為非靜態變數。它在對象初始化時完成相應的初始化工作,並由某一個對象獨自擁有。實例變數的作用域是某一個類具體創建的實例對象。2023-11-18125基本術語:局部變數局部變數在某一個語句(如for語句)或代碼塊(如方法體)中聲明。當該語句或代碼塊被調用時,每次都將立即創建相關的局部變數。在一個局部變數的聲明語句中可能包含有用於初始化的運算式,但是,該運算式一般要等到這條聲明語句被執行的時候才會進行相應的初始化。當該語句或代碼塊被執行完畢退出,相應的局部變數也將失效。局部變數的作用域是聲明該變數的語句或代碼塊。2023-11-18126基本術語:參數變數方法和構造方法用於傳遞資訊的參數(Argument)變數和作用於方法體的局部變數相類似,當方法被調用的時候進行相應的初始化,當方法體執行結束後失效。2023-11-18127變數舉例類變數和實例變數都擁有一個缺省初值,如果某個變數在初始化時沒有顯式賦值,那麼將被賦予缺省初值。局部變數則沒有缺省初值,如果某個變數在初始化時沒有顯式賦值,並且在其後的語句中試圖直接調用,Java編譯器將會報錯提示,以保證每個變數都是按照編程人員的意圖進行賦值。舉例:VariableInit.java2023-11-18128討論以下程式的問題所在publicclassInitializationDemo{ intscore=100;

publicStringisExcellent(){ Stringresult;

if(score>=90) result="Veryverygood!";

returnresult; }

publicstaticvoidmain(String[]args){ InitializationDemoobj=newInitializationDemo(); System.out.print(obj.isExcellent()); }}2023-11-18129基本術語:關鍵字thisthis只能用於與實例有關的代碼塊中,如實例方法、構造方法、實例初始化代碼塊或實例變數的初始化代碼塊等,this就代表當前或者正在創建的實例對象的引用,通常可以利用這一關鍵字實現與局部變數同名的實例變數的調用。在構造方法中還可以用this來代表要顯式調用的其他構造方法。除此以外,使用this關鍵字都將引發編譯時錯誤。2023-11-18130基本術語:關鍵字supersuper只能用於與實例有關的代碼塊中,如實例方法、構造方法、實例初始化代碼塊或實例變數的初始化代碼塊等,super代表當前或者正在創建的實例對象的父類,通常可以利用這一關鍵字實現對父類同名屬性或方法的調用。在構造方法中還可以用super來代表要調用的父類構造方法,以實現構造方法鏈的初始化。由於Object類為Java語言的根類,已經沒有父類,因此,如果在Object類中使用了關鍵字super,將引發編譯時錯誤。2023-11-18131this和super舉例this和super是在設計類的時候、而不是使用類及其實例的時候引用。舉例:ThisSuper.java2023-11-18132基本術語:訪問許可權修飾符訪問許可權控制由強到弱的順序是public、protected、(default)、private。public訪問許可權意味著在任何地方,只要能訪問到該類,即可訪問到該成員。protected訪問許可權意味著類中的成員允許同一個包或該類的擴展子類訪問。缺省的訪問許可權不需要任何關鍵字,但通常稱為“Friendly”。它意味著類中的成員只能由同一個包中的其他類訪問。private訪問許可權意味著該類中的成員只能由自己的成員調用,而無法被該類以外的其他類訪問。聲明局部變數不能包含訪問許可權修飾符,否則編譯時將檢查出錯。2023-11-18133存儲對象狀態的地方寄存器(Register)JVM會根據本身需求適當地分配。堆(Heap)堆是個自由記憶體區域,常用於動態或臨時記憶體分配,對類和數組對象提供記憶體。棧(Stack)棧存儲方法調用的狀態,如方法調用使用的任何局部變數和方法的運算元。方法區(Methodarea)所有JVM線程共用的公用存儲區,存儲運行時常量池、方法數據、字段數據、方法與構造方法位元組碼等資訊。運行時常量池(Runtimeconstantpool)類似於其他編程語言中的符號表,它包含數值文字和字段常量之類的常量。非運行時存儲空間2023-11-18134對象的聲明Java作為一種強類型語言,聲明基本類型或引用類型都要先指定類型,然後給出相應的變數識別字:

TypeIdentifier;fianl型變數只能賦值一次,而且必須被顯式賦值,否則編譯時將有檢查錯誤提示。fianl型基本類型變數相當於常量。對於引用型變數,當聲明為“final”時,如果該變數引用了一個對象,則意味著該變數只能引用該對象,而該對象的狀態仍然可以被改變;如果該變數引用了一個數組,則意味著該變數只能引用該數組,而該數組的元素仍然可以被改變。舉例:FinalVariable.java2023-11-18135對象的創建利用關鍵字new可以創建一個對象,new運算符為對象分配記憶體空間,調用該類的一個構造方法,實例化一個對象,返回該對象所在記憶體地址的一個引用。該對象引用可以賦給相應類型的對象變數,以後可以通過該變數操作所引用的對象。如果創建該對象時沒有把引用賦給某個對象變數,則該對象將無法再被引用。舉例:Employee.java2023-11-18136數組對象的聲明數組是一種用來存儲相同類型資料項目的數據結構,它由一組具有相同類型和相同變數名,放在相鄰記憶體位置的元素構成。數組聲明語句:

Type[]Identifier;在任何數組變數的類型聲明中,數組維數都被忽略了,數組元素的個數是利用new運算符創建時、而不是在聲明時決定的。2023-11-18137數組對象的創建要創建Java的數組對象,通常使用new運算符進行實例化。當第1次生成數組時,應指定這個數組擁有的元素是多少,也就是數組的大小。數組對象的長度在創建時限定後,就不能再被改變。但可以在任何時候把一個不同長度的新數組賦值給數組變數Identifier。數組第一個元素的下標為0,最後一個元素的下標是(length-1),其中length為數組長度,即數組元素的個數。創建數組的大小可以是0,一個長度為0的數組被稱為empty(空)數組。

討論:“int[]i=newint[0];”和“int[]i=null;”

2023-11-18138數組舉例數組初始化:ArrayInit.java“int[]i=newint[0];”和“int[]i=null;”區別數組操作:ArrayManipulation.javaArrays類及其方法數組複製:ArraycopyExample.java單層複製與多層複製的實現4.2對象的初始化2023-11-18140成員變數的缺省初始化過程創建對象時需要對屬於對象的成員變數進行初始化。無論成員變數是聲明在其他方法的前面或者後面,其初始化操作總會在方法調用之前合適的時機執行,並按順序逐步完成。與方

溫馨提示

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

評論

0/150

提交評論