第一篇:Java 教案-第08章 對(duì)象和類
第8章 對(duì)象和類
8.1 介紹(Introduction)
雖然我們已經(jīng)學(xué)過了Java基礎(chǔ)知識(shí),如選擇,循環(huán),方法和數(shù)組,但這些Java的特征對(duì)于我們開發(fā)圖形用戶接口和大規(guī)模的軟件系統(tǒng)還遠(yuǎn)遠(yuǎn)不夠。假設(shè)我們想開發(fā)如圖所示的GUI(goo-ee),我們?nèi)绾尉帉懀?/p>
從這章開始我們開始介紹面向?qū)ο缶幊?,方便我們開發(fā)Gui和大規(guī)范軟件系統(tǒng)。8.2 定義類為Object類型
面向?qū)ο缶幊蹋∣bject-Oriented Programming OOP)就是利用對(duì)象進(jìn)行編寫。對(duì)象object代表現(xiàn)實(shí)世界中獨(dú)一無(wú)二的一個(gè)實(shí)體。如,一個(gè)學(xué)生,一張桌子,一個(gè)按鈕,甚至一個(gè)貸款都可以被看著是對(duì)象。一個(gè)對(duì)象有它自己獨(dú)有的特征,狀態(tài)和行為。
1.2.對(duì)象的狀態(tài)(也稱屬性或特征)用包含當(dāng)時(shí)數(shù)據(jù)的數(shù)據(jù)字段來(lái)表示。如一個(gè)圓對(duì)象,有半徑這個(gè)數(shù)據(jù)字段,它就是圓的特征和屬性。一個(gè)矩形有高和寬兩個(gè)特征,作為矩形對(duì)象的2個(gè)字段。對(duì)象的行為(也稱動(dòng)作或操作)通過方法定義。對(duì)象調(diào)用方法就是高手這個(gè)對(duì)象要執(zhí)行一個(gè)動(dòng)作。
如可以為圓對(duì)象定義一個(gè)getArea()方法,那么圓對(duì)象調(diào)用getArea()方法來(lái)返回圓的面積。
我們可以用一個(gè)普通的類來(lái)定義一個(gè)同類型的對(duì)象。一個(gè)類就是一個(gè)模板,一個(gè)藍(lán)圖或合同,它們定義一個(gè)對(duì)象的數(shù)據(jù)字段和方法。對(duì)象就是這個(gè)類的實(shí)例。我們可以為類創(chuàng)建若干個(gè)對(duì)象,創(chuàng)建對(duì)象就是所謂的實(shí)例化。對(duì)象和實(shí)例經(jīng)常相互交叉。類和對(duì)象的關(guān)系就像是一個(gè)蘋果派和一個(gè)蘋果派配方一樣。我們可以利用配方制作很多蘋果派,每個(gè)蘋果派都不完全一樣,有各自的作用。如圖顯示了一個(gè)Circle類和它的三個(gè)對(duì)象。
一個(gè)Java類用變量來(lái)定義數(shù)據(jù)字段,用方法來(lái)定義操作或動(dòng)作。類提供一種非常特別類型的方法,稱之為構(gòu)造方法,也稱構(gòu)造器,這個(gè)構(gòu)造方法的調(diào)用會(huì)創(chuàng)建一個(gè)新對(duì)象。雖然一個(gè)構(gòu)造方法可以執(zhí)行任何動(dòng)作,但構(gòu)造方法的設(shè)計(jì)是用來(lái)為對(duì)象的數(shù)據(jù)字段和方法進(jìn)行初始化的,如下圓類的定義。
Circle類和我們之前見過的類都不同,它沒有main方法,也不能被運(yùn)行,它僅僅是定義了一個(gè)圓對(duì)象類。包含main方法的類,為了方便,以后我們稱為主類。類和對(duì)象用UML符號(hào)描述如下。
8.3 定義類和創(chuàng)建對(duì)象
程序創(chuàng)建3個(gè)圓對(duì)象,半徑分別為1.0,2.5,125,顯示每一個(gè)圓對(duì)象的半徑和面積,改變第二個(gè)圓的半徑,并顯示新面積和半徑。
程序包含2個(gè)類,第一個(gè)類為TestCircle1為主類,它存在的意義就在于測(cè)試第二個(gè)類。我們可以把這2個(gè)類放在同一個(gè)文件中,但只有一個(gè)類是公共類,而且文件的名字要與公共類的名字一致。因此這個(gè)文件的名字為TestCircle1.java,因?yàn)門estCircle1是public的。
有很多種方式來(lái)編寫Java程序,例如,我們可以把2個(gè)類寫成一個(gè)類,如下:
再舉一個(gè)例子,電視機(jī)類,每個(gè)電視機(jī)都是一個(gè)對(duì)象包含當(dāng)前頻道,當(dāng)前音量和開關(guān)狀態(tài);還包含一系列行為(變換頻道,調(diào)整音量,進(jìn)行開關(guān)電源)。UML類圖來(lái)表示電視機(jī)類。
8.4 利用構(gòu)造器構(gòu)造對(duì)象
構(gòu)造方法是一類特殊的方法,它有3個(gè)特征: 1.構(gòu)造方法的名字必須與類名一致
2.構(gòu)造方法沒有返回類型,甚至不是void類型。
3.構(gòu)造方法只有在對(duì)象創(chuàng)建的時(shí)候才通過new來(lái)調(diào)用,主要用來(lái)為對(duì)象進(jìn)行初始化。
構(gòu)造方法可以被重載,使得對(duì)象可以以不同的初始數(shù)據(jù)被創(chuàng)建。如下方法不是構(gòu)造方法,因?yàn)橹暗膙oid。
用new來(lái)構(gòu)造一個(gè)類的對(duì)象,方式如下:new ClassName(arguments);例如,new Circle()會(huì)用沒有參數(shù)的構(gòu)造方法來(lái)創(chuàng)建一個(gè)Circle類對(duì)象。而new Circle(25);會(huì)用帶參數(shù)的構(gòu)造方法來(lái)創(chuàng)建一個(gè)Circle類的對(duì)象。一個(gè)類通常會(huì)提供一個(gè)沒有參數(shù)的構(gòu)造方法,因此一個(gè)類可以不定義構(gòu)造方法,也稱默認(rèn)的構(gòu)造方法,也只有當(dāng)系統(tǒng)沒有顯式定義構(gòu)造方法的時(shí)候在自動(dòng)提供。8.5 通過引用變量來(lái)訪問對(duì)象
新創(chuàng)建的對(duì)象被分配了內(nèi)存空間,可以通過變量引用來(lái)進(jìn)行訪問。
8.5.1 引用變量和引用類型
對(duì)象通過對(duì)象引用變量還進(jìn)行訪問,引用變量包含對(duì)這個(gè)對(duì)象的引用,這個(gè)引用變量的聲明如下:
類就是我們程序員定義的數(shù)據(jù)類型,類是引用數(shù)據(jù)類型,這就意味著這個(gè)類類型的變量可以指向這個(gè)類的一個(gè)實(shí)例。如下語(yǔ)句聲明了一個(gè)Circle類型的引用變量myCircle。
Circle myCircle;這個(gè)myCircle就是對(duì)一個(gè)Circle對(duì)象的一個(gè)引用,下面的語(yǔ)句就是創(chuàng)建一個(gè)對(duì)象,并使得這個(gè)引用變量指向這個(gè)對(duì)象。
可以把引用變量的聲明與對(duì)象的創(chuàng)建放在一條語(yǔ)句中:
在Java中,數(shù)組被看做是對(duì)象類,是引用數(shù)據(jù)類型,用new創(chuàng)建,而且也要聲明它的引用變量。
8.5.2 訪問對(duì)象的數(shù)據(jù)和方法
當(dāng)對(duì)象被創(chuàng)建以后,它的數(shù)據(jù)是能夠被訪問的,它的方法也可以通過點(diǎn)操作符進(jìn)行調(diào)用的。這個(gè)點(diǎn)操作符稱為對(duì)象成員訪問符(.)。1.objectRefVar.dataField引用對(duì)象中的數(shù)據(jù)段。2.objectRefVar.method(arguments)調(diào)用對(duì)象的方法。
如之前我們舉例中,myCircle.radius,myCircle.getArea()。數(shù)據(jù)段radius稱實(shí)例變量,因?yàn)樗蕾囉谔囟ǖ膶?shí)例,getArea方法稱實(shí)例方法,因?yàn)橹挥刑囟ǖ膶?shí)例才能調(diào)用它。
注意:我們之前可以使用Math.methodName(arguments);(如Math.pow(3, 2.5))來(lái)調(diào)用Math 類中的方法,那么我們能否用Circle.getArea();來(lái)調(diào)用getArea方法呢?答案是否定的。因?yàn)樵贛ath中所有的方法都是static方法,稱為類方法,靜態(tài)方法,而getArea是實(shí)例方法,必須先實(shí)例化(創(chuàng)建對(duì)象),才能被調(diào)用。
我們可以創(chuàng)建匿名對(duì)象來(lái)調(diào)用實(shí)例方法,即不為對(duì)象創(chuàng)建引用變量,以后也不可能用到這個(gè)對(duì)象,如:
8.5.3 引用數(shù)據(jù)字段和null值
數(shù)據(jù)字段可以是引用類型的,如String,數(shù)組,或其他類類型。如下語(yǔ)句:
如果一個(gè)數(shù)據(jù)字段是引用數(shù)據(jù)類型,它不指向任何對(duì)象,它為一個(gè)代表空引用的Java特殊值null。Null是
一個(gè)常數(shù)就如true和false一樣。一個(gè)引用數(shù)據(jù)類型的默認(rèn)值為null,就如數(shù)值類型數(shù)據(jù)的默認(rèn)值為0一樣。但要注意的是Java不會(huì)為方法內(nèi)的局部變量分配默認(rèn)值。
下面的例子會(huì)編譯出錯(cuò),原因是x和y兩個(gè)變量沒有缺省值(方法中的局部變量,不預(yù)設(shè)缺省值)。
8.5.4 基本數(shù)據(jù)類型變量和引用類型變量的區(qū)別
每個(gè)變量都是一個(gè)存儲(chǔ)空間保存著的數(shù)據(jù)的代表,當(dāng)聲明一個(gè)變量時(shí),就是通知編譯器這個(gè)變量將要保存并代表什么類型的數(shù)據(jù)。對(duì)于基本數(shù)據(jù)類型,就是基本
數(shù)據(jù)類型的數(shù)值;而對(duì)于引用數(shù)據(jù)類型的變量,這個(gè)值是一個(gè)對(duì)它代表對(duì)象的一個(gè)地址引用。如下圖所示區(qū)別。
當(dāng)把一個(gè)變量賦值給另外一個(gè)變量是,另外一個(gè)變量必須是相同類型。對(duì)于基本數(shù)據(jù)類型,一個(gè)變量的實(shí)際
值被分配給另外一個(gè)變量,對(duì)于引用數(shù)據(jù)類型,這個(gè)變量的引用分配給另外一個(gè)變量,如圖。
8.6 使用Java 類庫(kù)
前面定義了Circle1,并為這個(gè)類創(chuàng)建了對(duì)象。我們會(huì)經(jīng)常的Java類庫(kù)中的類來(lái)開發(fā)程序,這節(jié)會(huì)給出幾個(gè)實(shí)用Java類庫(kù)的例子。8.6.1 Data 類
在第二章我們已知可以使用System.currentTimeMillis()獲得當(dāng)前的毫秒數(shù),然后經(jīng)過一系列的計(jì)算最終猜得到當(dāng)前的時(shí)間,日期。Java提供了系統(tǒng)獨(dú)立的,封裝的類Java.util.Date,可以直接獲得當(dāng)前的時(shí)間,如圖。
我們可以使用Date類沒參數(shù)的構(gòu)造方法來(lái)創(chuàng)建當(dāng)前的日期和時(shí)間的實(shí)例,這個(gè)實(shí)例的getTime()方法會(huì)返回一個(gè)從格里尼治標(biāo)準(zhǔn)時(shí)間1970年1月1日0時(shí)到當(dāng)前時(shí)間的毫秒數(shù),它的toString方法會(huì)以字符串的時(shí)間返回日期和時(shí)間,如下代碼:
這個(gè)Date類還有另外一個(gè)構(gòu)造方法Date(long elapseTime),它使用給定的常整型毫秒數(shù)(相對(duì)于格林威治時(shí)間)來(lái)構(gòu)造一個(gè)對(duì)象實(shí)例,8.6.2 Random類
我們之前使用Math.random()方法來(lái)獲得一個(gè)[0-1)隨機(jī)數(shù)。我們也可以通過使用Java.util.Random類來(lái)獲得隨機(jī)數(shù),如下生成各種類型的隨機(jī)數(shù)。
當(dāng)我們創(chuàng)建Random對(duì)象時(shí),我們必須給出一個(gè)特定的種子或使用缺省的種子,無(wú)參數(shù)的構(gòu)造方法用當(dāng)前時(shí)間的毫秒數(shù)創(chuàng)建一個(gè)Random對(duì)象。如果兩個(gè)Random對(duì)象的種子相同,則生成的隨機(jī)數(shù)也是完全一致的。如下程序代碼的兩個(gè)Random對(duì)象都是使用3這個(gè)種子來(lái)創(chuàng)建,他們具有相同的隨機(jī)數(shù)序列。
注意:生成相同序列隨機(jī)數(shù)在軟件測(cè)試等相關(guān)軟件應(yīng)用當(dāng)中非常有用處。8.6.3 顯示GUI組件
Graphical User Interface(GUI)組件是學(xué)習(xí)和教授面向?qū)ο缶幊套钣行У睦印_@節(jié)簡(jiǎn)單介紹一下,在第12章再詳細(xì)講解。
當(dāng)我們開發(fā)圖形用戶程序的時(shí)候,會(huì)用到很多Java類,諸如Jframe,Jbutton,JradioButton,JcomboBox和Jlist等類來(lái)創(chuàng)建框架,按鈕,單選按鈕,復(fù)選框,下拉列表等。如下用Jframe類創(chuàng)建的2個(gè)窗口。
當(dāng)然,我們可以在這些窗口中添加很多圖形用戶組件,如各種按鈕,菜單等,這些組件定義的類如下例所示。
8.7 靜態(tài)變量,常量和方法
通常我們?cè)诔绦蛑卸x的變量,都是實(shí)例變量,這些變量和它對(duì)應(yīng)的類創(chuàng)建的對(duì)象相關(guān)聯(lián)。這些變量不能在同一個(gè)類創(chuàng)建的對(duì)象間共享,如下例。
circle1中的邊界radius和circle2中的radius是不相同的,它們存放在不同的內(nèi)存單元。它們?cè)诟髯詥卧械母淖儾挥绊懥硗庖粋€(gè)。
當(dāng)我們想讓類創(chuàng)建的所有對(duì)象共享數(shù)據(jù),那么這個(gè)數(shù)據(jù)的定義就要用靜態(tài)變量(static variables),也稱類變量(class variables)。類變量的存儲(chǔ)在一個(gè)共享單元,因此每個(gè)對(duì)象中修改了靜態(tài)變量,所有的對(duì)象都會(huì)受到影響。
Java不僅支持靜態(tài)變量,還支持靜態(tài)方法,靜態(tài)方法不需要?jiǎng)?chuàng)建對(duì)象實(shí)例就可以用類名調(diào)用。
我們修改一下Circle類,加入一個(gè)靜態(tài)變量numberOfObjects來(lái)累計(jì)類對(duì)象個(gè)數(shù)。如圖新的Circle類的UML 模型。
如果要定義靜態(tài)變量和方法,在變量或方法創(chuàng)建時(shí)要在之前加上static修飾符,如下定義。
類定義的常量會(huì)被所有的對(duì)象共享,因此常量被聲明為final static,如之前的常量Math.PI的定義。
實(shí)例方法和實(shí)例變量都屬于實(shí)例,只有實(shí)例創(chuàng)建以后才存在。類方法或類變量可以通過它的引用變量即類名直接引用。如下例顯示如何使用實(shí)例變量和類變量,如何使用類方法以及使用后的影響。
當(dāng)編譯TestCircle2.java,Circle2.java如果在上次修改后還沒有編譯,Java編譯器會(huì)自動(dòng)的編譯Circle2.java。靜態(tài)變量和靜態(tài)方法可以在實(shí)例方法和類方法中被使用,但實(shí)例變量和實(shí)例方法不可以被靜態(tài)方法使用,只能在實(shí)例方法中被使用。如下代碼時(shí)錯(cuò)誤的。
設(shè)計(jì)指導(dǎo):當(dāng)我們創(chuàng)建變量或方法是,它應(yīng)該是實(shí)例的還是類的,我們?nèi)绾螞Q定?如果一個(gè)變量或方法是依靠特定實(shí)例的,則應(yīng)該創(chuàng)建實(shí)例變量或方法。如果一個(gè)變量或方法不依賴于類創(chuàng)建的任意對(duì)象實(shí)例,則它應(yīng)該被創(chuàng)建成類變量或方法。在實(shí)踐過程中,經(jīng)常會(huì)犯這類錯(cuò)誤,如下程序。
8.8 可視化修飾符
我們?cè)谇懊娴念?,方法或變量的定義時(shí)都是用了public可視化修飾符,說(shuō)明它可以被任意其他的類讀取,如果沒有任何修飾符稱為默認(rèn)的,則在同一個(gè)包中的其他類可以讀取,稱為包可見,包隱私或包可進(jìn)入。包就是組織各種類的文件夾,如果我們想把某個(gè)類放到特定的包中,則需要在程序的第一句(所有非注釋,非空白語(yǔ)句的第一句)加上: package packageName;如果一個(gè)類在定義時(shí)沒有任何包聲明語(yǔ)句,則會(huì)被存放在默認(rèn)包。Java強(qiáng)烈建議程序員在類前加上包聲明,而不是都放在默認(rèn)包中。但為了方便,簡(jiǎn)單,我們以后講解的程序都放在默認(rèn)包中。
除了public和默認(rèn)修飾符外,還有private和protected兩個(gè)修飾符。我們先介紹private修飾符,在第11章再講解protected修飾符。
Privite修飾符使得方法和變量只能被類內(nèi)的方法使用,或只能它所定義的類中被使用,如下例子。
如果一個(gè)類在定義時(shí)沒有添加任何修飾符,如圖訪問權(quán)限。
可見性修飾符定義了類中的變量和方法是否可被類外的其他類訪問。對(duì)于類內(nèi)的訪問權(quán)限沒有明確要求。如圖所示。
Private修飾符只能修飾類成員(類中定義的變量或方法),public可以修飾一個(gè)類或類中成員。但不能使用public或private來(lái)修飾局部變量,否則會(huì)產(chǎn)生編譯錯(cuò)誤。
在大多數(shù)情況下構(gòu)造方法是public的,但如果你禁止用戶創(chuàng)建類的實(shí)例,這時(shí)候就需要private的構(gòu)造方法。如沒有必要?jiǎng)?chuàng)建Math類的實(shí)例,因?yàn)樗淖兞亢头椒ǘ际莝tatic的,為了阻止用戶創(chuàng)建Math類對(duì)象,構(gòu)造方法的定義為:private Math(){}.8.9 數(shù)據(jù)封裝
在Circle2類中定義的變量radius和numberOfObject可以直接被修改(myCircle.radius=5或Circle2.numberOfObjects=10),這種編程便是不太好,有2個(gè)原因:
1.2.數(shù)據(jù)很容易被篡改,如numberOfObjects是對(duì)對(duì)象的計(jì)數(shù),卻容易被錯(cuò)誤的修改成任意值:Circle2.numberOfObjects=10。類的維護(hù)很困難同時(shí)類很容易被出現(xiàn)各種小錯(cuò)誤,難于調(diào)試。假設(shè)我們?cè)谄渌绦蚴褂昧薈ircle2后,修改這個(gè)類來(lái)保證半徑為非負(fù),則我們不僅要修改這個(gè)類,而且還要修改所有要使用它的程序,因
為使用它的程序之前都可以直接修改半徑(myCircle.radius=-5)。
為了防止對(duì)變量的直接修改訪問,我們應(yīng)該聲明變量為private,這就是對(duì)變量數(shù)據(jù)的封裝。封裝之后外面的類就不能直接訪問變量了,但有時(shí)用戶程序需要得到變量的值,因此定義一個(gè)方法來(lái)返回它的值,稱為get方法getter。為了使得變量的值可以更新,類要提供set方法setter來(lái)設(shè)置新的變量值。Get方法如下形式:
如果返回類型是boolean,get方法應(yīng)該如下定義:
Set方法如下定義形式:
我們新建一個(gè)circle類,定義radius為private,它對(duì)應(yīng)的setter或getter方法如下:
類的代碼如下:
這樣我們就能控制私有變量的訪問和修改,即使以后修改類,也不用修改使用它的程序,使得程序容易維護(hù)。
如下程序使用了Circle類創(chuàng)建的對(duì)象,并修改半徑。
因此numberOfObject就不能惡意被修改了,如不能把它的值設(shè)置為100,除非真的創(chuàng)建100個(gè)對(duì)象才可以。8.10 傳遞對(duì)象參數(shù)
我們可以傳遞一個(gè)對(duì)象給方法,像數(shù)組一樣,傳遞對(duì)象實(shí)際上是傳遞這個(gè)對(duì)象的引用,如下代碼。
如下是具有2個(gè)參數(shù)的方法,用來(lái)對(duì)比對(duì)象傳遞和基本數(shù)據(jù)類型傳遞數(shù)據(jù)的區(qū)別。
8.11 對(duì)象數(shù)組
前面我們學(xué)到的數(shù)組中保存的都是基本數(shù)據(jù)類型或數(shù)組類型,數(shù)組中也可以保存對(duì)象類型,如下例創(chuàng)建了一個(gè)保存10個(gè)Circle類型對(duì)象的數(shù)組。
為了初始化這個(gè)數(shù)組,我們可以使用for循環(huán)。
一個(gè)對(duì)象類型的數(shù)組,實(shí)際上就是一個(gè)引用變量的數(shù)組,如圖,circleArray指向整個(gè)數(shù)組,而circleArray[0]指向一個(gè)Circle對(duì)象。
用new創(chuàng)建完一個(gè)數(shù)組后,數(shù)組中的每個(gè)元素的指向值默認(rèn)我null,直到賦初值才真正指向?qū)ο?。如圖程序使用對(duì)象數(shù)組的例子,程序累計(jì)一系列圓的面積,包含5個(gè)對(duì)象的數(shù)組,隨機(jī)初始化數(shù)組指向的圓對(duì)象半徑,最后顯示面積總和。
第二篇:java面向?qū)ο蟪绦蛟O(shè)計(jì)教案
武漢大學(xué)珞珈學(xué)院 系/教研室 Java 面 向 對(duì) 象 程 序 設(shè) 計(jì) 課 教 案
主講教師:熊春秀 編寫時(shí)間:2011-4-30
第一章:概述
第 1、2 節(jié):面向?qū)ο蟮幕靖拍?、面向?qū)ο蟪绦蛟O(shè)計(jì)概述 授課時(shí)間:2011-2-
22、23
計(jì)劃學(xué)時(shí)數(shù):1 教學(xué)任務(wù)與目的:讓學(xué)生理解面向?qū)ο蟮幕靖拍?教學(xué)重點(diǎn):掌握面向?qū)ο蟮幕靖拍?教學(xué)難點(diǎn):理解面向?qū)ο蟪绦蛟O(shè)計(jì)的方法 教學(xué)方法:多媒體+板書 參考書目:《面向?qū)ο蟪绦蛟O(shè)計(jì)導(dǎo)論》,[美]C.Thomas wu著,電子工業(yè)出版社 專業(yè)詞匯:Java虛擬機(jī)、Applet程序 備注
第二章:Java特點(diǎn)及運(yùn)行環(huán)境
第 1、2、3 節(jié):Java語(yǔ)言特點(diǎn)、Java應(yīng)用程序及運(yùn)行環(huán)境、Java Applet程序及運(yùn)行環(huán)境 授課時(shí)間:2011-2-
22、23
計(jì)劃學(xué)時(shí)數(shù):3 教學(xué)任務(wù)與目的:讓學(xué)生學(xué)會(huì)JDK的下載、安裝與環(huán)境配置。教學(xué)重點(diǎn):掌握編譯和執(zhí)行Java程序的基本步驟
教學(xué)難點(diǎn):理解Java程序的入口并能夠通過命令行傳遞參數(shù) 教學(xué)方法:多媒體+板書 參考書目:《面向?qū)ο蟪绦蛟O(shè)計(jì)導(dǎo)論》,[美]C.Thomas wu著,電子工業(yè)出版社 專業(yè)詞匯:JDK、lib、bin 備注 第三章:Java語(yǔ)言基礎(chǔ)
第 1、2 節(jié):Java程序的構(gòu)成、數(shù)據(jù)類型、表達(dá)式以及流程控制語(yǔ)句 授課時(shí)間:2011-3-
1、2
計(jì)劃學(xué)時(shí)數(shù):3 教學(xué)任務(wù)與目的:讓學(xué)生學(xué)會(huì)Java基本的數(shù)據(jù)類型和表示方法、數(shù)值類型的運(yùn)算、邏輯運(yùn)算和比較、條件執(zhí)行語(yǔ)句(包括三種條件語(yǔ)句和switch語(yǔ)句)、循環(huán)控制語(yǔ)句(包括for、while、do while循環(huán)及相應(yīng)的輔助語(yǔ)句)、字符串類String和BufferString以及數(shù)組的聲明及使用。
教學(xué)重點(diǎn):掌握J(rèn)ava基本的數(shù)據(jù)類型和表示方法
教學(xué)難點(diǎn):理解Java程序的循環(huán)控制語(yǔ)句(包括for、while、do while循環(huán)及相應(yīng)的輔助語(yǔ)句)
教學(xué)方法:多媒體+板書 參考書目:《Java語(yǔ)言與面向?qū)ο蟪绦蛟O(shè)計(jì)》,印旻編著,清華大學(xué)出版社 專業(yè)詞匯:變量、數(shù)據(jù)類型、循環(huán)控制語(yǔ)句 備注 第三章:Java語(yǔ)言基礎(chǔ) 第 3 節(jié):Java與C比較
授課時(shí)間:2011-3-
8、9
計(jì)劃學(xué)時(shí)數(shù):3 教學(xué)任務(wù)與目的:讓學(xué)生在C語(yǔ)言的基本上進(jìn)一步學(xué)習(xí)Java語(yǔ)言。教學(xué)重點(diǎn):掌握J(rèn)ava語(yǔ)言與C語(yǔ)言的區(qū)別與聯(lián)系。教學(xué)難點(diǎn):理解Java語(yǔ)言在C語(yǔ)言上的改進(jìn)。教學(xué)方法:多媒體+板書 參考書目:《Java2參考大全(第四版)》,[美]Herbert Schildt著,張玉清、吳浦峰、尚勇等譯,清華大學(xué)出版社。專業(yè)詞匯:Java、C 備注 第四章:抽象、封裝與類
第 1 節(jié):抽象、封裝與Java類的概念
授課時(shí)間:2011-3-
15、16
計(jì)劃學(xué)時(shí)數(shù):3 教學(xué)任務(wù)與目的:讓學(xué)生學(xué)會(huì)面向?qū)ο蟮幕咎卣?、掌握如何定義一個(gè)類以及如何生成對(duì)象、深入掌握方法的定義及技巧、深入掌握類的訪問權(quán)限與封裝機(jī)制、深入掌握包的定義與包的使用方法。
教學(xué)重點(diǎn):掌握類的定義與對(duì)象的生成。教學(xué)難點(diǎn):理解類的抽象與封裝機(jī)制。教學(xué)方法:多媒體+板書 參考書目:《Java2 實(shí)用教程》,耿祥義、張躍平編著,清華大學(xué)出版社。專業(yè)詞匯:抽象、封裝、類 備注 第四章:抽象、封裝與類 第 2 節(jié):系統(tǒng)定義的類
授課時(shí)間:2011-3-
22、23
計(jì)劃學(xué)時(shí)數(shù):3 教學(xué)任務(wù)與目的:讓學(xué)生學(xué)會(huì)使用系統(tǒng)定義的類,并掌握與用戶自定義類的區(qū)別。教學(xué)重點(diǎn):掌握如何定義所需要的類。
教學(xué)難點(diǎn):熟悉Java平臺(tái)定義了哪些經(jīng)常要用到、而且滿足我們需要的類。教學(xué)方法:多媒體+板書 參考書目:《Java2 實(shí)用教程》,耿祥義、張躍平編著,清華大學(xué)出版社。專業(yè)詞匯:系統(tǒng)定義的類、用戶自定義類 備注 第四章:抽象、封裝與類
第 3 節(jié):類、域和方法的修飾符
授課時(shí)間:2011-3-
29、30
計(jì)劃學(xué)時(shí)數(shù):3 教學(xué)任務(wù)與目的:讓學(xué)生學(xué)會(huì)類的聲明。
教學(xué)重點(diǎn):掌握如何定義類的修飾和方法的修飾符。教學(xué)難點(diǎn):熟悉類的變量的定義與使用方法。教學(xué)方法:多媒體+板書 參考書目:《Java2 實(shí)用教程》,耿祥義、張躍平編著,清華大學(xué)出版社。專業(yè)詞匯:成員變量、類變量、成員方法、類方法 備注 第五章:繼承與多態(tài)
第 1、2 節(jié):Java的繼承與派生、域的繼承與隱藏 授課時(shí)間:2011-4-
5、6
計(jì)劃學(xué)時(shí)數(shù):3 教學(xué)任務(wù)與目的:讓學(xué)生全面掌握面向?qū)ο蟮幕咎卣?、掌握如何使用繼承性來(lái)到達(dá)軟件的重用、深入掌握繼承過程中域的隱藏和方法的覆蓋技巧。教學(xué)重點(diǎn):掌握如何使用繼承性來(lái)到達(dá)軟件的重用。教學(xué)難點(diǎn):熟悉繼承過程中域的隱藏和方法的覆蓋技巧。教學(xué)方法:多媒體+板書 參考書目:《Java2 實(shí)用教程》,耿祥義、張躍平編著,清華大學(xué)出版社。專業(yè)詞匯:繼承派生、域、隱藏 備注 第五章:繼承與多態(tài)
第 3、4 節(jié):方法的繼承、重載與覆蓋、this與super、構(gòu)造函數(shù)的繼承與重載 授課時(shí)間:2011-4-
12、13
計(jì)劃學(xué)時(shí)數(shù):3 教學(xué)任務(wù)與目的:讓學(xué)生通過繼承可以更有效地組織程序結(jié)構(gòu),明確類之間的關(guān)系,并充分利用已有的類來(lái)創(chuàng)建新類,通過繼承可以實(shí)現(xiàn)代碼的重用,以完成更復(fù)雜的設(shè)計(jì)、開發(fā)。教學(xué)重點(diǎn):掌握類的重載與覆蓋的區(qū)別與聯(lián)系。教學(xué)難點(diǎn):熟悉類的重載與覆蓋使用方法。教學(xué)方法:多媒體+板書 參考書目:《Java語(yǔ)言與面向?qū)ο蟪绦蛟O(shè)計(jì)》,印旻編著,清華大學(xué)出版社。專業(yè)詞匯:繼承、重載、覆蓋、this、super 備注 第五章:繼承與多態(tài)
第 5、6 節(jié):多態(tài)性的實(shí)現(xiàn)、接口聲明與實(shí)現(xiàn) 授課時(shí)間:2011-4-
19、20
計(jì)劃學(xué)時(shí)數(shù):3 教學(xué)任務(wù)與目的:讓學(xué)生深入掌握抽象類和抽象方法的定義,掌握多態(tài)通過統(tǒng)一多個(gè)相關(guān)類的對(duì)外接口,在運(yùn)行時(shí)根據(jù)不同的情況執(zhí)行不同的操作,提高類的抽象度和靈活性,深入掌握接口的定義和使用技巧。
教學(xué)重點(diǎn):熟悉多態(tài)性實(shí)現(xiàn)的兩種方式以及接口的實(shí)現(xiàn)。教學(xué)難點(diǎn):熟悉多態(tài)性與接口的實(shí)現(xiàn)方法。教學(xué)方法:多媒體+板書 參考書目:《Java語(yǔ)言與面向?qū)ο蟪绦蛟O(shè)計(jì)》,印旻編著,清華大學(xué)出版社。專業(yè)詞匯:多態(tài)性、接口 備注 第六章:工具類與算法
第 1、2 節(jié):語(yǔ)言基礎(chǔ)類庫(kù)、Applet類與小程序的基本原理 授課時(shí)間:2011-4-
26、27
計(jì)劃學(xué)時(shí)數(shù):3 教學(xué)任務(wù)與目的:深入了解Applet生命周期的主要方法和特點(diǎn)、熟練掌握Applet程序的編寫方法、深入了解Applet的安全機(jī)制及其合理運(yùn)用。教學(xué)重點(diǎn):熟練掌握Applet程序的編寫方法。
教學(xué)難點(diǎn):深入了解Applet的安全機(jī)制及其合理運(yùn)用。教學(xué)方法:多媒體+板書 參考書目:《Java語(yǔ)言與面向?qū)ο蟪绦蛟O(shè)計(jì)》,印旻編著,清華大學(xué)出版社。專業(yè)詞匯:Applet、生命周期 備注 第六章:工具類與算法
第 3、4 節(jié):數(shù)組、字符串、常用算法
授課時(shí)間:2011-5-
3、4
計(jì)劃學(xué)時(shí)數(shù):3 教學(xué)任務(wù)與目的:讓學(xué)生學(xué)會(huì)字符串類String和BufferString、數(shù)組的聲明及使用。教學(xué)重點(diǎn):熟練掌握字符串與數(shù)組的使用方法。教學(xué)難點(diǎn):深入了解數(shù)組的使用方法。教學(xué)方法:多媒體+板書 參考書目:《Java語(yǔ)言與面向?qū)ο蟪绦蛟O(shè)計(jì)》,印旻編著,清華大學(xué)出版社。專業(yè)詞匯:數(shù)組、字符串 備注 第七章:用戶圖形界面的設(shè)計(jì)
第 1、2 節(jié):用戶自定義成分、事件驅(qū)動(dòng)設(shè)計(jì) 授課時(shí)間:2011-5-
10、11
計(jì)劃學(xué)時(shí)數(shù):3 教學(xué)任務(wù)與目的:讓學(xué)生學(xué)會(huì)使用面向?qū)ο蟮某绦蛟O(shè)計(jì)方法構(gòu)建圖形用戶界面、深入了解抽象窗口工具包(AWT)、掌握事件處理基本原理和方法。教學(xué)重點(diǎn):熟練掌握?qǐng)D形用戶界面的開發(fā)方法。教學(xué)難點(diǎn):深入了解圖形界面的各種事件。教學(xué)方法:多媒體+板書 參考書目:《Java語(yǔ)言與面向?qū)ο蟪绦蛟O(shè)計(jì)》,印旻編著,清華大學(xué)出版社。專業(yè)詞匯:AWT、GUI 備注 第七章:用戶圖形界面的設(shè)計(jì)
第 3、4 節(jié):GUI對(duì)象,包括:按鈕、文本框、鼠標(biāo)、鍵盤等事件的處理、布局設(shè)計(jì) 授課時(shí)間:2011-5-
17、18
計(jì)劃學(xué)時(shí)數(shù):3 教學(xué)任務(wù)與目的:讓學(xué)生深入了解GUI構(gòu)件及掌握布局控制方法、熟練掌握菜單和對(duì)話框、掌握簡(jiǎn)單繪圖方法。
教學(xué)重點(diǎn):熟練使用Java語(yǔ)言提供的布局管理器來(lái)管理組件在容器中的布局。教學(xué)難點(diǎn):深入了解組件在程序中安排中位置和大小使用方法。教學(xué)方法:多媒體+板書 參考書目:《Java語(yǔ)言與面向?qū)ο蟪绦蛟O(shè)計(jì)》,印旻編著,清華大學(xué)出版社。專業(yè)詞匯:布局管理器、容器 備注 第八章:Java高級(jí)編程
第 1、2、3節(jié):異常處理、多線程機(jī)制、Java程序?qū)W(wǎng)上資源的訪問 授課時(shí)間:2011-5-
24、25
計(jì)劃學(xué)時(shí)數(shù):3 教學(xué)任務(wù)與目的:讓學(xué)生深入理解多線程的基本概念、熟練掌握創(chuàng)建線程的兩種基本方法、熟練處理線程的同步問題和死鎖問題、深入理解異常的基本概念、熟悉和掌握J(rèn)ava平臺(tái)定義異常類、熟練掌握創(chuàng)建自定義異常類的方法。教學(xué)重點(diǎn):熟練掌握創(chuàng)建線程的兩種基本方法。教學(xué)難點(diǎn):深入了解線程的同步問題和死鎖問題。教學(xué)方法:多媒體+板書 參考書目:《Java語(yǔ)言與面向?qū)ο蟪绦蛟O(shè)計(jì)》,印旻編著,清華大學(xué)出版社。專業(yè)詞匯:同步、死鎖、多線程、異常
第三篇:java面向?qū)ο蟮膶W(xué)習(xí)心得
Java面向?qū)ο蟮膶W(xué)習(xí)心得
大三的時(shí)候?qū)W校組織我們?nèi)ヌK州NIIT參加四個(gè)月的java實(shí)訓(xùn),我開始系統(tǒng)的學(xué)習(xí)期java,之前大學(xué)的時(shí)候?qū)W的比較寬泛,沒有專門的正對(duì)java的學(xué)習(xí)。
首先我是從學(xué)習(xí)Java編程開始接觸OOP(面向?qū)ο缶幊?,剛開始使用Java編寫程序的時(shí)候感覺很別扭,因?yàn)槲以缫粤?xí)慣用C來(lái)編寫程序,很欣賞C的簡(jiǎn)潔性和高效性,喜歡C簡(jiǎn)練而表達(dá)能力豐富的風(fēng)格,特別忍受不了Java運(yùn)行起來(lái)慢吞吞的速度,相對(duì)冗長(zhǎng)的代碼,而且一個(gè)很簡(jiǎn)單的事情,要寫好多類,一個(gè)類調(diào)用一個(gè)類,心里的抵觸情緒很強(qiáng)。
我對(duì)Java的面向?qū)ο蟮奶匦宰聊チ季?,自認(rèn)為有所領(lǐng)悟,也開始有意識(shí)的運(yùn)用OOP風(fēng)格來(lái)寫程序,然而還是經(jīng)常會(huì)覺得不知道應(yīng)該怎樣提煉類,面對(duì)一個(gè)具體的問題的時(shí)候,會(huì)覺得腦子里千頭萬(wàn)緒的,不知道怎么下手,一不小心,又會(huì)回到原來(lái)的思路上去。
舉個(gè)例子,要發(fā)廣告郵件,廣告郵件列表存在數(shù)據(jù)庫(kù)里面。倘若用C來(lái)寫的話,一般會(huì)這樣思考,先把郵件內(nèi)容讀入,然后連接數(shù)據(jù)庫(kù),循環(huán)取郵件地址,調(diào)用本機(jī)的qmail的sendmail命令發(fā)送。
然后考慮用Java來(lái)實(shí)現(xiàn),既然是OOP,就不能什么代碼都塞到main過程里面,于是就設(shè)計(jì)了三個(gè)類:
一個(gè)類是負(fù)責(zé)讀取數(shù)據(jù)庫(kù),取郵件地址,調(diào)用qmail的sendmail命令發(fā)送; 一個(gè)類是讀郵件內(nèi)容,MIME編碼成HTML格式的,再加上郵件頭;
一個(gè)主類負(fù)責(zé)從命令讀參數(shù),處理命令行參數(shù),調(diào)用發(fā)email的類。
把一件工作按照功能劃分為3個(gè)模塊分別處理,每個(gè)類完成一件模塊任務(wù)。
仔細(xì)的分析一下,就會(huì)發(fā)現(xiàn)這樣的設(shè)計(jì)完全是從程序員實(shí)現(xiàn)程序功能的角度來(lái)設(shè)計(jì)的,或者說(shuō),設(shè)計(jì)類的時(shí)候,是自低向上的,從機(jī)器的角度到現(xiàn)實(shí)世界的角度來(lái)分析問題的。因此在設(shè)計(jì)的時(shí)候,就已經(jīng)把程序編程實(shí)現(xiàn)的細(xì)節(jié)都考慮進(jìn)去了,企圖從底層實(shí)現(xiàn)程序這樣的出發(fā)點(diǎn)來(lái)達(dá)到滿足現(xiàn)實(shí)世界的軟件需求的目標(biāo)。
這樣的分析方法其實(shí)是不適用于Java這樣面向?qū)ο蟮木幊陶Z(yǔ)言,因?yàn)椋绻挠肅語(yǔ)言,封裝兩個(gè)C函數(shù),都會(huì)比Java實(shí)現(xiàn)起來(lái)輕松的多,邏輯上也清楚的多。
我覺得面向?qū)ο蟮木柙谟诳紤]問題的思路是從現(xiàn)實(shí)世界的人類思維習(xí)慣出發(fā)的,只要領(lǐng)會(huì)了這一點(diǎn),就領(lǐng)會(huì)了面向?qū)ο蟮乃季S方法。
舉一個(gè)非常簡(jiǎn)單的例子:假使現(xiàn)在需要寫一個(gè)網(wǎng)頁(yè)計(jì)數(shù)器,客戶訪問一次頁(yè)面,網(wǎng)頁(yè)計(jì)數(shù)器加1,計(jì)數(shù)器是這樣來(lái)訪問的后臺(tái)有一個(gè)數(shù)據(jù)庫(kù)表,保存每個(gè)id(一個(gè)id對(duì)應(yīng)一個(gè)被統(tǒng)計(jì)訪問次數(shù)的頁(yè)面)的計(jì)數(shù)器當(dāng)前值,請(qǐng)求頁(yè)面一次,對(duì)應(yīng)id的計(jì)數(shù)器的字段加1(這里我們忽略并發(fā)更新數(shù)據(jù)庫(kù)
表,出現(xiàn)的表鎖定的問題)。
如果按照一般從程序?qū)崿F(xiàn)的角度來(lái)分析,我們會(huì)這樣考慮:首先是從HTTP GET請(qǐng)求取到id,然后按照id查數(shù)據(jù)庫(kù)表,獲得某id對(duì)應(yīng)的訪問計(jì)數(shù)值,然后加1,更新數(shù)據(jù)庫(kù),最后向頁(yè)面顯示訪問計(jì)數(shù)。
現(xiàn)在假設(shè)一個(gè)沒有程序設(shè)計(jì)經(jīng)驗(yàn)的人,他會(huì)怎樣來(lái)思考這個(gè)問題的呢?他會(huì)提出什么樣的需求呢?他很可能會(huì)這樣想:
我需要有一個(gè)計(jì)數(shù)器,這個(gè)計(jì)數(shù)器應(yīng)該有這樣的功能,刷新一次頁(yè)面,訪問量就會(huì)加1,另外最好還有一個(gè)計(jì)數(shù)器清0的功能,當(dāng)然計(jì)數(shù)器如果有一個(gè)可以設(shè)為任意值的功能的話,我就可以作弊了。
做為一個(gè)沒有程序設(shè)計(jì)經(jīng)驗(yàn)的人來(lái)說(shuō),他完全不會(huì)想到對(duì)數(shù)據(jù)庫(kù)應(yīng)該如何操作,對(duì)于HTTP變量該如何傳遞,他考慮問題的角度就是我有什么需求,我的業(yè)務(wù)邏輯是什么,軟件應(yīng)該有什么功能。
按照這樣的思路(請(qǐng)注意,他的思路其實(shí)就是我們平時(shí)在生活中習(xí)慣的思維方式),我們知道需要有一個(gè)計(jì)數(shù)器類 Counter,有一個(gè)必須的和兩個(gè)可選的方法:
getCount()// 取計(jì)數(shù)器值方法
resetCounter()// 計(jì)數(shù)器清0方法
setCount()// 設(shè)計(jì)數(shù)器為相應(yīng)的值方法
把Counter類完整的定義如下:
public class Counter {
public int getCount(int id){}
public void resetCounter(int id){}
public void setCount(int id, int currentCount){}
}
解決問題的框架已經(jīng)有了,來(lái)看一下如何使用Counter。在count.cgi里面調(diào)用Counter來(lái)計(jì)數(shù),程序片斷如下:
// 這里從HTTP環(huán)境里面取id值
...Counter myCounter = new Counter();// 獲得計(jì)數(shù)器
int currentCount = myCounter.getCount(id);// 從計(jì)數(shù)器中取計(jì)數(shù)
// 這里向客戶瀏覽器輸出
...程序的框架全都寫好了,剩下的就是實(shí)現(xiàn)Counter類方法里面具體的代碼了,此時(shí)才去考慮具體的程序語(yǔ)言實(shí)現(xiàn)的細(xì)節(jié),比如,在getCount()方法里面訪問數(shù)據(jù)庫(kù),更新計(jì)數(shù)
值。
從上面的例子中看到,面向?qū)ο蟮乃季S方法其實(shí)就是我們?cè)诂F(xiàn)實(shí)生活中習(xí)慣的思維方式,是從人類考慮問題的角度出發(fā),把人類解決問題的思維方式逐步翻譯成程序能夠理解的思維方式的過程,在這個(gè)翻譯的過程中,軟件也就逐步被設(shè)計(jì)好了。
在運(yùn)用面向?qū)ο蟮乃季S方法進(jìn)行軟件設(shè)計(jì)的過程中,最容易犯的錯(cuò)誤就是開始分析的時(shí)候,就想到了程序代碼實(shí)現(xiàn)的細(xì)節(jié),因此封裝的類完全是基于程序?qū)崿F(xiàn)邏輯,而不是基于解決問題的業(yè)務(wù)邏輯。
學(xué)習(xí)JDBC編程的經(jīng)典錯(cuò)誤問法是:“我怎樣封裝對(duì)數(shù)據(jù)庫(kù)的select操作?”
面向?qū)ο蟮脑O(shè)計(jì)是基于解決業(yè)務(wù)問題的設(shè)計(jì),而不是基于具體編程技術(shù)的設(shè)計(jì)。我不會(huì)去封裝select語(yǔ)句的,我只封裝解決問題的業(yè)務(wù)邏輯,對(duì)數(shù)據(jù)庫(kù)的讀取是在業(yè)務(wù)邏輯的編碼實(shí)現(xiàn)階段才去考慮的問題。
回過頭看上面那個(gè)發(fā)廣告郵件的例子,應(yīng)該如何應(yīng)用面向?qū)ο蟮乃季S方法呢?
對(duì)于一個(gè)郵件來(lái)說(shuō),有郵件頭,郵件體,和郵件地址這三個(gè)屬性,發(fā)送郵件,需要一個(gè)發(fā)送的方法,另外還需要一個(gè)能把所有郵件地址列出來(lái)的方法。所以應(yīng)該如下設(shè)計(jì):
類JunkMail
屬性:
head
body
address
方法:
sendMail()// 發(fā)送郵件
listAllMail()// 列郵件地址
用Java來(lái)表示:
public class JunkMail {
private String head;
private String body;
private String address;
public JunkMain(){ // 默認(rèn)的類構(gòu)造器
// 從外部配置文件讀郵件頭和郵件體
this.head=...;
this.body=...;
}
public static boolean sendMail(String address){
// 調(diào)用qmail,發(fā)送email
}
public static Collection listAllMail(){
// 訪問數(shù)據(jù)庫(kù),返回一個(gè)郵件地址集合}
}
當(dāng)把JunkMail設(shè)計(jì)好了以后,再調(diào)用JunkMail類完成郵件的發(fā)送,將是非常輕松的事情。
如果說(shuō)傳統(tǒng)的面向過程的編程是符合機(jī)器運(yùn)行指令的流程的話,那么面向?qū)ο蟮乃季S方法就是符合現(xiàn)實(shí)生活中人類解決問題的思維過程。
在面向?qū)ο蟮能浖治龊驮O(shè)計(jì)的時(shí)候,要提醒自己,不要一上來(lái)就去想程序代碼的實(shí)現(xiàn),應(yīng)該拋開具體編程語(yǔ)言的束縛,集中精力分析我們要實(shí)現(xiàn)的軟件的業(yè)務(wù)邏輯,分析軟件的業(yè)務(wù)流程,思考應(yīng)該如何去描述和實(shí)現(xiàn)軟件的業(yè)務(wù)。畢竟軟件只是一個(gè)載體,業(yè)務(wù)才是我們真正要實(shí)現(xiàn)的目標(biāo)。
但是在設(shè)計(jì)過程中,心里卻往往在擔(dān)心,如果我完全不去考慮程序代碼的實(shí)現(xiàn)的話,那么我怎么知道我的設(shè)計(jì)一定合理呢?我怎么知道我設(shè)計(jì)的類、接口一定可以實(shí)現(xiàn)呢?所以經(jīng)常可以看到的現(xiàn)象就是:
在設(shè)計(jì)過程中,雖然知道不能過早考慮代碼實(shí)現(xiàn),但是每設(shè)計(jì)一個(gè)類,一個(gè)接口,心里都要不知不覺的用自己熟悉的編程語(yǔ)言大概的評(píng)估一下,看看能否編出來(lái),因此,一不小心,就會(huì)又回到按照程序功能實(shí)現(xiàn)的思路進(jìn)行設(shè)計(jì)的老路上去了。
舉個(gè)例子來(lái)說(shuō)明,在做Web程序設(shè)計(jì)的時(shí)候,經(jīng)常要遇到分頁(yè)顯示數(shù)據(jù)的情況。比如說(shuō)需要把系統(tǒng)中所有的用戶都列出來(lái)這樣的功能。假設(shè)使用User類來(lái)表示用戶,增加用戶addUser(),刪除用戶deleteUser(),查詢所有用戶listUsers()方法。而數(shù)據(jù)庫(kù)中有一個(gè)user表,一條記錄是一個(gè)用戶的信息。下面考慮一下User類的方法的實(shí)現(xiàn):
addUser()和deleteUser()方法都好實(shí)現(xiàn),就是對(duì)數(shù)據(jù)庫(kù)增加記錄和刪除記錄。對(duì)于listUsers()方法,其實(shí)就是對(duì)user表的select,取出一個(gè)記錄集。但是該怎么從listUsers()方法中得到所有用戶的列表呢?
一個(gè)方法調(diào)用的返回值只有一個(gè),沒有多個(gè),所以很多情況下采用的辦法就是返回值定義為集合類型,比如Vector。這樣就可以在listUsers()方法的具體代碼實(shí)現(xiàn)的時(shí)候,從數(shù)據(jù)庫(kù)依次取出一個(gè)個(gè)記錄,插入到Vector里面來(lái)。在主程序里面,調(diào)用listUsers()方法可以返回一個(gè)Vector,然后再對(duì)Vector遍歷操作,就可以得到用戶列表了。
public class User {
public static void addUser(...){
// 數(shù)據(jù)庫(kù)insert一條記錄
}
public static void deleteUser(...){
// 數(shù)據(jù)庫(kù)delete一條記錄
}
public Vector listUsers(...){
// 數(shù)據(jù)庫(kù)select結(jié)果放到一個(gè)集合里面
}
}
這樣的設(shè)計(jì)基本合理,但是仍然有點(diǎn)小問題。因?yàn)樵谠O(shè)計(jì)的時(shí)候,就考慮到了用Java的集合類Vector來(lái)實(shí)現(xiàn)對(duì)不定長(zhǎng)數(shù)據(jù)集的存放,因而違反了面向?qū)ο笤O(shè)計(jì)的一個(gè)原則:在設(shè)計(jì)的時(shí)候不應(yīng)過早的考慮具體程序語(yǔ)言的實(shí)現(xiàn)。所以必須用抽象的方法,和具體實(shí)現(xiàn)無(wú)關(guān)的方法來(lái)表達(dá)業(yè)務(wù)邏輯。
我們知道,通常對(duì)具有集合特征的數(shù)據(jù)結(jié)構(gòu)進(jìn)行遍歷通??梢允褂胣ext和hasNext方法,next實(shí)現(xiàn)取下一個(gè)用戶,hasNext判斷是否還有元素。因此我們定義一個(gè)接口Iterator,這個(gè)接口中定義兩個(gè)方法next和hasNext:
public interface Iterator {
public boolean hasNext(){}
public Object next(){}
}
而User類的listUses方法返回值改為Iterator接口的實(shí)現(xiàn)類:
public class User {
...public Iterator listUsers(){
}
...}
這樣就把User類的設(shè)計(jì)和具體的實(shí)現(xiàn)方法分離開了,因?yàn)榇藭r(shí)任何實(shí)現(xiàn)了next()和hasNext()方法的類都可以做為listUsers的返回值,都可以被用來(lái)表達(dá)“用戶列表”,而不僅僅可以使用Vector而已。比如,我可以用ArrayList來(lái)表達(dá)用戶列表,因?yàn)锳rrayList也實(shí)現(xiàn)了Iterator,當(dāng)然我也可以自己專門寫一個(gè)類來(lái)存放用戶列表,只要實(shí)現(xiàn)next()和hasNext()方法就行了。
這樣在具體的編寫代碼的時(shí)候,程序員具有了最大的靈活性,可以根據(jù)具體的情況,采用不同的編程方法來(lái)存放用戶列表。特別是降低了程序的耦合度,提高了程序的可移植性。對(duì)于上面那個(gè)JunkMail的listAllMail()方法也同樣應(yīng)該改為接口類型。
然后,在主程序里面就這樣來(lái)使用User類的listUsers方法:
User myUser = new User();
Iterator iterator = myUser.listUsers();
while(iterator.hasNext()){
iterator.next();
}
這樣就可以完全不用考慮程序代碼實(shí)現(xiàn)了,從高層次上把功能抽象出來(lái),定義成為接口,同時(shí)又可以把系統(tǒng)設(shè)計(jì)的很合理,完全根據(jù)業(yè)務(wù)的需求來(lái)進(jìn)行設(shè)計(jì)。
結(jié)語(yǔ)
通過上面的幾個(gè)例子的設(shè)計(jì)說(shuō)明,使用面向?qū)ο蟮乃季S方法,其實(shí)是一個(gè)把業(yè)務(wù)邏輯從具體的編程技術(shù)當(dāng)中抽象出來(lái)的過程,而這個(gè)抽象的過程是自上而下的,非常符合人類的思維習(xí)慣,也就是先不考慮問題解決的細(xì)節(jié),把問題的最主要的方面抽象成為一個(gè)簡(jiǎn)單的框架,集中精力思考如何解決主要矛盾,然后在解決問題的過程中,再把問題的細(xì)節(jié)分割成一個(gè)一個(gè)小問題,再專門去解決細(xì)節(jié)問題。
因而一旦牢牢的抓住了這一點(diǎn),你就會(huì)發(fā)現(xiàn)在軟件設(shè)計(jì)和開發(fā)過程中,你自己總是會(huì)不知不覺的運(yùn)用面向?qū)ο蟮乃季S方法來(lái)設(shè)計(jì)和編寫程序,并且程序的設(shè)計(jì)和開發(fā)也變得不再那么枯燥,而一個(gè)合理運(yùn)用面向?qū)ο蠹夹g(shù)進(jìn)行設(shè)計(jì)和架構(gòu)的軟件,更是具備了思維的藝術(shù)美感。
最后,愿面向?qū)ο蟮乃季S方法也能給您的程序設(shè)計(jì)之路帶來(lái)創(chuàng)作的樂趣。
第四篇:Java面向?qū)ο蟪绦蛟O(shè)計(jì)教學(xué)大綱
Java面向?qū)ο蟪绦蛟O(shè)計(jì)課程教學(xué)大綱
Object-Oriented Programming with Java Syllabus
課程名稱 課程類別 建設(shè)單位/教研室 前后課程 適用專業(yè)、層次 Java面向?qū)ο蟪绦蛟O(shè)課程英文名Object-Oriented Programming with Java 計(jì) 稱 專業(yè)必修課 學(xué)分/學(xué)時(shí) 4.0/42+42 計(jì)算機(jī)系/軟件工程教研室 考核方式 考試 C語(yǔ)言程序設(shè)計(jì)
軟件工程、計(jì)算機(jī)科學(xué)與技術(shù)、網(wǎng)絡(luò)工程
Upon completion of this course, students should master the basic knowledge of Java language, understand and grasp the basic object-oriented programming design ideas and skillfully use Java language to write, compile and debug programs.These would lay a good foundation for students on independently finish the work of program development with Java in the future.教學(xué)目的
The emphasis: 1.The origin of Java, Why should we learn Java language, Java cross-platform principle analysis(JVM)and Java Environment variable configuration.2.Data and Expressions: including Character Strings, Variables and Assignment, Primitive Data Types, Expressions, Data Conversion, Interactive Programs.3.Oriented object programming ideas: including Class, Object, Variables, Methods, Encapsulation, Inheritance, Polymorphism, Interface and so on.4.Java statements: including conditionals and loops statements.5.Arrays: Declaring and using one-dimensional arrays and two-dimensional arrays.6.Exceptions: including exception handling, uncaught exceptions, and try-catch statement and so on.7.GUI: including event handling and graphics user interface.The difficulty:
Object-oriented concept and idea, establishing application model and algorithm of description, the algorithm optimization of program and so on.教材和主要參考資料: Text and references Text :
John Lewis “Java程序設(shè)計(jì)教程(第六版)英文版” 電子工業(yè)出版社 ISBN-978-7-121-08808-7 References:
1.《Java編程思想(英文版 第3版)》,(美)Bruce Eckel編,機(jī)械工業(yè)出版社出版社; 2.Java程序設(shè)計(jì)基礎(chǔ)》,(美)Gary J.Bronson編, 趙德奎 林仕平譯,北京大學(xué)出版社。
3.Cay S.Horstmann, Gary Cornell.Java 2核心技術(shù) 卷I:基礎(chǔ)知識(shí).機(jī)械工業(yè)出版社, 2001.4.Cay S.Horstmann, Gary Cornell.Java 2核心技術(shù) 卷II:高級(jí)特性.機(jī)械工業(yè)出版社, 2001.教學(xué)內(nèi)容 學(xué)時(shí) 基本要求
按章、節(jié)具體列出
教學(xué)內(nèi)容 Topic 具體列出教學(xué)的基本要求,如了解、理解、掌握及應(yīng)用等。
By the end of chapter ,students should understand Chapter 1 Introduction
Chapter 2 Data and ExpressionsChapter 3 Using Classes and Objects Chapter 4 Writing Classes 3+3 To be able to have a fundamental understanding of software role in a computer system.? To know components of a computer ? To understand how those components interact ? To grasp how computers store and manipulate information ? To know how computers are connected into networks to share information.? To profile programming and programming languages ? To profile an introduction to Java ? To grasp object-oriented concepts 3+6 Explore some of the basic types of data used in a Java program and the use of expressions to perform calculations.? To understand character strings, concatenation, and escape sequences.? To grasp the declaration and use of variables.? To be familiar with Java primitive data types.? To understand expressions and operator precedence.? To grasp the syntax and processing of expressions.? To understand the types of data conversions and the mechanisms for
accomplishing them.? To know how to create interactive programs.? To understand the basic graphic concepts and the techniques for drawing
shapes.? To know the concept of a Java applet.4+4 Use the predefined classes in the Java class library that are provided to us to make the process of writing programs easier.? To grasp the creation of objects and the use of object reference variables.? To be familiar with the services provided by the String class.? To know how the java standard class library is organized into packages.? To be familiar with the services provided by the Random and Math class.? To grasp ways to format output using the NumberFormat and DecimalFormat
classes.? To be familiar with enumerated types.? To understand wrapper classes and the concept of autoboxing.? To understand components and containers used in graphics user interfaces.? To know a label component and the use of images.6+6 We've been using predefined classes.Now we will learn to write our own classes to define objects.? To grasp the structure and content of a class definition.? To understand the concept of object state using instance data.? To know the effect of visibility modifiers on methods and data.? To grasp the structure of a method definition, including parameters and return
values.? To grasp the structure and purpose of a constructor.? To grasp the creation of graphical objects.? To understand the concepts needed to create an interactive graphical user
interface.Chapter 5 Conditionals and Loops
Chapter 6 OBJECT-ORIENTED DESIGN
Chapter 7 Arrays
Chapter 8 Inheritance ? To know some basic GUI components and events.4+4 Now we will examine programming statements that allow us to make decisions and repeat processing steps in a loop.? To know the flow of control through a method.? To understand Boolean expressions that can be used to make decisions.? To grasp to perform basic decision making using if and switch statements.? To understand issues pertaining to the comparison of certain types of data.? To grasp familiarly to execute statements repetitively using while, do, and for
loops.? To understand the concept of an iterator object and use one to read a text file.? To know how to draw with the aid of conditionals and loops.? To know more GUI components and events.4+4 Now we can extend our discussion of the design of classes and objects ? To know key issues related to the design of object-oriented software.? To techniques for identifying the classes and objects needed in a program.? To understand the relationships among classes.? To understand the effect on the static modifier on methods and data.? To grasp the creation of a formal object interface.? Further grasp the definition of enumerated type classes.? To grasp issues related to the design of methods, including method
overloading.? To know issues related to the design of graphics user interface, including
layout managers.6+3 Arrays are objects that help us organize large amounts of information ? Define and use arrays for basic data organization.? To know bounds checking and techniques for managing capacity.? To learn to compare the issues related to arrays as objects and arrays of
objects.? To grasp the use of command-line arguments.? To grasp the syntax and use of variable-length parameter lists.? To be familiar with the creation and use of multidimensional arrays.? To be familiar with the ArrayList class and its generic parameter.? To know more mouse and keyboard events.6+6 Inheritance is a fundamental object-oriented design technique used to create and organize reusable classes.? To know the derivation of new classes from existing ones.? To understand the concept and purpose of method overriding.? To grasp the design of class hierarchies.? To grasp the issue of visibility as it relates to inheritance.? To have the ability to derive on interface from another.? To grasp object-oriented design in the context of inheritance.? To know the inheritance structure for GUI components.? To explore the creation of listeners by extending adaptor classes.Chapter 9 Polymorphism 3+3 Chapter 10 Exceptions 3+3 有關(guān)說(shuō)明:
擬稿(簽名):謝彥麒 Polymorphism is an object-oriented concept that allows us to create versatile software designs ? To understand polymorphism and explore its benefits.? To understand the concept of dynamic binding.? To grasp to use inheritance relationships to create polymorphic references.? To grasp to use interfaces to create polymorphic references.? To grasp sorting and searching using polymorphic implementations.? To be familiar with object-oriented design in the context of polymorphism.? To know the processing of events as an example of polymorphism.? To know more GUI components.Exception handling is an important aspect of object-oriented design ? To know the purpose of exceptions.? To know exception messages and the call stack trace.?
To be familiar with the usage of the try-catch statement for handling exception.? To understand the concept of exception propagation.?
To be familiar with the exception class hierarchy in the Java standard class library.? To be familiar with I/O exception and the ability to write text files.? To know how to create GUI using mnemonics and tool tips.?
To know additional GUI components and containers.核稿(簽名): 審批(簽名): 年 月 日
第五篇:JAVA面向?qū)ο蟪绦蛟O(shè)計(jì)教學(xué)大綱
《JAVA面向?qū)ο蟪绦蛟O(shè)計(jì)》課程教學(xué)大綱
Oriented object Programming in JAVA 編號(hào): 08065121
適用專業(yè):計(jì)算機(jī)科學(xué)與技術(shù)、網(wǎng)絡(luò)工程 學(xué)時(shí)數(shù):32 學(xué)分?jǐn)?shù):2 執(zhí)筆者:田小玲 編寫日期:2009年11月
一、課程的性質(zhì)和目的
本課程是為計(jì)算機(jī)科學(xué)與技術(shù)以及網(wǎng)絡(luò)工程專業(yè)本科生開設(shè)的專業(yè)選修課,是一門面向?qū)ο蟮木幊陶Z(yǔ)言,通過本課程的學(xué)習(xí),培養(yǎng)和提高學(xué)生面向?qū)ο蟪绦蛟O(shè)計(jì)的能力和Java語(yǔ)言在web開發(fā)中的應(yīng)用能力。
二、課程教學(xué)內(nèi)容
第一章 面向?qū)ο筌浖_發(fā)概述(2學(xué)時(shí))1.內(nèi)容
面向?qū)ο髥栴}求解的提出、面向?qū)ο髥栴}求解的概述、對(duì)象、類與實(shí)體、對(duì)象的屬性與相互關(guān)系、面向?qū)ο蟮能浖_發(fā)過程、面向?qū)ο蟪绦蛟O(shè)計(jì)方法的優(yōu)點(diǎn)、開發(fā)環(huán)境設(shè)置及開發(fā)工具簡(jiǎn)介。
2.要求
(1)了解:面向?qū)ο筌浖_發(fā)概述,面向?qū)ο蟮能浖_發(fā)過程及面向?qū)ο蟪绦蛟O(shè)計(jì) 方法的優(yōu)點(diǎn)。
(2)掌握:對(duì)象的屬性與相互關(guān)系,對(duì)象、類與實(shí)體的基本概念。(3)熟練掌握:開發(fā)環(huán)境設(shè)置及開發(fā)工具簡(jiǎn)介(補(bǔ)充)。3.重點(diǎn)
對(duì)象、類與實(shí)體的基本概念。
4.難點(diǎn)
面向?qū)ο蟪绦蛟O(shè)計(jì)方法的理解。第二章 Java概述(2學(xué)時(shí))1.內(nèi)容
Java語(yǔ)言的特點(diǎn)、Java虛擬機(jī)及垃圾回收機(jī)制、JDK目錄結(jié)構(gòu)、Java 的API結(jié)構(gòu)及Java程序結(jié)構(gòu)、第一個(gè)Java Application程序、第一個(gè)Java Applet程序、圖形界面的輸入輸出、字符界面的輸入輸出。
2.要求
(1)了解:Java語(yǔ)言的發(fā)展歷史及特點(diǎn),Java Application程序及Java Applet程 序,圖形界面的輸入輸出,字符界面的輸入輸出。
(2)掌握:Java語(yǔ)言實(shí)現(xiàn)機(jī)制(補(bǔ)充),Java體系結(jié)構(gòu)(補(bǔ)充)。(3)熟練掌握:Java Application程序的結(jié)構(gòu)。3.重點(diǎn)
Java Application程序的結(jié)構(gòu)。
4.難點(diǎn)
Java語(yǔ)言實(shí)現(xiàn)機(jī)制。
第三章 Java語(yǔ)言基礎(chǔ)(2學(xué)時(shí))1.內(nèi)容
數(shù)據(jù)類型、變量與常量、表達(dá)式、流程控制語(yǔ)句。2.要求
(1)了解:java語(yǔ)言的發(fā)展。
(2)掌握:數(shù)據(jù)類型、變量與常量的定義及使用。(3)熟練掌握:表達(dá)式的使用,流程控制語(yǔ)句。3.重點(diǎn)
表達(dá)式的使用,流程控制語(yǔ)句。
4.難點(diǎn)
流程控制語(yǔ)句的運(yùn)用。
第四章 抽象、封裝與類(6學(xué)時(shí))
1.內(nèi)容
抽象與封裝、Java的類、類的修飾符、域、方法、訪問控制符。2.要求
(1)了解:抽象、封裝概念,系統(tǒng)定義的類。
(2)掌握:類的修飾符(abstract和final),域(包括靜態(tài)域、靜態(tài)初始化器、最終域和易失域),方法(包括抽象方法、靜態(tài)方法、最終方法)。
(3)熟練掌握:用戶程序自定義類及創(chuàng)建對(duì)象與定義構(gòu)造函數(shù),訪問控制符(包括public、缺省訪問控制符、private、protected)的運(yùn)用。
3.重點(diǎn)
自定義類、創(chuàng)建對(duì)象與定義構(gòu)造函數(shù)。
4.難點(diǎn)
四種訪問控制符的運(yùn)用。第五章 繼承與多態(tài)(4學(xué)時(shí))1.內(nèi)容
Java的繼承、多態(tài)、Java的重載、構(gòu)造函數(shù)的繼承與重載、包及接口的概念。2.要求
(1)了解:繼承及多態(tài)的概念,Java接口的概念。(2)掌握:Java的方法重載,包的創(chuàng)建及引用。(3)熟練掌握:構(gòu)造函數(shù)的繼承與重載。
3.重點(diǎn)
方法的重載、類的繼承。4.難點(diǎn)
屬性的隱藏、方法的覆蓋。第六章 工具類與算法(2學(xué)時(shí))
1.內(nèi)容
語(yǔ)言基礎(chǔ)類庫(kù)(包括Object類、數(shù)據(jù)類型類、Math類及System類)、Applet類與Applet小程序、數(shù)組。
2.要求
(1)了解:Applet類與Applet小程序。(2)掌握:Java語(yǔ)言基礎(chǔ)類庫(kù)。(3)熟練掌握:數(shù)組的聲明及初始化。3.重點(diǎn)
數(shù)組的聲明及初始化、數(shù)組的應(yīng)用。4.難點(diǎn)
編寫Applet小程序。
第七章 圖形用戶界面的設(shè)計(jì)與實(shí)現(xiàn)(8學(xué)時(shí))
1.內(nèi)容
圖形用戶界面概述、GUI標(biāo)準(zhǔn)組件概述及布局設(shè)計(jì)、Java的事件處理機(jī)制。2.要求
(1)了解:圖形界面組件之間的層次關(guān)系、容器的概念和作用。(2)掌握:圖形用戶界面程序的基本結(jié)構(gòu)。(3)熟練掌握:事件監(jiān)聽機(jī)制。3.重點(diǎn)
圖形用戶界面程序的基本結(jié)構(gòu)。4.難點(diǎn)
Java的事件處理機(jī)制。
第八章 Java高級(jí)編程(6學(xué)時(shí))
1.內(nèi)容
異常處理、Java多線程機(jī)制、Swing GUI 組件、流式輸入輸出與文件處理、用Java實(shí)現(xiàn)底層網(wǎng)絡(luò)通信、Java程序?qū)W(wǎng)上資源的訪問。
2.要求
(1)了解:例外的概念、Java中線程的基本概念、Java的線程類與Runnable接口及如何在程序中實(shí)現(xiàn)多線程、Java輸入輸出類庫(kù)及文件的處理與隨機(jī)訪問、使用Java實(shí)現(xiàn)底層網(wǎng)絡(luò)通信、Java程序?qū)W(wǎng)上資源的訪問。
3(2)掌握:例外處理機(jī)制。
(3)熟練掌握:Swing GUI組件的運(yùn)用。3.重點(diǎn)
例外處理機(jī)制、Swing GUI組件的創(chuàng)建。
4.難點(diǎn)
自定義異常類。
三、課程教學(xué)的基本要求
課程教學(xué)的基本要求包含三項(xiàng):上機(jī)環(huán)節(jié)、作業(yè)要求、考試方式。1.上機(jī)環(huán)節(jié)
根據(jù)課堂講授的理論,并結(jié)合上機(jī)操作讓學(xué)生及時(shí)掌握每章節(jié)所學(xué)的知識(shí),通過實(shí)操可加深學(xué)生對(duì)面向?qū)ο蟪绦蛟O(shè)計(jì)的思想及Java程序設(shè)計(jì)的領(lǐng)會(huì)。
2.作業(yè)要求
(1)作業(yè)要求:獨(dú)立思考完成、書寫工整、按時(shí)交(2)作業(yè)量:每次課均布置作業(yè),作業(yè)量約2~3題(3)總作業(yè)量:約30~40道題 3.考試方式
(1)考試方式:閉卷筆試(2)評(píng)定成績(jī)要求:
總成績(jī)=平時(shí)成績(jī)×30%+考試成績(jī)×70%
四、本課程與其它課程的聯(lián)系與分工
1.前期課程:
程序設(shè)計(jì)基礎(chǔ)、計(jì)算機(jī)網(wǎng)絡(luò)、C語(yǔ)言程序設(shè)計(jì)、C++程序設(shè)計(jì) 2.后續(xù)課程:
軟件工程、Web應(yīng)用程序開發(fā)
五、建議教材與教學(xué)參考書
[1] 印旻.《Java語(yǔ)言與面向?qū)ο蟪绦蛟O(shè)計(jì)》,清華大學(xué)出版社 [2] 於東軍,楊靜宇.《Java程序設(shè)計(jì)與應(yīng)用開發(fā)》,清華大學(xué)出版社 [3] 辛運(yùn)幃.《Java程序設(shè)計(jì)》,清華大學(xué)出版社 [4] 姜?jiǎng)?《Java語(yǔ)言程序設(shè)計(jì)》,人民郵電出版社 [5] 閻菲.《Java程序設(shè)計(jì)教程》,中國(guó)水利水電出版社