教學(xué)面向?qū)ο蟪绦蛟O(shè)計標(biāo)準(zhǔn)課件_第1頁
教學(xué)面向?qū)ο蟪绦蛟O(shè)計標(biāo)準(zhǔn)課件_第2頁
教學(xué)面向?qū)ο蟪绦蛟O(shè)計標(biāo)準(zhǔn)課件_第3頁
教學(xué)面向?qū)ο蟪绦蛟O(shè)計標(biāo)準(zhǔn)課件_第4頁
教學(xué)面向?qū)ο蟪绦蛟O(shè)計標(biāo)準(zhǔn)課件_第5頁
已閱讀5頁,還剩343頁未讀, 繼續(xù)免費閱讀

下載本文檔

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

文檔簡介

教學(xué)課件面向?qū)ο蟪绦蛟O(shè)計教學(xué)課件面向?qū)ο蟪绦蛟O(shè)計1(優(yōu)選)第教學(xué)課件面向?qū)ο蟪绦蛟O(shè)計(優(yōu)選)第教學(xué)課件面向?qū)ο蟪绦蛟O(shè)計2幾個概念:程序、程序設(shè)計語言、程序設(shè)計方法

程序:是一組有序指令的集合,由某種程序設(shè)計語言編寫而成。程序設(shè)計語言:是人與計算機之間進行交流的工具。是由字、詞和語法規(guī)則構(gòu)成的指令系統(tǒng)。幾個概念:程序、程序設(shè)計語言、程序設(shè)計方法程序:是一組有序3程序設(shè)計語言1.機器語言:是計算機能夠直接執(zhí)行的二進制指令代碼,每條指令都用0和1組成的序列串表示,這些指令的集合就是指令系統(tǒng)。如加法運算:10110110。2.匯編語言:主要由匯編指令構(gòu)成,這些匯編指令與機器語言的二進制指令一一對應(yīng)。如加法運算:ADD。注意:機器語言和匯編語言都是面向機器的程序設(shè)計語言,它們與計算機的硬件緊密相關(guān)。程序設(shè)計語言1.機器語言:是計算機能夠直接執(zhí)行的二進制指令代4程序設(shè)計語言3.高級語言:FORTRAN語言和隨后出現(xiàn)的BASIC語言、Pascal語言、COBOL語言以及C語言等等,都被稱為高級語言。程序員在使用高級語言編寫程序時,不需要熟悉計算機的指令系統(tǒng),可以將精力集中于解題思路和方法上。如加法運算:+。計算機不能直接執(zhí)行高級語言程序,必須先翻譯成為機器語言程序之后才能執(zhí)行。程序設(shè)計語言3.高級語言:5程序設(shè)計方法程序設(shè)計方法是獨立于具體程序設(shè)計語言的一門技術(shù)。由于程序設(shè)計通常離不開程序設(shè)計語言作為工具,所以容易混淆程序設(shè)計方法與程序設(shè)計語言的概念。程序設(shè)計語言的設(shè)計目的主要是為了支持某種程序設(shè)計方法。程序設(shè)計方法程序設(shè)計方法是獨立于具體程序設(shè)計語言的一門技術(shù)。6程序設(shè)計方法1.早期的程序設(shè)計方法:早期的高級程序設(shè)計語言有FORTROM、COBOL、BASIC等。這一時期由于追求程序的高效率,程序員過份依賴技巧與天份,不太注重程序的結(jié)構(gòu),一個典型問題是程序中的控制隨意跳轉(zhuǎn),即不加限制地使用goto語句,這樣的程序?qū)﹂喿x者來說是難以理解的,程序員也難以修改程序。程序設(shè)計方法1.早期的程序設(shè)計方法:7程序設(shè)計方法2.結(jié)構(gòu)化的程序設(shè)計方法:隨著程序規(guī)模與復(fù)雜性的不斷增長,20世紀(jì)60年代誕生了結(jié)構(gòu)化程序設(shè)計方法。結(jié)構(gòu)化程序設(shè)計方法的主要技術(shù)是自頂向下、逐步求精,采用單入口/單輸出的控制結(jié)構(gòu)。這一程序設(shè)計方法的代表語言是Pascal、C等。程序設(shè)計方法2.結(jié)構(gòu)化的程序設(shè)計方法:8結(jié)構(gòu)化的程序設(shè)計方法結(jié)構(gòu)化程序設(shè)計方法的基本思路是,把一個復(fù)雜問題的求解過程分階段進行,每個階段處理的問題都控制在人們?nèi)菀桌斫夂吞幚淼姆秶鷥?nèi)。具體說,采取以下方法保證得到結(jié)構(gòu)化的程序:(1)自頂向下;(2)逐步細(xì)化;(3)模塊化設(shè)計;(4)結(jié)構(gòu)化編碼。結(jié)構(gòu)化的程序設(shè)計把程序的結(jié)構(gòu)規(guī)定為順序、選擇和循環(huán)三種結(jié)構(gòu),限制使用GOTO語句,并采用了自頂向下、逐步求精的分析和設(shè)計方法,即功能分解法,這種方法將需求空間視為一個功能模塊,該模塊又進行分解,生成多個小的功能模塊,重復(fù)分解,直至每個模塊具有明確的功能和適當(dāng)?shù)膹?fù)雜度,而每個模塊的功能實現(xiàn)都由上述三種基本結(jié)構(gòu)組成,其目的是為了解決由許多人共同開發(fā)大型軟件時,如何高效率地完成高可靠系統(tǒng)的問題。結(jié)構(gòu)化的程序設(shè)計方法結(jié)構(gòu)化程序設(shè)計方法的基本思路是,把一個復(fù)9結(jié)構(gòu)化的程序設(shè)計方法在接受一個任務(wù)后應(yīng)怎樣著手進行呢?有兩種不同的方法:

1.一種是自頂向下,逐步細(xì)化。2.一種是自下而上,逐步積累。

以寫文章為

例來說明這個問題:有的人胸有全局,先想好整個文章分成哪幾個部分,然后再進一步考慮每一部分分成哪幾節(jié),每一節(jié)分成哪

幾段,每一段應(yīng)包含什么內(nèi)容,用這種方法逐步分解,直到作者認(rèn)為可以直接將各小段表達(dá)為文字語句為止。這種方法就叫做

“自頂向下,逐步細(xì)化”。

另有些人寫文章時不擬提綱,如同寫信一樣提起筆就寫,想到哪里就寫到哪里,直到他認(rèn)為把想寫的內(nèi)容都寫出來了為止。

這種方法叫做“自下而上,逐步積累”。顯然,用第一種方法考慮周全,結(jié)構(gòu)清晰,層次分明,作者容易寫,讀者容易看。如果發(fā)現(xiàn)某一部分中有一段內(nèi)容不妥,需要修改

只需找出該部分,修改有關(guān)段落即可,與其他部分無關(guān)。我們提倡用這種方法設(shè)計程序。這就是用工程的方法設(shè)計程序。我們應(yīng)當(dāng)掌握自頂向下、逐步細(xì)化的設(shè)計方法。這種設(shè)計方法的過程是將問題求解由抽象逐步具體化的過程。結(jié)構(gòu)化的程序設(shè)計方法在接受一個任務(wù)后應(yīng)怎樣著手進行呢?有兩種10結(jié)構(gòu)化的程序設(shè)計方法結(jié)構(gòu)化的程序設(shè)計把數(shù)據(jù)和對數(shù)據(jù)的處理過程分離為相互獨立的實體,即程序結(jié)構(gòu)是“數(shù)據(jù)結(jié)構(gòu)+算法”。若要修改某個數(shù)據(jù)結(jié)構(gòu),就需要改動涉及此數(shù)據(jù)結(jié)構(gòu)的所有處理模塊,所以,當(dāng)應(yīng)用程序比較復(fù)雜時,人員出錯,難以維護。其次,結(jié)構(gòu)化的程序設(shè)計方法仍存在與人的思維不協(xié)調(diào)的地方,所以很難自然、準(zhǔn)確地反映真實世界。因此,用此方法開發(fā)出來的軟件,有時很難保證其質(zhì)量,甚至需要重新開發(fā)結(jié)構(gòu)化的程序設(shè)計方法結(jié)構(gòu)化的程序設(shè)計把數(shù)據(jù)和對數(shù)據(jù)的處理過程11程序設(shè)計方法3.面向?qū)ο蟮某绦蛟O(shè)計方法(ObjectOrientedProgramming,OOP)雖然結(jié)構(gòu)化程序設(shè)計提高了軟件生產(chǎn)率和軟件質(zhì)量,但隨著程序規(guī)模與復(fù)雜性的增長,程序中的數(shù)據(jù)結(jié)構(gòu)變得與這些數(shù)據(jù)上的操作同樣重要。在大型結(jié)構(gòu)化程序中,一個數(shù)據(jù)結(jié)構(gòu)可能由許多個過程來處理,修改數(shù)據(jù)結(jié)構(gòu)將影響到所有相關(guān)的過程。在由幾百個過程組成的成千上萬行的結(jié)構(gòu)化程序中,這種情況變得相當(dāng)麻煩并且容易產(chǎn)生錯誤。60年代末開始,國際上出現(xiàn)了“軟件危機”,主要表現(xiàn)是:軟件質(zhì)量差、成本及開發(fā)進度難以控制,維護工作麻煩,產(chǎn)生這一危機的根本原因在于結(jié)構(gòu)化方法強烈依賴系統(tǒng)邏輯模型的完整性描述,難以做到系統(tǒng)的動態(tài)變化與擴展,系統(tǒng)開發(fā)速度慢、周期長、費用高;結(jié)構(gòu)化設(shè)計方法講究的是自頂而下的“瀑布式”設(shè)計,使數(shù)據(jù)結(jié)構(gòu)的設(shè)計僅服從于當(dāng)前功能實現(xiàn)的要求,為以后的擴充和重用設(shè)置了巨大的障礙。程序設(shè)計方法3.面向?qū)ο蟮某绦蛟O(shè)計方法(ObjectOri12面向?qū)ο蟮某绦蛟O(shè)計方法20世紀(jì)80年代興起的面向?qū)ο蟪绦蛟O(shè)計方法在結(jié)構(gòu)化程序設(shè)計的基礎(chǔ)上提出了一種新的設(shè)計思路,最重要的改變是程序圍繞被操作的數(shù)據(jù)來設(shè)計,而不是圍繞操作本身。面向?qū)ο蟪绦蛟O(shè)計以類作為構(gòu)造程序的基本單位,具有封裝、數(shù)據(jù)抽象、繼承、多態(tài)化等特點。較有影響的采用面向?qū)ο蟪绦蛟O(shè)計方法的語言有C++、Java等。面向?qū)ο蟮某绦蛟O(shè)計語言大致可以分為兩類,一類是純面向?qū)ο笳Z言,例如Java語言;另一類是混合型面向?qū)ο笳Z言,它們往往是由結(jié)構(gòu)化語言發(fā)展而來的,例如C++語言和VisualBasic語言。面向?qū)ο蟮某绦蛟O(shè)計方法20世紀(jì)80年代興起的面向?qū)ο蟪绦蛟O(shè)計13面向?qū)ο蟮某绦蛟O(shè)計方法面向?qū)ο蟪绦蛟O(shè)計思想是將數(shù)據(jù)以及對數(shù)據(jù)的操作封裝在一個獨立的數(shù)據(jù)結(jié)構(gòu)(對象)中,這種模式更接近現(xiàn)實世界,所有的對象都擁有屬性和行為,對象之間的聯(lián)系通過消息來實現(xiàn)。面向?qū)ο?,實際上就是以對象為中心來分析和解決問題。它不再將問題分解為過程,而是將問題分解為對象。例如,設(shè)計VB應(yīng)用程序時,一個窗體就是一個對象,各種控件也是對象,程序員可以直接使用這些對象,程序的設(shè)計過程就是設(shè)計對象和運用對象的過程。面向?qū)ο蟮某绦蛟O(shè)計中程序是“對象+消息”。面向?qū)ο蟪绦蛟O(shè)計方法力求符合人們自然的思維習(xí)慣,運用類和對象的觀點描述問題域,然后用程序設(shè)計語言對問題進行描述和實現(xiàn)。面向?qū)ο蟮某绦蛟O(shè)計方法面向?qū)ο蟪绦蛟O(shè)計思想是將數(shù)據(jù)以及對數(shù)據(jù)14面向?qū)ο蟮某绦蛟O(shè)計方法面向?qū)ο蟪绦蛟O(shè)計是一種新興的程序設(shè)計方法,或者是一種新的程序設(shè)計規(guī)范,它使用對象、類、繼承、封裝、消息等基本概念來進行程序的設(shè)計。面向?qū)ο蟮某绦蛟O(shè)計是以要解決的問題中所涉及的各種對象為主體,力求程序設(shè)計符合人們?nèi)粘5乃季S習(xí)慣,降低問題的難度和復(fù)雜性,提高編程的效率。使用面向?qū)ο蟮某绦蛟O(shè)計方法來解決問題就是從實際問題中抽象并封裝數(shù)據(jù)和操作的對象,通過定義其狀態(tài)和操作其行為來表述對象的特征和功能。此外,還可以通過定義接口來描述對象的地位以及與其他對象的關(guān)系,最終形成一個廣泛聯(lián)系的可理解、可擴充、可維護及更接近于問題本來面目的動態(tài)對象模型系統(tǒng)。面向?qū)ο蟮某绦蛟O(shè)計思想是將數(shù)據(jù)以及對于這些數(shù)據(jù)的操作,封裝在了一個單獨的數(shù)據(jù)結(jié)構(gòu)中。這種模式更近似于現(xiàn)實世界,在這里,所有的對象都同時擁有屬性以及與這些屬性相關(guān)的行為。對象之間的聯(lián)系是通過消息來實現(xiàn)的,消息是請求對象執(zhí)行某一處理或回答某些信息的要求。某個對象在執(zhí)行相應(yīng)的處理時,可以通過傳遞消息請求其他對象完成某些處理工作或回答某些消息。其他對象在執(zhí)行所要求的處理活動時,同樣可以通過傳遞消息和另外的對象聯(lián)系。所以,一個面向?qū)ο蟪绦虻膱?zhí)行,就是靠對象間傳遞消息來完成的。面向?qū)ο蟮某绦蛟O(shè)計方法面向?qū)ο蟪绦蛟O(shè)計是一種新興的程序設(shè)計方15OOP的邏輯過程面向?qū)ο笤O(shè)計分析的完整過程如圖所示:現(xiàn)實域抽象抽象類對象實例化映射抽象數(shù)據(jù)類物理實體邏輯實現(xiàn)概念域計算機世界OOP的邏輯過程面向?qū)ο笤O(shè)計分析的完整過程如圖所示:現(xiàn)實域16已知攝氏溫度C,則華氏溫度F=(C*9/5)+32。height=1.對象的創(chuàng)建和使用公有的(public):該類的成員可以被其他任何所有的類訪問靜態(tài)成員與實例成員publicclasstheThisprivateStringcellPhoneCode;//手機號碼getInfo());求屬性x和y的商,并返回結(jié)果的方法;這種設(shè)計方法的過程是將問題求解由抽象逐步具體化的過程。System.publicstaticvoidmain(String[]args)name和與age是User類的私有成員變量,外部類不能訪問。//把構(gòu)造方法參數(shù)x賦給類中的成員變量xpublicEmpInfo(){}//缺省的構(gòu)造方法designation="Manager";//給成員變量賦值friendly修飾符又稱為缺省訪問控制符。就可以直接修改User類中的成員變量。classChinese{面向?qū)ο蟮闹匾卣?/p>

面向?qū)ο缶哂幸韵聨讉€重要特征:抽象封裝繼承多態(tài)性

33313234已知攝氏溫度C,則華氏溫度F=(C*9/5)+32。面向?qū)ο?7抽象抽象(Abstraction):抽象是面向?qū)ο缶幊痰钠瘘c,也是其最本質(zhì)的特征之一。抽象的廣義概念是這樣定義的:從研究對象中提取與當(dāng)前目標(biāo)主題關(guān)系最密切的主要方面,而忽略掉與目標(biāo)無關(guān)的那些方面或關(guān)系不大的細(xì)枝末節(jié),從而更充分地注意與當(dāng)前目標(biāo)有關(guān)的方面,更明確地突出主題,這就是抽象。抽象抽象(Abstraction):抽象是面向?qū)ο缶幊痰钠瘘c18抽象示例下圖闡述了如何由自然界眾多的動物實體出發(fā),經(jīng)過抽象的處理過程,最終得到動物這一概念

抽象示例下圖闡述了如何由自然界眾多的動物實體出發(fā),經(jīng)過抽象的19封裝封裝(Encapsulation):封裝也可稱為信息隱藏(InformationHiding),是通過對象的方法來訪問與改變對象屬性的一種機制。封裝是面向?qū)ο蟮囊粋€重要原則,其實現(xiàn)的核心是將類的屬性與相關(guān)的操作捆綁起來,包裝成不可分割的、獨立的對象實體,將內(nèi)部的數(shù)據(jù)與實現(xiàn)細(xì)節(jié)盡可能隱蔽起來,使外部用戶不能直接操縱對象的內(nèi)部信息,只能通過對象對外提供的施加有一定限制的訪問接口來使用對象封裝封裝(Encapsulation):封裝也可稱為信息隱20封裝示例下圖形象地說明了一個類的封裝原理。類對數(shù)據(jù)與行為的封裝是借助于不同級別的訪問修飾符來達(dá)到控制目的的

封裝示例下圖形象地說明了一個類的封裝原理。類對數(shù)據(jù)與行為的封21繼承繼承(Inheritance):繼承是指從已有的類中可以派生出若干個新類,已有類稱為基類或父類,新類稱為派生類或子類;子類將自動地獲得基類的屬性與方法,從而不需再重復(fù)定義這些屬性與方法;當(dāng)然子類還可以修改父類的方法或增加新的方法,從而使自己更適合特殊的需要。類之間的繼承關(guān)系是現(xiàn)實世界中遺傳關(guān)系的直接模擬繼承繼承(Inheritance):繼承是指從已有的類中可以22多態(tài)性多態(tài)性(Polymorphism):是指允許不同類的對象對同一消息作出各自的響應(yīng),即以統(tǒng)一的風(fēng)格處理已存在的數(shù)據(jù)及相關(guān)的操作。多態(tài)性語言具有靈活、抽象、行為共享、代碼共享的優(yōu)勢,較好地解決了應(yīng)用程序中方法同名的問題多態(tài)性多態(tài)性(Polymorphism):是指允許不同類的對23

OOP的優(yōu)越性

從面向過程到面向?qū)ο笫浅绦蛟O(shè)計技術(shù)的一個飛躍。人們之所以要采用面向?qū)ο蟮某绦蛟O(shè)計技術(shù),其目的在于:

1.按照與人類習(xí)慣思維方法一致的原則開發(fā)系統(tǒng)2.提高代碼的可重用性(或者稱為復(fù)用性)3.提升程序的開發(fā)與運行效率

4.提高程序的可靠性與可維護性5.提高程序的可擴展性6.增強程序的可控制性總之,面向?qū)ο蟮某绦蛟O(shè)計,能夠有效分解、降低問題的難度與復(fù)雜性,提高整個求解過程的可控制性、可監(jiān)視性和可維護性,從而獲得較高的開發(fā)效率與可靠效果OOP的優(yōu)越性從面向過程到面向?qū)ο笫浅绦蛟O(shè)計技術(shù)的24結(jié)構(gòu)化與面向?qū)ο蟪绦蛟O(shè)計之比較結(jié)構(gòu)化與面向?qū)ο蟪绦蛟O(shè)計之比較25結(jié)構(gòu)化與面向?qū)ο蟪绦蛟O(shè)計之比較面向?qū)ο蟪绦蛟O(shè)計方法與人類習(xí)慣的思維方式一致,比如希望完成“豬八戒吃西瓜”這樣一件事情:在結(jié)構(gòu)化的程序里,一切都是函數(shù),函數(shù)最大,因此這件事情會用如下語句來表達(dá):吃(豬八戒,西瓜);在面向?qū)ο蟪绦蚶铮磺幸詫ο鬄橹行?,對象最大,因此這件事情會用如下語句來表達(dá):豬八戒.吃(西瓜);對比兩條語句不難發(fā)現(xiàn),面向?qū)ο蟮恼Z句更接近自然語言的語法,主語、謂語、賓語一目了然,十分直觀,程序員更容易理解。結(jié)構(gòu)化與面向?qū)ο蟪绦蛟O(shè)計之比較面向?qū)ο蟪绦蛟O(shè)計方法與人類習(xí)慣26publicstaticvoidmain(String[]args){信息隱蔽,即盡可能隱蔽類的內(nèi)部細(xì)節(jié),對外形成一個邊界(或者說形成一道屏障),只保留有限的對外接口使之與外部發(fā)生聯(lián)系因為靜態(tài)方法屬于類本身,所以只要聲明了類,它的靜態(tài)方法就存在,就可以直接使用類來調(diào)用。(2)當(dāng)調(diào)用方法時,系統(tǒng)按照實參與形參一一對應(yīng)的關(guān)系將實參的值或引用傳遞給對應(yīng)的形參。publicStudent(Stringname){//一個參數(shù)的構(gòu)造方法Stringname;//成員變量同樣地,任何一個類的對象去修改它,也都是在對同一個內(nèi)存單元進行操作。EmpInfoemployee=newEmpInfo();//創(chuàng)建對象并實例化系統(tǒng)運行時為每一個靜態(tài)成員變量只分配一個存儲單元,使得所有通過該類實例化的對象共享同一個靜態(tài)成員變量的存儲空間。實例成員則屬于類的實例(即對象),包括實例成員變量和實例成員方法。類實際上是一種復(fù)雜的數(shù)據(jù)類型,它是將數(shù)據(jù)和對數(shù)據(jù)的操作封裝在一起的集合體。Class14.println(str);public變量名;定義一個由“人”類實例化而來的具體的“人”對象,該對象也就具有了“人”類的屬性和行為,比如姓名為張三。friendly:此方法可以由本類中的方法和本包中其他類中的方法訪問,為默認(rèn)修飾符。Class27ob2=newClass27(20);三角形、圓形和梯形的類封裝:讓學(xué)生學(xué)習(xí)使用類來封裝對象的屬性和行為。classStudent{publicstaticvoidmain(String[]args){

面向?qū)ο蟪绦蛟O(shè)計方法

類的定義構(gòu)造方法對象的創(chuàng)建和使用this關(guān)鍵字類的封裝性靜態(tài)成員與實例成員方法調(diào)用與參數(shù)傳遞匿名對象內(nèi)容提要

publicstaticvoidmain(String27類與對象現(xiàn)實世界現(xiàn)實世界中的類:在現(xiàn)實世界中把眾多的事物歸納、劃分成一些類是人類在認(rèn)識客觀世界時經(jīng)常采用的思維方法。類是具有相同屬性和行為的一組對象的集合,其內(nèi)部包括屬性和行為兩個主要部分。例如,如果把“人”看成是一個抽象的類,那么人的姓名、性別、年齡等數(shù)據(jù)就是“人”類的屬性,而說話、跑步等稱為“人”類的行為(或者叫方法)。現(xiàn)實世界中的對象:對象是類的一個實例。例如每一個具體的人就是“人”類中的一個實例,即一個對象。定義一個由“人”類實例化而來的具體的“人”對象,該對象也就具有了“人”類的屬性和行為,比如姓名為張三。但是不同的“人”對象的屬性和行為是不盡相同的,例如兩個人的姓名就是互不相同的。總之,對象是類具體化的實例,類是同一種類型對象的抽象。類與對象現(xiàn)實世界28類與對象的關(guān)系可以用計算機模型與計算機實體之間的關(guān)系來更形象地說明類與對象之間的關(guān)系:將馮·諾依曼計算機模型看作計算機類,則不同品牌的計算機實體就對應(yīng)為一個個的實例對象。類與對象的關(guān)系可以用計算機模型與計算機實體之間的關(guān)系來更形象29類與對象的關(guān)系示例計算機模型與計算機實體之間的關(guān)系:類與對象的關(guān)系示例計算機模型與計算機實體之間的關(guān)系:30類與對象Java中的類與對象Java中的類:在Java語言中,將數(shù)據(jù)與對數(shù)據(jù)進行的操作合起來定義為類。類實際上是一種復(fù)雜的數(shù)據(jù)類型,它是將數(shù)據(jù)和對數(shù)據(jù)的操作封裝在一起的集合體。類是普通數(shù)據(jù)類型的擴展,類不但含有數(shù)據(jù),還包含了對數(shù)據(jù)進行操作的方法。類中的數(shù)據(jù)稱為類的成員變量,類中的對數(shù)據(jù)進行的操作稱為類的成員方法。二者統(tǒng)稱為類的成員。Java中的對象:在面向?qū)ο蟮姆椒▽W(xué)中,“對象”是現(xiàn)實世界的實體或概念在計算機邏輯中的抽象表示。一個對象被稱為其類的一個實例,是該類的一次實例化的結(jié)果。在Java語言中,在Java語言中總是先有類,然后才能創(chuàng)建對象。脫離類的對象是無法創(chuàng)建的,而脫離了對象的類也是毫無意義的。類與對象是抽象與具體的關(guān)系。對象是由類創(chuàng)建的。對象的最主要特點是以數(shù)據(jù)為中心,它是一個集成了數(shù)據(jù)和其上操作的封裝。封裝隱藏了類的內(nèi)部實現(xiàn)細(xì)節(jié),強制類的使用者通過規(guī)定的接口訪問對象,提高了代碼的可維護性。對象是具有唯一對象名和固定對外接口的一組屬性和操作的集合,用來模擬組成或影響現(xiàn)實世界問題的一個或一組因素。類與對象之間的關(guān)系,類似于數(shù)據(jù)類型與變量之間的關(guān)系;一個類可以生成無數(shù)個不同的對象,每個對象屬性值不同,其狀態(tài)也不同。類與對象Java中的類與對象31Java中類的定義類是組成java程序的基本要素,也是java程序設(shè)計的重要思想表現(xiàn)。作為程序的基本要素,類可以看作定義對象的模板。當(dāng)編寫Java程序時,既可以使用Java系統(tǒng)類庫提供的類,也可以使用Java開發(fā)人員自己編寫的類。Java類的定義格式如下:[<修飾符>]class<類名>[extends<父類名>][implements<接口名>]//類頭{<類體>}說明:(1)類頭定義該類的名稱、訪問權(quán)限、與其他類的關(guān)系以及實現(xiàn)的接口等。(2)類體定義該類中的成員,包含成員變量和成員方法。成員方法是用來描述對成員變量進行的操作,不但定義方法,一般還要實現(xiàn)該方法。Java中類的定義類是組成java程序的基本要素,也是ja32java類的定義類頭說明:(1)class是定義類的關(guān)鍵字,<類名>、<父類名>、<接口名>都應(yīng)該是合法的Java標(biāo)識符。習(xí)慣上類名的第一個字母大寫,但這不是必須的。類名最好見名知意,當(dāng)類名由幾個”單詞”復(fù)合而成時,每個單詞的首寫字母使用大寫,如BeijingTime、AmericanMap、ChongQing,CarNumber等。(2)在類的聲明中必須包括關(guān)鍵字class和自定義的類名,而方括號[]中的是可選項。(3)子句extends<父類名>顯式地指明當(dāng)前類的父類,子句implements<接口名>則說明當(dāng)前類要實現(xiàn)接口。

java類的定義類頭說明:33java類的定義修飾符關(guān)鍵字含義限制訪問權(quán)限修飾符public聲明類是公有的,可以被任何類使用或繼承。一個源程序中最多只能存在一個公有類。只能是主類終結(jié)類說明符final聲明該類不能被繼承。abstract與final為互斥的兩個修飾符,不能同時出現(xiàn)于一個類的聲明中

抽象類說明符abstract聲明該類不能被實例化,但可以被繼承。

無修飾符

可以被同一個程序包中的其他類訪問和繼承

(4)修飾符:java類的定義修飾符關(guān)鍵字含義限制訪問權(quán)限修飾符publi34java類的定義類是創(chuàng)建對象的模板,因此它應(yīng)該能夠描述一類事物共有的屬性和功能,這個描述過程由類體實現(xiàn)。類聲明之后的一對大括號“{”、“}”以及它們之間的內(nèi)容稱做類體。類體的定義格式如下:{ <成員變量的聲明> <構(gòu)造方法的聲明與實現(xiàn)> <成員方法的聲明及實現(xiàn)>}說明:(1)類體的數(shù)據(jù)聲明為成員變量,針對數(shù)據(jù)的操作聲明為成員方法,數(shù)據(jù)的操作過程在成員方法的實現(xiàn)中體現(xiàn)。(2)構(gòu)造方法主要用于類對象的實例化,又稱構(gòu)造器。(3)類體中聲明的成員變量和方法的排列順序可以任意。java類的定義類是創(chuàng)建對象的模板,因此它應(yīng)該能夠描述一類事35成員變量類的成員變量(MemberVariable)是在類的內(nèi)部、方法定義的外部所定義的變量,成員變量又稱為屬性(Attribute)或數(shù)據(jù)域(DataField),用來描述類的數(shù)據(jù)特征。聲明類的成員變量格式如下:[訪問權(quán)限修飾符][static][final]數(shù)據(jù)類型成員變量名1[,成員變量名2,…]說明:(1)訪問權(quán)限修飾符的作用是限定成員變量的可訪問權(quán)限,主要有:public:公共的,此變量可以在任何地方訪問。protected:受保護的,此變量可以在本包及其子類中訪問。private:私有的,此變量只可以在本類中訪問。friendly:此變量只可以在本包中訪問,這是默認(rèn)的修飾符。(2)static用于聲明類成員變量,用于保存與整個類有關(guān)的狀態(tài)數(shù)據(jù)的成員變量稱為靜態(tài)成員變量或者類成員變量,簡稱為類變量,final用于聲明常量。(3)成員變量的數(shù)據(jù)類型既可以是基本數(shù)據(jù)類型,也可以是引用數(shù)據(jù)類型,如數(shù)組或者其他類對象等。成員變量類的成員變量(MemberVariable)是在36對象的創(chuàng)建和使用name+",年齡是:"+user2.(2)初始化對象中的實例變量的值,初始值可以是缺省值,或者變量按指定的值初始化;較有影響的采用面向?qū)ο蟪绦蛟O(shè)計方法的語言有C++、Java等。privateStringcellPhoneCode;//手機號碼各種訪問權(quán)限的訪問級別a=b;//靜態(tài)變量aJava中的開平方:Math.//引用成員變量面向?qū)ο蟮某绦蛟O(shè)計方法類是組成java程序的基本要素,也是java程序設(shè)計的重要思想表現(xiàn)。第一種做法,按照最原始的方式:也就是說,不論一個類具有多少個對象,靜態(tài)變量只有一個,任何一個類的對象訪問它,取得的都是相同的數(shù)值。publicstaticvoidmain(String[]args){publicvoidsetX(intx){setX(-100);publicclassRectangle{publicstaticvoidmain(String[]args)classUser{靜態(tài)成員方法在不創(chuàng)建對象的時候也可以被調(diào)用。成員變量對象的創(chuàng)建和使用成員變量37成員變量定義示例classPeople{ //類頭 intage;//成員變量 Stringname;//成員變量 doubleheight;//成員變量}在該類中定義了三個成員變量,分別是intage、Stringname和doubleheight。三個成員變量的修飾符都是默認(rèn)的friendly。成員變量定義示例classPeople{ //類頭38成員變量定義示例【例】定義一個學(xué)生類Student其屬性包含學(xué)號、姓名、性別、出生日期、電子郵箱、手機號碼、QQ號碼、通訊地址等。類的定義代碼如下:classStudent{publicStringcode;//學(xué)號publicStringname;//姓名publicbooleansex;//性別privateDatebirthDate;//出生日期privateStringEmail;//電子郵箱privateStringcellPhoneCode;//手機號碼privateintQQCode;//QQ號碼publicStringaddress;//通訊地址……//成員方法定義(略)}成員變量定義示例【例】定義一個學(xué)生類Student其屬性包含39成員變量初始化1.如果定義成員變量時沒有指定初值,則系統(tǒng)自動指定初值。成員變量初始化1.如果定義成員變量時沒有指定初值,則系統(tǒng)自動40成員變量初始化2.在定義成員變量時也可以指定初值。例如:

publicclassPoint{

privateintx=10;

……}注意:publicclassPoint{

privateintx;//錯誤,因為x=10;是賦值語句,對成員變量的操作必須放在方法中,不能直接放在類中x=10;

……}3.更為常用初始化方法是通過構(gòu)造方法。例如:publicPoint(intx1,inty1){

x=x1;

y=y1;

}成員變量初始化2.在定義成員變量時也可以指定初值。例如:41成員方法成員方法(MemberMethod)又稱為功能接口(FunctionInterface),簡稱為方法(Method),是類與外界的接口,描述了類的行為方式,反應(yīng)了對象的行為特征,特別是對屬性進行操作的特征。成員方法對成員變量的操作主要體現(xiàn)在以下兩個方面:改變對象的屬性,一般記為set方法返回對象的屬性,一般記為get方法成員方法成員方法(MemberMethod)又稱為功能接口42成員方法類的行為即對數(shù)據(jù)的操作由它的成員方法實現(xiàn)。成員方法是可被調(diào)用執(zhí)行并返回值的、能實現(xiàn)特定功能的程序段。成員方法聲明格式如下:[訪問權(quán)限修飾符][abstract][static][final]返回值類型方法名([形式參數(shù)列表])[throws異常類]{方法體 }說明:(1)成員方法的訪問權(quán)限修飾符和成員變量的修飾符一樣有四種情況:public:此方法可以在任何地方訪問。private:此方法只可以由本類中的方法訪問。friendly:此方法可以由本類中的方法和本包中其他類中的方法訪問,為默認(rèn)修飾符。protected:此方法可以由本類及其子類中的方法訪問。成員方法類的行為即對數(shù)據(jù)的操作由它的成員方法實現(xiàn)。成員方法是43成員方法(2)abstract、static和final分別用于指定所聲明的方法為抽象方法、靜態(tài)方法和終結(jié)方法。靜態(tài)方法又稱類成員方法或類方法,一般用于與類有關(guān)的數(shù)據(jù)操作,可以使用類名直接調(diào)用。(3)成員方法執(zhí)行數(shù)據(jù)操作功能后都會向調(diào)用者返回數(shù)據(jù)操作的結(jié)果,返回值類型就是用于聲明該成員方法返回值結(jié)果的數(shù)據(jù)類型,可以是包括基本數(shù)據(jù)類型和引用類型在內(nèi)任何合法的類型。(4)若成員方法不返回任何值,則返回值類型用void標(biāo)記,不能缺省。(5)每個成員方法都有一個方法名,緊鄰方法名的是用一對括號()括起來的參數(shù)列表,參數(shù)列表也稱為形式參數(shù)表,簡稱形參表。成員方法(2)abstract、static和final分別44成員方法(6)形參表主要用于聲明該成員方法在被調(diào)用時需要調(diào)用者提供的、與數(shù)據(jù)操作相關(guān)的參數(shù)的個數(shù)與數(shù)據(jù)類型。每個成員方法允許聲明的形參可以有零到多個,每個形參由形參數(shù)據(jù)類型、空格符和形參名組成,多個形參之間用逗號分隔,即便成員方法沒有形參,括號()也不能缺省。(7)形參的作用域是局部的,只限于聲明它的成員方法之內(nèi)有效。(8)throws用于聲明該成員方法在執(zhí)行過程中可能會拋出的異常類型。成員方法(6)形參表主要用于聲明該成員方法在被調(diào)用時需要調(diào)用45成員方法(9)花括號{}所括起來的就是方法體,方法體可以包含一到多條語句,用以實現(xiàn)成員方法所負(fù)責(zé)的數(shù)據(jù)操作功能。若成員方法的返回值類型不為void,則在方法體中需要使用return語句返回其數(shù)據(jù)操作的結(jié)果,且結(jié)果類型必須與方法聲明的返回值類型相一致。方法體也可以是一個分號“;”(沒有{}),表示無方法體,該方法沒有實現(xiàn)。當(dāng)且僅當(dāng)方法的修飾符中有abstract或native時,方法才無方法體。(10)在方法體內(nèi)可以定義局部變量,其作用域只限于聲明它的方法體內(nèi),且聲明中不能使用public等訪問修飾符和static關(guān)鍵字,同時需遵循“先賦值,后使用”的原則,且在同一個類的不同方法中可以聲明同名的局部變量,包括形式參數(shù)在內(nèi)的所有局部變量都不能在方法體外被訪問。成員方法(9)花括號{}所括起來的就是方法體,方法體可以包含46hello();voideat(){//成員方法,空類型,無參數(shù),方法名為eat計算機不能直接執(zhí)行高級語言程序,必須先翻譯成為機器語言程序之后才能執(zhí)行。對象運行結(jié)束后或生命周期結(jié)束時,將成為垃圾對象,但并不意味著就立即會被回收,僅當(dāng)垃圾回收器空閑或內(nèi)存不足時,才會回收它們。name=name;靜態(tài)成員變量可以通過類名直接訪問,也可以由對象變量來引用。print();//調(diào)用本類中的print方法Class15.其次,結(jié)構(gòu)化的程序設(shè)計方法仍存在與人的思維不協(xié)調(diào)的地方,所以很難自然、準(zhǔn)確地反映真實世界。靜態(tài)成員與實例成員public

class

Example

{

void

idea()

{

System.System.Circle類具有類型為double的半徑、周長和面積屬性,并具有返回周長和面積的方法。通過this可以引用當(dāng)前對象的成員變量或者調(diào)用當(dāng)前對象的成員方法。Rectangleob=newRectangle();System.結(jié)構(gòu)化的程序設(shè)計把程序的結(jié)構(gòu)規(guī)定為順序、選擇和循環(huán)三種結(jié)構(gòu),限制使用GOTO語句,并采用了自頂向下、逐步求精的分析和設(shè)計方法,即功能分解法,這種方法將需求空間視為一個功能模塊,該模塊又進行分解,生成多個小的功能模塊,重復(fù)分解,直至每個模塊具有明確的功能和適當(dāng)?shù)膹?fù)雜度,而每個模塊的功能實現(xiàn)都由上述三種基本結(jié)構(gòu)組成,其目的是為了解決由許多人共同開發(fā)大型軟件時,如何高效率地完成高可靠系統(tǒng)的問題。[訪問權(quán)限修飾符][abstract][static][final]返回值類型方法名([形式參數(shù)列表])[throws異常類]機器語言:是計算機能夠直接執(zhí)行的二進制指令代碼,每條指令都用0和1組成的序列串表示,這些指令的集合就是指令系統(tǒng)。面向?qū)ο蟮某绦蛟O(shè)計中程序是“對象+消息”。成員方法例如下面的代碼聲明了一個名為People的類,其中定義了兩個成員方法。classPeople{ intage;//成員變量 Stringname;//成員變量 doubleheight;//成員變量 voidlaugh(){//成員方法,空類型,無參數(shù),方法名為laugh System.out.println("哈哈");//方法體}voideat(){//成員方法,空類型,無參數(shù),方法名為eatSystem.out.println("人要吃飯");//方法體}}//類體結(jié)束hello();成員方法例如下面的代碼聲明了一個名為Peop47成員方法如果方法有返回值類型,則方法體中必須有return語句.如果想讓方法執(zhí)行后得到值a,即返回值為a,那么在方法中要使用returna語句。return有“返還”之意,它把表達(dá)式的值返回到調(diào)用之處。例如:publicclassClass3{doublef(intx){ return2.5+x;}publicstaticvoidmain(String[]args){Class3aaa=newClass3();doubley=aaa.f(3);System.out.println(y);System.out.println(aaa.f(2)); }}成員方法如果方法有返回值類型,則方法體中必須有return語48return語句return語句用在方法中,每一個方法可以有一個返回值,也可以沒有,沒有即返回returnvoid。當(dāng)程序執(zhí)行到該語句時,終止當(dāng)前方法的執(zhí)行,返回到調(diào)用該方法語句的后面一條語句。return語句可以從一個方法返回,并把控制權(quán)交給調(diào)用它的語句,return語句通常被放在方法的最后,用于退出當(dāng)前方法并返回一個值。它的語法格式為:return[表達(dá)式];表達(dá)式是可選參數(shù),表示要返回的值。它的數(shù)據(jù)類型必須同方法聲明中的返回值類型一致。如果不一致時,表達(dá)式的類型強制轉(zhuǎn)換為方法返回值的類型。return語句return語句用在方法中,每一個方法可49return語句例如:編寫返回a和b兩數(shù)相加之和的方法可以使用如下代碼:publicintset(inta,intb){returnsum=a+b;}計算表達(dá)式的值,然后將該值返回到調(diào)用該方法的語句中return語句例如:編寫返回a和b兩數(shù)相加之和的方法可以50return語句如果方法沒有返回值,可以省略return關(guān)鍵字的表達(dá)式,使方法結(jié)束。代碼如下:publicvoidset(inta,intb){sum=a+b;return;//也可以省略return語句,因為方法的結(jié)束標(biāo)記大花括號也具有該語句的功能,}這種格式一般用于if語句或者switch語句等選擇結(jié)構(gòu)。return語句如果方法沒有返回值,可以省略return關(guān)鍵51return語句return語句52類課堂練習(xí)定義滿足下列條件的Pen類:Pen類擁有的屬性有:筆尖的粗細(xì)、墨水量、墨水顏色、有無筆帽、長度及半徑。Pen類擁有的方法:畫圖、寫字、更換墨水類課堂練習(xí)定義滿足下列條件的Pen類:53

面向?qū)ο蟪绦蛟O(shè)計方法

類的定義構(gòu)造方法對象的創(chuàng)建和使用this關(guān)鍵字類的封裝性靜態(tài)成員與實例成員方法調(diào)用與參數(shù)傳遞匿名對象內(nèi)容提要

面向?qū)ο蟪绦蛟O(shè)計方法內(nèi)容提要54構(gòu)造方法構(gòu)造方法是類用來創(chuàng)建對象、初始化類的屬性的一種特殊方法,它本身不屬于類的成員方法。每當(dāng)由類創(chuàng)建對象時都要調(diào)用該類特定的構(gòu)造方法,在Java中,每個類都至少有一個構(gòu)造方法。構(gòu)造方法可以確保用戶正確地構(gòu)造類的對象,同時,構(gòu)造方法也會對對象作初始化工作。構(gòu)造方法的聲明格式如下: [<修飾符>]<類名稱>([<參數(shù)列表>]) { 初始化的程序代碼塊 }可以使用參數(shù)值作為變量的初值,也可以直接給變量賦具體的數(shù)值。構(gòu)造方法構(gòu)造方法是類用來創(chuàng)建對象、初始化類的屬性的一種特殊方55構(gòu)造方法說明:(1)一個類的構(gòu)造方法可以有多個,它們都具有相同的方法名,即類名;(2)與類的成員方法不同,構(gòu)造方法用于創(chuàng)建類的對象并對對象的成員變量進行初始化。(3)構(gòu)造方法沒有返回值類型,但是也不能有void關(guān)鍵字,且只能通過new運算符調(diào)用。(4)修飾符一般采用public(或者沒有),以便于在其他位置根據(jù)需要定義并實例化該類的對象。修飾符也可以使用private,private類型的構(gòu)造方法表明該類類不能被其他類實例化,通常用于只含有靜態(tài)成員的類。(5)當(dāng)一個類沒有顯式聲明其構(gòu)造方法時,Java編譯器會自動為該類生成一個默認(rèn)的、無參數(shù)的構(gòu)造方法,且實例化后對象的成員變量在沒有特別賦值的情況下自動獲得其所聲明類型的默認(rèn)值。構(gòu)造方法說明:56這種模式更近似于現(xiàn)實世界,在這里,所有的對象都同時擁有屬性以及與這些屬性相關(guān)的行為。所以,我們在實際編程的時候有時候需要在一個構(gòu)造方法中調(diào)用另外一個構(gòu)造方法,但是,在使用this關(guān)鍵字調(diào)用其他構(gòu)造方法時,this()只能放在構(gòu)造方法的首行,為的是能夠為類中的屬性初始化,而且至少有一個構(gòu)造方法是不用this調(diào)用的,否則程序會出錯。類的訪問權(quán)限有public和缺省兩種。程序設(shè)計語言的設(shè)計目的主要是為了支持某種程序設(shè)計方法。對象的創(chuàng)建和使用顯然,用第一種方法考慮周全,結(jié)構(gòu)清晰,層次分明,作者容易寫,讀者容易看。創(chuàng)建一個對象后,在程序中就可以引用對象中的成員變量,調(diào)用對象的成員方法(即使用對象),語法格式如下:如果不一致時,表達(dá)式的類型強制轉(zhuǎn)換為方法返回值的類型。publicStudent(Stringname){//一個參數(shù)的構(gòu)造方法結(jié)構(gòu)化的程序設(shè)計方法:如果發(fā)現(xiàn)某一部分中有一段內(nèi)容不妥,需要修改

只需找出該部分,修改有關(guān)段落即可,與其他部分無關(guān)。classPeople{ //類頭同一個類的不同對象可以互相訪問對方的private實例變量或者調(diào)用對方的private實例方法,這是因為訪問控制符是在類級別上,而不是對象級別上。聲明類是公有的,可以被任何類使用或繼承?!纠慷x一個學(xué)生類Student其屬性包含學(xué)號、姓名、性別、出生日期、電子郵箱、手機號碼、QQ號碼、通訊地址等。第一種做法,按照最原始的方式:classStudent{提升程序的開發(fā)與運行效率如果使用實例成員變量,那么每個中國人的實例對象都會分配一個country屬性,有多少個中國人的實例對象,就會創(chuàng)建多少份country屬性的內(nèi)存空間。例如:張三=newPeople()構(gòu)造方法的分類1.不帶參數(shù)的構(gòu)造方法,又分為:缺省的構(gòu)造方法顯式的不帶參數(shù)的構(gòu)造方法2.帶參數(shù)的構(gòu)造方法

這種模式更近似于現(xiàn)實世界,在這里,所有的對象都同時擁有屬性以57構(gòu)造方法(1)缺省的構(gòu)造方法

如果類的定義沒有編寫構(gòu)造方法,Java語言會自動為用戶提供。這個由Java自動提供的構(gòu)造方法就是所謂的缺省構(gòu)造方法。缺省的構(gòu)造方法確保每個Java類都至少有一個構(gòu)造方法,該方法應(yīng)符合方法的定義。

但如果自定義了構(gòu)造方法,則系統(tǒng)不再提供無參構(gòu)造方法。如果需要無參的構(gòu)造方法,則需要顯式定義。例如在下例的類EmpInfo中,我們沒有定義構(gòu)造方法,則Java自動提供了一個缺省的構(gòu)造方法,如下:publicEmpInfo(){}//缺省的構(gòu)造方法構(gòu)造方法(1)缺省的構(gòu)造方法58缺省的構(gòu)造方法EmpInfo.javapublicclassEmpInfo{Stringname;//雇員的姓名Stringdesignation;//雇員的職務(wù)Stringdepartment;//雇員的部門voidprint(){//成員方法System.out.println(name+"is"+designation+"at"+department);}publicstaticvoidmain(Stringargv[]){EmpInfoemployee=newEmpInfo();//創(chuàng)建對象并實例化="RobertJavaman";//給成員變量賦值employee.designation="Manager";//給成員變量賦值employee.department="CoffeeShop";//給成員變量賦值employee.print();//調(diào)用方法print()}}運行結(jié)果如下:RobertJavamanisManageratCoffeeShop調(diào)用缺省的構(gòu)造方法缺省的構(gòu)造方法EmpInfo.java調(diào)用缺省的構(gòu)造方法59構(gòu)造方法(2)顯式的不帶參數(shù)的構(gòu)造方法。例如,可以為People類增加一個如下所示的構(gòu)造方法ClassPeople{stringname;intage;floatheight;floatweight;publicPeople()//無參數(shù){name="沈昕";age=26;height=1.62;weight=55.5;}}構(gòu)造方法(2)顯式的不帶參數(shù)的構(gòu)造方法。例如,可以為Peop60構(gòu)造方法(3)帶參數(shù)的構(gòu)造方法帶有參數(shù)的構(gòu)造方法能夠?qū)崿F(xiàn)這樣的功能:當(dāng)構(gòu)造一個新對象時,類構(gòu)造方法可以按需要將一些指定的參數(shù)傳遞給對象的變量。例如,如果希望在創(chuàng)建對象時,其實例變量具有不同的初值,可以通過傳遞參數(shù)并將參數(shù)值賦給實例變量的方法來實現(xiàn)。構(gòu)造方法的參數(shù)要與實例變量一一對應(yīng),例如:People類的另一種構(gòu)造方法為:帶參數(shù)的構(gòu)造方法構(gòu)造方法(3)帶參數(shù)的構(gòu)造方法61帶參數(shù)的構(gòu)造方法ClassPeople{Stringname;intage;floatheight;floatweight;publicPeople(StringinitName,intinitAge,doubleinitHeight,doubleinitWeight){name=initName;age=initAge;height=initHeight;weight=initWeight;}}帶參數(shù)的構(gòu)造方法ClassPeople{62一個類可以有多個構(gòu)造方法(構(gòu)造方法的重載)ClassPeople{Stringname;intage;floatheight;floatweight;publicPeople()//無參數(shù){name="沈昕";age=26;height=1.62;weight=55.5;}publicPeople(StringinitName,intinitAge,doubleinitHeight,doubleinitWeight){name=initName;age=initAge;height=initHeight;weight=initWeight;}}一個類可以有多個構(gòu)造方法(構(gòu)造方法的重載)ClassPeo63構(gòu)造方法構(gòu)造方法不能像一般的成員方法那樣被直接調(diào)用,它是在構(gòu)造類的對象的時候被new關(guān)鍵字調(diào)用的。當(dāng)我們構(gòu)造一個類的對象的時候,編譯器主要完成以下三件事情:(1)為對象分配內(nèi)存空間;(2)初始化對象中的實例變量的值,初始值可以是缺省值,或者變量按指定的值初始化;(3)調(diào)用對象的構(gòu)造方法。一個類的構(gòu)造方法可以有多個,它們都具有相同的方法名,即類名。編譯器根據(jù)參數(shù)的類型來決定調(diào)用哪個構(gòu)造方法。這就是構(gòu)造方法的多態(tài)。構(gòu)造方法構(gòu)造方法不能像一般的成員方法那樣被直接調(diào)用,它是在構(gòu)64

面向?qū)ο蟪绦蛟O(shè)計方法

類的定義構(gòu)造方法對象的創(chuàng)建和使用this關(guān)鍵字類的封裝性靜態(tài)成員與實例成員方法調(diào)用與參數(shù)傳遞匿名對象內(nèi)容提要

面向?qū)ο蟪绦蛟O(shè)計方法內(nèi)容提要65Java中的對象

對象是類的實例,所以一個對象必定屬于一個已知的類。Java語言中,一個對象的生命周期經(jīng)歷:對象的創(chuàng)建、對象的使用、對象的銷毀三個階段。對象被創(chuàng)建后將獲得包括內(nèi)存在內(nèi)的所需資源;而對象銷毀后,其所占的資源將被系統(tǒng)自動回收。Java語言具有資源回收機制,能跟蹤存儲單元的使用情況,自動回收不再被使用的資源。Java中的對象對象是類的實例,所以一個對象必定屬于一個已66對象的創(chuàng)建

對象的創(chuàng)建:創(chuàng)建一個對象包括兩個步驟:聲明對象和為對象分配內(nèi)存。1)對象的聲明一般格式為:類名對象名如:People張三這里people是前面定義的一個類的名字,張三是聲明對象的名字。但此時對象“張三”的內(nèi)存中沒有任何數(shù)據(jù),即“張三”還是一個空對象,不能使用。要是用這個對象還必須為這個對象分配內(nèi)存,也叫做為對象分配實體。

對象的創(chuàng)建對象的創(chuàng)建:創(chuàng)建一個對象包括兩個步驟:聲明對象67對象的創(chuàng)建2)為對象分配內(nèi)存:為對象分配內(nèi)存,即使用new運算符和類的構(gòu)造方法實例化某個對象。如果類中沒有構(gòu)造方法,系統(tǒng)會自動調(diào)用默認(rèn)的構(gòu)造方法(沒有參數(shù),名字遵循普通構(gòu)造方法的要求:和類名相同),格式為:

對象名=new構(gòu)造方法名([實參列表]);//實例化對象

例如:張三=newPeople()也可以把以上兩個步驟合在一起,格式為:類名對象名=new構(gòu)造方法名([實參列表]);

例如:People張三=newPeople()另外,因為對象也是一種變量,因此它可作為數(shù)組元素、類的成員、也可以出現(xiàn)在成員方法的參數(shù)表和方法體中。new可以實例化類的多個不同的對象,分配不同的內(nèi)存。因此,這些對象之間的狀態(tài)相互獨立。對象的創(chuàng)建2)為對象分配內(nèi)存:為對象分配內(nèi)存,即使用new68對象的使用

創(chuàng)建一個對象后,在程序中就可以引用對象中的成員變量,調(diào)用對象的成員方法(即使用對象),語法格式如下: 對象名.成員變量 對象名.成員方法([實參列表])例如:aday.year=2009; aday.setDate(2009,10,28);說明:(1)對象名與成員變量或方法之間使用點運算符“.”分隔。(2)方法調(diào)用時給出的參數(shù)稱為實際參數(shù),簡稱實參。實參可以是常量、變量、表達(dá)式或方法的調(diào)用,實參的個數(shù)與數(shù)據(jù)類型及排列次序一定要與類定義中該方法聲明的形參保持一致,且多個實參之間用逗號分隔。對象的使用創(chuàng)建一個對象后,在程序中就可以引用對象中的成員變69對象的使用

(2)當(dāng)調(diào)用方法時,系統(tǒng)按照實參與形參一一對應(yīng)的關(guān)系將實參的值或引用傳遞給對應(yīng)的形參。需要特別注意的是,若實參為引用類型的數(shù)據(jù),其值不能為null。方法后的圓括號()是必需的,即便該方法沒有聲明形式參數(shù)也不能缺省。

對象的使用(2)當(dāng)調(diào)用方法時,系統(tǒng)按照實參與形參一一對應(yīng)的70對象創(chuàng)建和使用:例1classPeople{ intage; Stringname; doubleheight; People(){//構(gòu)造方法 name="張婷"; age=25; height=160.0; } voidlaugh(){//類的一個成員方法 System.out.println("Haaha..."); } publicstaticvoidmain(String[]args){ System.out.println("main方法執(zhí)行"); Peoplep=newPeople(); p.laugh();System.out.println("="+);System.out.println("p.age="+p.age);System.out.println("p.height="+p.height); }}對象創(chuàng)建和使用:例1classPeople{71對象創(chuàng)建和使用:例2publicclassClass27{inta;publicClass27(){ a=10;}publicClass27(intq){ a=q;}publicstaticvoidmain(String[]args){Class27ob1=newClass27();Class27ob2=newClass27(20);Class27ob3=newClass27(30);

System.out.println(ob1.a);System.out.println(ob2.a);System.out.println(ob3.a);

}}兩個構(gòu)造方法對象創(chuàng)建和使用:例2publicclassClass2772對象創(chuàng)建和使用:例3classMan{intheight;intage;}publicclassClass1{publicstaticvoidmain(String[]args){Manman1;man1=newMan();man1.height=180;man1.age=20;System.out.println(man1.height);//使用對象的成員變量System.out.println(man1.age); }}在本源程序中,有兩個類,其中包含主方法的類為主類,文件名與主類名相同對象創(chuàng)建和使用:例3classMan{在本源程序中,有兩個73對象的銷毀java不需要顯式地銷毀對象,java有一個垃圾回收器(garbagecollector,簡稱GC),在程序運行時,垃圾回收器會自動創(chuàng)建一個線程運行并監(jiān)控需要清理的對象并自動清理.這也是java比C++安全性和簡便性更好的原因之一。Java中垃圾回收器自動地定期掃描Java對象的動態(tài)內(nèi)存,并將所有的引用對象加上標(biāo)記,在對象運行結(jié)束后(無引用變量對該對象進行關(guān)聯(lián)),清除其標(biāo)記,并將所有無標(biāo)記的對象作為垃圾進行回收,釋放垃圾對象所占的內(nèi)存空間。對象運行結(jié)束后或生命周期結(jié)束時,將成為垃圾對象,但并不意味著就立即會被回收,僅當(dāng)垃圾回收器空閑或內(nèi)存不足時,才會回收它們。對象的銷毀java不需要顯式地銷毀對象,java有一個垃圾回74對象的銷毀垃圾回收器也有自己的缺點,就是它不會實時的調(diào)用自己來回收已經(jīng)過期的對象,因為它是一個優(yōu)先級很低的進程來控制的,所以只有當(dāng)系統(tǒng)內(nèi)存比較緊張的情況下才會做銷毀對象,釋放內(nèi)存的工作,而且它也有個局限性,就是只會釋放new出來的對象,對于靜態(tài)的對象變量或者其他方式創(chuàng)建的對象它是不做處理的,所以O(shè)bject里有個finalize方法提供給子類來實現(xiàn),就是為了能在GC銷毀對象對做一些清理型的工作,比如關(guān)閉流之類的,我們可以在里面寫上對象銷毀后需要關(guān)聯(lián)的操作。對象的銷毀垃圾回收器也有自己的缺點,就是它不會實時的調(diào)用自己75對象的創(chuàng)建和使用作業(yè)1.有一個類Class1擁有以下成員變量:inta;doubleb;Stringc;請編寫構(gòu)造方法(帶參數(shù))初始化成員變量,創(chuàng)建類Class1的對象ob,輸出對象ob的三個成員變量值。2.定義一個滿足下面要求的矩形類Rectangle,Rectangle類具有長度(length)和寬度(width)屬性,并提供計算矩形面積的方法area()。類中需要構(gòu)造方法(帶參數(shù))對成員變量進行初始化,最后定義主類TestRectangle,創(chuàng)建Rectangle類的對象,調(diào)用對象的area()方法輸出矩形面積。對象的創(chuàng)建和使用作業(yè)1.有一個類Class1擁有以下成員變量76publicPeople()//無參數(shù)println("方法調(diào)用前數(shù)組a的值:");這不叫靜態(tài)方法調(diào)用非靜態(tài)方法,這調(diào)用的是實例化方法,就是先new一個對象,再用這個對象去調(diào)用對象中的實例化方法,到哪里這樣調(diào)用都沒問題(只要方法是public的)。println(aaa.這里可能產(chǎn)生一個問題:同一個類中不同方法之間相互調(diào)用時,不就可以直接調(diào)用嗎?這里需要指出,同一個類的一個方法調(diào)用另外一個方法時,如果被調(diào)用的方法是實例方法,則默認(rèn)使用this作為調(diào)用者,如果被調(diào)用的方法是靜態(tài)方法,則默認(rèn)使用類作為調(diào)用者。需要調(diào)用某個靜態(tài)方法時,可以使用其所屬的類的名稱直接調(diào)用,也可以用類的某個具體的對象名調(diào)用,其格式為:求屬性x和y最大值,并返回結(jié)果的方法;main方法就是靜態(tài)方法,javacCommandParameter.類聲明之后的一對大括號“{”、“}”以及它們之間的內(nèi)容稱做類體。成員方法對成員變量的操作主要體現(xiàn)在以下兩個方面:實例化一個對象,調(diào)用對象的這兩個方法,輸出結(jié)果。這一程序設(shè)計方法的代表語言是Pascal、C等。privatedoubleheight;publicclassThisExample4{name=name;如果類的定義沒有編寫構(gòu)造方法,Java語言會自動為用戶提供。setX(-100);Testobject=newTest();publicClass27(){對象的創(chuàng)建和使用作業(yè)3.創(chuàng)建簡單的銀行帳戶類,包括開戶人、帳號和存款余額三個屬性,以及查詢余額,存款,取款等方法。創(chuàng)建兩個帳戶驗證類的設(shè)計。4.定義一個類,包含兩個成員方法,一個為intsum(inta,intb),求兩個數(shù)的和,另外一個為intaverage(inta,intb,intc),求三個數(shù)的平均值。實例化一個對象,調(diào)用對象的這兩個方法,輸出結(jié)果。publicPeople()//無參數(shù)對象的創(chuàng)建和使用作77對象的創(chuàng)建和使用作業(yè)5.定義一個類,該類具有x和y兩個屬性。定義構(gòu)造方法初始化這兩個屬性。類中還定義以下成員方法:求屬性x和y的和,并返回結(jié)果的方法;求屬性x和y的差,并返回結(jié)果的方法;求屬性x和y的積,并返回結(jié)果的方法;求屬性x和y的商,并返回結(jié)果的方法;求屬性x/y的余數(shù),并返回結(jié)果的方法;求屬性x和y最大值,并返回結(jié)果的方法; 求屬性x和y最小值,并返回結(jié)果的方法;編寫主類,測試上面定義的類,使用類中定義的各個方法并將其結(jié)果輸出。

對象的創(chuàng)建和使用作業(yè)5.定義一個類,該類具有x和y兩個屬性78對象的創(chuàng)建和使用作業(yè)6.定義一個類A,類中有一個private類型的整型變量data,一個private類型的字符串對象str。類中有兩個構(gòu)造方法,一個不含參數(shù),初始化data和str為其默認(rèn)值;另一個有兩個參數(shù),分別用來初始化data和str。類中還定義了三個方法,方法的原型與功能分別如下:publicvoidadd(intk,Strings)//該方法把data和str的值分別加上k和s;publicvoidclearA()//該方法把data和str的值分別清除為其默認(rèn)值;publicStringtoString()//該方法把data和str的值轉(zhuǎn)變?yōu)橐粋€字符串返回。returnString.ValueOf(data)編寫應(yīng)用程序測試類TestA,使用類A中的構(gòu)造方法創(chuàng)建對象,分別使用三個方法并將結(jié)果輸出。對象的創(chuàng)建和使用作業(yè)6.定義一個類A,類中有一個pri79對象的創(chuàng)建和使用作業(yè)7.三角形、圓形和梯形的類封裝:讓學(xué)生學(xué)習(xí)使用類來封裝對象的屬性和行為。編寫一個java程序,該程序中有3個類:Trangle、Lader、Circle,分別用來刻畫三角形、梯形和圓形。具體要求如下:Trangle類具有類型為double的三個邊以及周長、面積屬性,并且具有返回周長、面積以及修改三個邊的方法,另外Trangle類還具有一個boolean類型的屬性,該屬性用來判斷三個數(shù)是否能構(gòu)成一個三角形。Lader類具有類型為double的上底、下底、高和面積屬性,并具有返回面積的方法。Circle類具有類型為double的半徑、周長和面積屬性,并具有返回周長和面積的方法。創(chuàng)建3個類的對象,分別求三角形面積和周長,梯形面積以及圓形的面積和周長。對象的創(chuàng)建和使用作業(yè)7.三角形、圓形和梯形的類封裝:讓學(xué)生80三角形面積公式已知三角形三邊為a,b,c,,p=(a+b+c)/2則三角形面積為:s=Java中的開平方:Math.sqrt(p*(p-a)*(p-b)*(p-c))三角形面積公式已知三角形三邊為a,b,c,,p=(a+b+81

面向?qū)ο蟪绦蛟O(shè)計方法

類的定義構(gòu)造方法對象的創(chuàng)建和使用this關(guān)鍵字類的封裝性靜態(tài)成員與實例成員方法調(diào)用與參數(shù)傳遞匿名對象內(nèi)容提要

面向?qū)ο蟪绦蛟O(shè)計方法內(nèi)容提要82this關(guān)鍵字Java語言提供了豐富的類(Class)、接口(Interface)以及相應(yīng)的方法(Method)。使用這些類或接口,用戶可以定義自己的類或子類,并以這些類為模板創(chuàng)建對象(Object)。在Java語言中,當(dāng)創(chuàng)建一個對象后,Java虛擬機就會為其分配一個指向?qū)ο蟊旧淼闹羔槪@個指針就是“this”。關(guān)鍵字this與對象密切相關(guān),在Java程序設(shè)計中經(jīng)常會見到this的使用。通過this可以引用當(dāng)前對象的成員變量或者調(diào)用當(dāng)前對象的成員方法。this主要有以下幾種使用方法:this.成員變量this.成員方法([參數(shù)列表])使用this調(diào)用構(gòu)造方法使用this引用當(dāng)前對象this關(guān)鍵字主要用于類的非靜態(tài)成員方法(即實例方法)與構(gòu)造方法中,而在靜態(tài)方法(即類方法)中是不允許使用this關(guān)鍵字的。this關(guān)鍵字Java語言提供了豐富的類(Class)、接口83this.成員變量

一個對象中的方法一般可以直接訪問同一對象的成員變量。但是,有時候方法體內(nèi)部定義的局部變量和成員變量名字相同,還有時方法的入口參數(shù)和對象的成員變量名字相同,那么就需要將三者區(qū)別清楚。因此,專門用this來指明當(dāng)前對象的成員變量。語法格式為:this.成員變量說明:(1)由于this用于表示指向當(dāng)前對象的引用,所以它不能在類成員方法(靜態(tài)方法)中使用,只能出現(xiàn)在實例成員方法中。(2)在類的方法體中,如出現(xiàn)形參或局部變量與成員變量同名的情況,系統(tǒng)默認(rèn)的是形參或局部變量,若需要訪問成員變量,則只能使用this來引用。(3)在沒有以上同名情況的時候,對于當(dāng)前對象的成員變量和成員方法的訪問可以省略this引用。this.成員變量一個對象中的方法一般可以直接訪問同一84關(guān)鍵字this最常見的應(yīng)用是在類的構(gòu)造方法中解決構(gòu)造方法的形式參數(shù)與成員變量同名的問題。例如,下面一段程序:publicclassPeople{privateStringname;privateintage;privatechargender;privatedoubleheight;privatedoubletweight;publicPeople(Stringname,intage,chargender,doubleheight,doubleweight){name=name;age=age;gender=gender;height=height;weight=weight;}……}this關(guān)鍵字:構(gòu)造方法的形式參數(shù)與成員變量重名關(guān)鍵字this最常見的應(yīng)用是在類的構(gòu)造方法中解決構(gòu)造方法的形85在上面的一段程序中,共有name、age、gender、height和weight5個實例變量。在構(gòu)造方法中的5個參數(shù)的變量名稱與實例成員變量的名稱一一對應(yīng)相同。在參數(shù)名或者局部變量名與實例成員變量同名的時候,由于參數(shù)變量和局部變量的優(yōu)先級高,所以在方法體中參數(shù)名或者局部變量名將隱藏同名的實例成員變量。這種情況在Java語言中是不被允許的。如果想使實例變量和方法的參數(shù)或方法本身定義的局部變量同名的話,就需要用一種方法使實例成員變量與和其同名的方法參數(shù)或局部變量區(qū)分開來,這就要使用到this關(guān)鍵字。下面的一段程序改寫了上面的程序,使People類的構(gòu)造方法可以合法地使用與實例變量名稱相同的參數(shù)。this關(guān)鍵字:構(gòu)造方法的形式參數(shù)與成員變量重名在上面的一段程序中,共有name、age、gender、he86publicclassPeople{privateStringname;privateintage;privatechargender;privatedoubleheight;privatedoubletweight;publicPeople(Stringname,intage,chargender,doubleheight,doubleweight){=name;this.age=age;this.gender=gender;this.height=height;this.weight=weight;}……}其中,使用this調(diào)用的都是實例變量,例如:,而name是參數(shù)變量。由上面的實例,我們可以看出,this在方法體中用來指向調(diào)用當(dāng)前正在執(zhí)行方法的對象。當(dāng)然我們也可以通過使用與實例變量名不同的參數(shù)名或者局域變量名來避免這個問題。this關(guān)鍵字:構(gòu)造方法的形式參數(shù)與成員變量重名publicclassPeople其中,使用this調(diào)用87publicclassClass27{inta;publicClass27(){

溫馨提示

  • 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)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論