第一篇:Java 教案-第08章 對象和類
第8章 對象和類
8.1 介紹(Introduction)
雖然我們已經學過了Java基礎知識,如選擇,循環,方法和數組,但這些Java的特征對于我們開發圖形用戶接口和大規模的軟件系統還遠遠不夠。假設我們想開發如圖所示的GUI(goo-ee),我們如何編寫?
從這章開始我們開始介紹面向對象編程,方便我們開發Gui和大規范軟件系統。8.2 定義類為Object類型
面向對象編程(Object-Oriented Programming OOP)就是利用對象進行編寫。對象object代表現實世界中獨一無二的一個實體。如,一個學生,一張桌子,一個按鈕,甚至一個貸款都可以被看著是對象。一個對象有它自己獨有的特征,狀態和行為。
1.2.對象的狀態(也稱屬性或特征)用包含當時數據的數據字段來表示。如一個圓對象,有半徑這個數據字段,它就是圓的特征和屬性。一個矩形有高和寬兩個特征,作為矩形對象的2個字段。對象的行為(也稱動作或操作)通過方法定義。對象調用方法就是高手這個對象要執行一個動作。
如可以為圓對象定義一個getArea()方法,那么圓對象調用getArea()方法來返回圓的面積。
我們可以用一個普通的類來定義一個同類型的對象。一個類就是一個模板,一個藍圖或合同,它們定義一個對象的數據字段和方法。對象就是這個類的實例。我們可以為類創建若干個對象,創建對象就是所謂的實例化。對象和實例經常相互交叉。類和對象的關系就像是一個蘋果派和一個蘋果派配方一樣。我們可以利用配方制作很多蘋果派,每個蘋果派都不完全一樣,有各自的作用。如圖顯示了一個Circle類和它的三個對象。
一個Java類用變量來定義數據字段,用方法來定義操作或動作。類提供一種非常特別類型的方法,稱之為構造方法,也稱構造器,這個構造方法的調用會創建一個新對象。雖然一個構造方法可以執行任何動作,但構造方法的設計是用來為對象的數據字段和方法進行初始化的,如下圓類的定義。
Circle類和我們之前見過的類都不同,它沒有main方法,也不能被運行,它僅僅是定義了一個圓對象類。包含main方法的類,為了方便,以后我們稱為主類。類和對象用UML符號描述如下。
8.3 定義類和創建對象
程序創建3個圓對象,半徑分別為1.0,2.5,125,顯示每一個圓對象的半徑和面積,改變第二個圓的半徑,并顯示新面積和半徑。
程序包含2個類,第一個類為TestCircle1為主類,它存在的意義就在于測試第二個類。我們可以把這2個類放在同一個文件中,但只有一個類是公共類,而且文件的名字要與公共類的名字一致。因此這個文件的名字為TestCircle1.java,因為TestCircle1是public的。
有很多種方式來編寫Java程序,例如,我們可以把2個類寫成一個類,如下:
再舉一個例子,電視機類,每個電視機都是一個對象包含當前頻道,當前音量和開關狀態;還包含一系列行為(變換頻道,調整音量,進行開關電源)。UML類圖來表示電視機類。
8.4 利用構造器構造對象
構造方法是一類特殊的方法,它有3個特征: 1.構造方法的名字必須與類名一致
2.構造方法沒有返回類型,甚至不是void類型。
3.構造方法只有在對象創建的時候才通過new來調用,主要用來為對象進行初始化。
構造方法可以被重載,使得對象可以以不同的初始數據被創建。如下方法不是構造方法,因為之前的void。
用new來構造一個類的對象,方式如下:new ClassName(arguments);例如,new Circle()會用沒有參數的構造方法來創建一個Circle類對象。而new Circle(25);會用帶參數的構造方法來創建一個Circle類的對象。一個類通常會提供一個沒有參數的構造方法,因此一個類可以不定義構造方法,也稱默認的構造方法,也只有當系統沒有顯式定義構造方法的時候在自動提供。8.5 通過引用變量來訪問對象
新創建的對象被分配了內存空間,可以通過變量引用來進行訪問。
8.5.1 引用變量和引用類型
對象通過對象引用變量還進行訪問,引用變量包含對這個對象的引用,這個引用變量的聲明如下:
類就是我們程序員定義的數據類型,類是引用數據類型,這就意味著這個類類型的變量可以指向這個類的一個實例。如下語句聲明了一個Circle類型的引用變量myCircle。
Circle myCircle;這個myCircle就是對一個Circle對象的一個引用,下面的語句就是創建一個對象,并使得這個引用變量指向這個對象。
可以把引用變量的聲明與對象的創建放在一條語句中:
在Java中,數組被看做是對象類,是引用數據類型,用new創建,而且也要聲明它的引用變量。
8.5.2 訪問對象的數據和方法
當對象被創建以后,它的數據是能夠被訪問的,它的方法也可以通過點操作符進行調用的。這個點操作符稱為對象成員訪問符(.)。1.objectRefVar.dataField引用對象中的數據段。2.objectRefVar.method(arguments)調用對象的方法。
如之前我們舉例中,myCircle.radius,myCircle.getArea()。數據段radius稱實例變量,因為它依賴于特定的實例,getArea方法稱實例方法,因為只有特定的實例才能調用它。
注意:我們之前可以使用Math.methodName(arguments);(如Math.pow(3, 2.5))來調用Math 類中的方法,那么我們能否用Circle.getArea();來調用getArea方法呢?答案是否定的。因為在Math中所有的方法都是static方法,稱為類方法,靜態方法,而getArea是實例方法,必須先實例化(創建對象),才能被調用。
我們可以創建匿名對象來調用實例方法,即不為對象創建引用變量,以后也不可能用到這個對象,如:
8.5.3 引用數據字段和null值
數據字段可以是引用類型的,如String,數組,或其他類類型。如下語句:
如果一個數據字段是引用數據類型,它不指向任何對象,它為一個代表空引用的Java特殊值null。Null是
一個常數就如true和false一樣。一個引用數據類型的默認值為null,就如數值類型數據的默認值為0一樣。但要注意的是Java不會為方法內的局部變量分配默認值。
下面的例子會編譯出錯,原因是x和y兩個變量沒有缺省值(方法中的局部變量,不預設缺省值)。
8.5.4 基本數據類型變量和引用類型變量的區別
每個變量都是一個存儲空間保存著的數據的代表,當聲明一個變量時,就是通知編譯器這個變量將要保存并代表什么類型的數據。對于基本數據類型,就是基本
數據類型的數值;而對于引用數據類型的變量,這個值是一個對它代表對象的一個地址引用。如下圖所示區別。
當把一個變量賦值給另外一個變量是,另外一個變量必須是相同類型。對于基本數據類型,一個變量的實際
值被分配給另外一個變量,對于引用數據類型,這個變量的引用分配給另外一個變量,如圖。
8.6 使用Java 類庫
前面定義了Circle1,并為這個類創建了對象。我們會經常的Java類庫中的類來開發程序,這節會給出幾個實用Java類庫的例子。8.6.1 Data 類
在第二章我們已知可以使用System.currentTimeMillis()獲得當前的毫秒數,然后經過一系列的計算最終猜得到當前的時間,日期。Java提供了系統獨立的,封裝的類Java.util.Date,可以直接獲得當前的時間,如圖。
我們可以使用Date類沒參數的構造方法來創建當前的日期和時間的實例,這個實例的getTime()方法會返回一個從格里尼治標準時間1970年1月1日0時到當前時間的毫秒數,它的toString方法會以字符串的時間返回日期和時間,如下代碼:
這個Date類還有另外一個構造方法Date(long elapseTime),它使用給定的常整型毫秒數(相對于格林威治時間)來構造一個對象實例,8.6.2 Random類
我們之前使用Math.random()方法來獲得一個[0-1)隨機數。我們也可以通過使用Java.util.Random類來獲得隨機數,如下生成各種類型的隨機數。
當我們創建Random對象時,我們必須給出一個特定的種子或使用缺省的種子,無參數的構造方法用當前時間的毫秒數創建一個Random對象。如果兩個Random對象的種子相同,則生成的隨機數也是完全一致的。如下程序代碼的兩個Random對象都是使用3這個種子來創建,他們具有相同的隨機數序列。
注意:生成相同序列隨機數在軟件測試等相關軟件應用當中非常有用處。8.6.3 顯示GUI組件
Graphical User Interface(GUI)組件是學習和教授面向對象編程最有效的例子。這節簡單介紹一下,在第12章再詳細講解。
當我們開發圖形用戶程序的時候,會用到很多Java類,諸如Jframe,Jbutton,JradioButton,JcomboBox和Jlist等類來創建框架,按鈕,單選按鈕,復選框,下拉列表等。如下用Jframe類創建的2個窗口。
當然,我們可以在這些窗口中添加很多圖形用戶組件,如各種按鈕,菜單等,這些組件定義的類如下例所示。
8.7 靜態變量,常量和方法
通常我們在程序中定義的變量,都是實例變量,這些變量和它對應的類創建的對象相關聯。這些變量不能在同一個類創建的對象間共享,如下例。
circle1中的邊界radius和circle2中的radius是不相同的,它們存放在不同的內存單元。它們在各自單元中的改變不影響另外一個。
當我們想讓類創建的所有對象共享數據,那么這個數據的定義就要用靜態變量(static variables),也稱類變量(class variables)。類變量的存儲在一個共享單元,因此每個對象中修改了靜態變量,所有的對象都會受到影響。
Java不僅支持靜態變量,還支持靜態方法,靜態方法不需要創建對象實例就可以用類名調用。
我們修改一下Circle類,加入一個靜態變量numberOfObjects來累計類對象個數。如圖新的Circle類的UML 模型。
如果要定義靜態變量和方法,在變量或方法創建時要在之前加上static修飾符,如下定義。
類定義的常量會被所有的對象共享,因此常量被聲明為final static,如之前的常量Math.PI的定義。
實例方法和實例變量都屬于實例,只有實例創建以后才存在。類方法或類變量可以通過它的引用變量即類名直接引用。如下例顯示如何使用實例變量和類變量,如何使用類方法以及使用后的影響。
當編譯TestCircle2.java,Circle2.java如果在上次修改后還沒有編譯,Java編譯器會自動的編譯Circle2.java。靜態變量和靜態方法可以在實例方法和類方法中被使用,但實例變量和實例方法不可以被靜態方法使用,只能在實例方法中被使用。如下代碼時錯誤的。
設計指導:當我們創建變量或方法是,它應該是實例的還是類的,我們如何決定?如果一個變量或方法是依靠特定實例的,則應該創建實例變量或方法。如果一個變量或方法不依賴于類創建的任意對象實例,則它應該被創建成類變量或方法。在實踐過程中,經常會犯這類錯誤,如下程序。
8.8 可視化修飾符
我們在前面的類,方法或變量的定義時都是用了public可視化修飾符,說明它可以被任意其他的類讀取,如果沒有任何修飾符稱為默認的,則在同一個包中的其他類可以讀取,稱為包可見,包隱私或包可進入。包就是組織各種類的文件夾,如果我們想把某個類放到特定的包中,則需要在程序的第一句(所有非注釋,非空白語句的第一句)加上: package packageName;如果一個類在定義時沒有任何包聲明語句,則會被存放在默認包。Java強烈建議程序員在類前加上包聲明,而不是都放在默認包中。但為了方便,簡單,我們以后講解的程序都放在默認包中。
除了public和默認修飾符外,還有private和protected兩個修飾符。我們先介紹private修飾符,在第11章再講解protected修飾符。
Privite修飾符使得方法和變量只能被類內的方法使用,或只能它所定義的類中被使用,如下例子。
如果一個類在定義時沒有添加任何修飾符,如圖訪問權限。
可見性修飾符定義了類中的變量和方法是否可被類外的其他類訪問。對于類內的訪問權限沒有明確要求。如圖所示。
Private修飾符只能修飾類成員(類中定義的變量或方法),public可以修飾一個類或類中成員。但不能使用public或private來修飾局部變量,否則會產生編譯錯誤。
在大多數情況下構造方法是public的,但如果你禁止用戶創建類的實例,這時候就需要private的構造方法。如沒有必要創建Math類的實例,因為它的變量和方法都是static的,為了阻止用戶創建Math類對象,構造方法的定義為:private Math(){}.8.9 數據封裝
在Circle2類中定義的變量radius和numberOfObject可以直接被修改(myCircle.radius=5或Circle2.numberOfObjects=10),這種編程便是不太好,有2個原因:
1.2.數據很容易被篡改,如numberOfObjects是對對象的計數,卻容易被錯誤的修改成任意值:Circle2.numberOfObjects=10。類的維護很困難同時類很容易被出現各種小錯誤,難于調試。假設我們在其他程序使用了Circle2后,修改這個類來保證半徑為非負,則我們不僅要修改這個類,而且還要修改所有要使用它的程序,因
為使用它的程序之前都可以直接修改半徑(myCircle.radius=-5)。
為了防止對變量的直接修改訪問,我們應該聲明變量為private,這就是對變量數據的封裝。封裝之后外面的類就不能直接訪問變量了,但有時用戶程序需要得到變量的值,因此定義一個方法來返回它的值,稱為get方法getter。為了使得變量的值可以更新,類要提供set方法setter來設置新的變量值。Get方法如下形式:
如果返回類型是boolean,get方法應該如下定義:
Set方法如下定義形式:
我們新建一個circle類,定義radius為private,它對應的setter或getter方法如下:
類的代碼如下:
這樣我們就能控制私有變量的訪問和修改,即使以后修改類,也不用修改使用它的程序,使得程序容易維護。
如下程序使用了Circle類創建的對象,并修改半徑。
因此numberOfObject就不能惡意被修改了,如不能把它的值設置為100,除非真的創建100個對象才可以。8.10 傳遞對象參數
我們可以傳遞一個對象給方法,像數組一樣,傳遞對象實際上是傳遞這個對象的引用,如下代碼。
如下是具有2個參數的方法,用來對比對象傳遞和基本數據類型傳遞數據的區別。
8.11 對象數組
前面我們學到的數組中保存的都是基本數據類型或數組類型,數組中也可以保存對象類型,如下例創建了一個保存10個Circle類型對象的數組。
為了初始化這個數組,我們可以使用for循環。
一個對象類型的數組,實際上就是一個引用變量的數組,如圖,circleArray指向整個數組,而circleArray[0]指向一個Circle對象。
用new創建完一個數組后,數組中的每個元素的指向值默認我null,直到賦初值才真正指向對象。如圖程序使用對象數組的例子,程序累計一系列圓的面積,包含5個對象的數組,隨機初始化數組指向的圓對象半徑,最后顯示面積總和。
第二篇:java面向對象程序設計教案
武漢大學珞珈學院 系/教研室 Java 面 向 對 象 程 序 設 計 課 教 案
主講教師:熊春秀 編寫時間:2011-4-30
第一章:概述
第 1、2 節:面向對象的基本概念、面向對象程序設計概述 授課時間:2011-2-
22、23
計劃學時數:1 教學任務與目的:讓學生理解面向對象的基本概念 教學重點:掌握面向對象的基本概念 教學難點:理解面向對象程序設計的方法 教學方法:多媒體+板書 參考書目:《面向對象程序設計導論》,[美]C.Thomas wu著,電子工業出版社 專業詞匯:Java虛擬機、Applet程序 備注
第二章:Java特點及運行環境
第 1、2、3 節:Java語言特點、Java應用程序及運行環境、Java Applet程序及運行環境 授課時間:2011-2-
22、23
計劃學時數:3 教學任務與目的:讓學生學會JDK的下載、安裝與環境配置。教學重點:掌握編譯和執行Java程序的基本步驟
教學難點:理解Java程序的入口并能夠通過命令行傳遞參數 教學方法:多媒體+板書 參考書目:《面向對象程序設計導論》,[美]C.Thomas wu著,電子工業出版社 專業詞匯:JDK、lib、bin 備注 第三章:Java語言基礎
第 1、2 節:Java程序的構成、數據類型、表達式以及流程控制語句 授課時間:2011-3-
1、2
計劃學時數:3 教學任務與目的:讓學生學會Java基本的數據類型和表示方法、數值類型的運算、邏輯運算和比較、條件執行語句(包括三種條件語句和switch語句)、循環控制語句(包括for、while、do while循環及相應的輔助語句)、字符串類String和BufferString以及數組的聲明及使用。
教學重點:掌握Java基本的數據類型和表示方法
教學難點:理解Java程序的循環控制語句(包括for、while、do while循環及相應的輔助語句)
教學方法:多媒體+板書 參考書目:《Java語言與面向對象程序設計》,印旻編著,清華大學出版社 專業詞匯:變量、數據類型、循環控制語句 備注 第三章:Java語言基礎 第 3 節:Java與C比較
授課時間:2011-3-
8、9
計劃學時數:3 教學任務與目的:讓學生在C語言的基本上進一步學習Java語言。教學重點:掌握Java語言與C語言的區別與聯系。教學難點:理解Java語言在C語言上的改進。教學方法:多媒體+板書 參考書目:《Java2參考大全(第四版)》,[美]Herbert Schildt著,張玉清、吳浦峰、尚勇等譯,清華大學出版社。專業詞匯:Java、C 備注 第四章:抽象、封裝與類
第 1 節:抽象、封裝與Java類的概念
授課時間:2011-3-
15、16
計劃學時數:3 教學任務與目的:讓學生學會面向對象的基本特征、掌握如何定義一個類以及如何生成對象、深入掌握方法的定義及技巧、深入掌握類的訪問權限與封裝機制、深入掌握包的定義與包的使用方法。
教學重點:掌握類的定義與對象的生成。教學難點:理解類的抽象與封裝機制。教學方法:多媒體+板書 參考書目:《Java2 實用教程》,耿祥義、張躍平編著,清華大學出版社。專業詞匯:抽象、封裝、類 備注 第四章:抽象、封裝與類 第 2 節:系統定義的類
授課時間:2011-3-
22、23
計劃學時數:3 教學任務與目的:讓學生學會使用系統定義的類,并掌握與用戶自定義類的區別。教學重點:掌握如何定義所需要的類。
教學難點:熟悉Java平臺定義了哪些經常要用到、而且滿足我們需要的類。教學方法:多媒體+板書 參考書目:《Java2 實用教程》,耿祥義、張躍平編著,清華大學出版社。專業詞匯:系統定義的類、用戶自定義類 備注 第四章:抽象、封裝與類
第 3 節:類、域和方法的修飾符
授課時間:2011-3-
29、30
計劃學時數:3 教學任務與目的:讓學生學會類的聲明。
教學重點:掌握如何定義類的修飾和方法的修飾符。教學難點:熟悉類的變量的定義與使用方法。教學方法:多媒體+板書 參考書目:《Java2 實用教程》,耿祥義、張躍平編著,清華大學出版社。專業詞匯:成員變量、類變量、成員方法、類方法 備注 第五章:繼承與多態
第 1、2 節:Java的繼承與派生、域的繼承與隱藏 授課時間:2011-4-
5、6
計劃學時數:3 教學任務與目的:讓學生全面掌握面向對象的基本特征、掌握如何使用繼承性來到達軟件的重用、深入掌握繼承過程中域的隱藏和方法的覆蓋技巧。教學重點:掌握如何使用繼承性來到達軟件的重用。教學難點:熟悉繼承過程中域的隱藏和方法的覆蓋技巧。教學方法:多媒體+板書 參考書目:《Java2 實用教程》,耿祥義、張躍平編著,清華大學出版社。專業詞匯:繼承派生、域、隱藏 備注 第五章:繼承與多態
第 3、4 節:方法的繼承、重載與覆蓋、this與super、構造函數的繼承與重載 授課時間:2011-4-
12、13
計劃學時數:3 教學任務與目的:讓學生通過繼承可以更有效地組織程序結構,明確類之間的關系,并充分利用已有的類來創建新類,通過繼承可以實現代碼的重用,以完成更復雜的設計、開發。教學重點:掌握類的重載與覆蓋的區別與聯系。教學難點:熟悉類的重載與覆蓋使用方法。教學方法:多媒體+板書 參考書目:《Java語言與面向對象程序設計》,印旻編著,清華大學出版社。專業詞匯:繼承、重載、覆蓋、this、super 備注 第五章:繼承與多態
第 5、6 節:多態性的實現、接口聲明與實現 授課時間:2011-4-
19、20
計劃學時數:3 教學任務與目的:讓學生深入掌握抽象類和抽象方法的定義,掌握多態通過統一多個相關類的對外接口,在運行時根據不同的情況執行不同的操作,提高類的抽象度和靈活性,深入掌握接口的定義和使用技巧。
教學重點:熟悉多態性實現的兩種方式以及接口的實現。教學難點:熟悉多態性與接口的實現方法。教學方法:多媒體+板書 參考書目:《Java語言與面向對象程序設計》,印旻編著,清華大學出版社。專業詞匯:多態性、接口 備注 第六章:工具類與算法
第 1、2 節:語言基礎類庫、Applet類與小程序的基本原理 授課時間:2011-4-
26、27
計劃學時數:3 教學任務與目的:深入了解Applet生命周期的主要方法和特點、熟練掌握Applet程序的編寫方法、深入了解Applet的安全機制及其合理運用。教學重點:熟練掌握Applet程序的編寫方法。
教學難點:深入了解Applet的安全機制及其合理運用。教學方法:多媒體+板書 參考書目:《Java語言與面向對象程序設計》,印旻編著,清華大學出版社。專業詞匯:Applet、生命周期 備注 第六章:工具類與算法
第 3、4 節:數組、字符串、常用算法
授課時間:2011-5-
3、4
計劃學時數:3 教學任務與目的:讓學生學會字符串類String和BufferString、數組的聲明及使用。教學重點:熟練掌握字符串與數組的使用方法。教學難點:深入了解數組的使用方法。教學方法:多媒體+板書 參考書目:《Java語言與面向對象程序設計》,印旻編著,清華大學出版社。專業詞匯:數組、字符串 備注 第七章:用戶圖形界面的設計
第 1、2 節:用戶自定義成分、事件驅動設計 授課時間:2011-5-
10、11
計劃學時數:3 教學任務與目的:讓學生學會使用面向對象的程序設計方法構建圖形用戶界面、深入了解抽象窗口工具包(AWT)、掌握事件處理基本原理和方法。教學重點:熟練掌握圖形用戶界面的開發方法。教學難點:深入了解圖形界面的各種事件。教學方法:多媒體+板書 參考書目:《Java語言與面向對象程序設計》,印旻編著,清華大學出版社。專業詞匯:AWT、GUI 備注 第七章:用戶圖形界面的設計
第 3、4 節:GUI對象,包括:按鈕、文本框、鼠標、鍵盤等事件的處理、布局設計 授課時間:2011-5-
17、18
計劃學時數:3 教學任務與目的:讓學生深入了解GUI構件及掌握布局控制方法、熟練掌握菜單和對話框、掌握簡單繪圖方法。
教學重點:熟練使用Java語言提供的布局管理器來管理組件在容器中的布局。教學難點:深入了解組件在程序中安排中位置和大小使用方法。教學方法:多媒體+板書 參考書目:《Java語言與面向對象程序設計》,印旻編著,清華大學出版社。專業詞匯:布局管理器、容器 備注 第八章:Java高級編程
第 1、2、3節:異常處理、多線程機制、Java程序對網上資源的訪問 授課時間:2011-5-
24、25
計劃學時數:3 教學任務與目的:讓學生深入理解多線程的基本概念、熟練掌握創建線程的兩種基本方法、熟練處理線程的同步問題和死鎖問題、深入理解異常的基本概念、熟悉和掌握Java平臺定義異常類、熟練掌握創建自定義異常類的方法。教學重點:熟練掌握創建線程的兩種基本方法。教學難點:深入了解線程的同步問題和死鎖問題。教學方法:多媒體+板書 參考書目:《Java語言與面向對象程序設計》,印旻編著,清華大學出版社。專業詞匯:同步、死鎖、多線程、異常
第三篇:java面向對象的學習心得
Java面向對象的學習心得
大三的時候學校組織我們去蘇州NIIT參加四個月的java實訓,我開始系統的學習期java,之前大學的時候學的比較寬泛,沒有專門的正對java的學習。
首先我是從學習Java編程開始接觸OOP(面向對象編程),剛開始使用Java編寫程序的時候感覺很別扭,因為我早以習慣用C來編寫程序,很欣賞C的簡潔性和高效性,喜歡C簡練而表達能力豐富的風格,特別忍受不了Java運行起來慢吞吞的速度,相對冗長的代碼,而且一個很簡單的事情,要寫好多類,一個類調用一個類,心里的抵觸情緒很強。
我對Java的面向對象的特性琢磨良久,自認為有所領悟,也開始有意識的運用OOP風格來寫程序,然而還是經常會覺得不知道應該怎樣提煉類,面對一個具體的問題的時候,會覺得腦子里千頭萬緒的,不知道怎么下手,一不小心,又會回到原來的思路上去。
舉個例子,要發廣告郵件,廣告郵件列表存在數據庫里面。倘若用C來寫的話,一般會這樣思考,先把郵件內容讀入,然后連接數據庫,循環取郵件地址,調用本機的qmail的sendmail命令發送。
然后考慮用Java來實現,既然是OOP,就不能什么代碼都塞到main過程里面,于是就設計了三個類:
一個類是負責讀取數據庫,取郵件地址,調用qmail的sendmail命令發送; 一個類是讀郵件內容,MIME編碼成HTML格式的,再加上郵件頭;
一個主類負責從命令讀參數,處理命令行參數,調用發email的類。
把一件工作按照功能劃分為3個模塊分別處理,每個類完成一件模塊任務。
仔細的分析一下,就會發現這樣的設計完全是從程序員實現程序功能的角度來設計的,或者說,設計類的時候,是自低向上的,從機器的角度到現實世界的角度來分析問題的。因此在設計的時候,就已經把程序編程實現的細節都考慮進去了,企圖從底層實現程序這樣的出發點來達到滿足現實世界的軟件需求的目標。
這樣的分析方法其實是不適用于Java這樣面向對象的編程語言,因為,如果改用C語言,封裝兩個C函數,都會比Java實現起來輕松的多,邏輯上也清楚的多。
我覺得面向對象的精髓在于考慮問題的思路是從現實世界的人類思維習慣出發的,只要領會了這一點,就領會了面向對象的思維方法。
舉一個非常簡單的例子:假使現在需要寫一個網頁計數器,客戶訪問一次頁面,網頁計數器加1,計數器是這樣來訪問的后臺有一個數據庫表,保存每個id(一個id對應一個被統計訪問次數的頁面)的計數器當前值,請求頁面一次,對應id的計數器的字段加1(這里我們忽略并發更新數據庫
表,出現的表鎖定的問題)。
如果按照一般從程序實現的角度來分析,我們會這樣考慮:首先是從HTTP GET請求取到id,然后按照id查數據庫表,獲得某id對應的訪問計數值,然后加1,更新數據庫,最后向頁面顯示訪問計數。
現在假設一個沒有程序設計經驗的人,他會怎樣來思考這個問題的呢?他會提出什么樣的需求呢?他很可能會這樣想:
我需要有一個計數器,這個計數器應該有這樣的功能,刷新一次頁面,訪問量就會加1,另外最好還有一個計數器清0的功能,當然計數器如果有一個可以設為任意值的功能的話,我就可以作弊了。
做為一個沒有程序設計經驗的人來說,他完全不會想到對數據庫應該如何操作,對于HTTP變量該如何傳遞,他考慮問題的角度就是我有什么需求,我的業務邏輯是什么,軟件應該有什么功能。
按照這樣的思路(請注意,他的思路其實就是我們平時在生活中習慣的思維方式),我們知道需要有一個計數器類 Counter,有一個必須的和兩個可選的方法:
getCount()// 取計數器值方法
resetCounter()// 計數器清0方法
setCount()// 設計數器為相應的值方法
把Counter類完整的定義如下:
public class Counter {
public int getCount(int id){}
public void resetCounter(int id){}
public void setCount(int id, int currentCount){}
}
解決問題的框架已經有了,來看一下如何使用Counter。在count.cgi里面調用Counter來計數,程序片斷如下:
// 這里從HTTP環境里面取id值
...Counter myCounter = new Counter();// 獲得計數器
int currentCount = myCounter.getCount(id);// 從計數器中取計數
// 這里向客戶瀏覽器輸出
...程序的框架全都寫好了,剩下的就是實現Counter類方法里面具體的代碼了,此時才去考慮具體的程序語言實現的細節,比如,在getCount()方法里面訪問數據庫,更新計數
值。
從上面的例子中看到,面向對象的思維方法其實就是我們在現實生活中習慣的思維方式,是從人類考慮問題的角度出發,把人類解決問題的思維方式逐步翻譯成程序能夠理解的思維方式的過程,在這個翻譯的過程中,軟件也就逐步被設計好了。
在運用面向對象的思維方法進行軟件設計的過程中,最容易犯的錯誤就是開始分析的時候,就想到了程序代碼實現的細節,因此封裝的類完全是基于程序實現邏輯,而不是基于解決問題的業務邏輯。
學習JDBC編程的經典錯誤問法是:“我怎樣封裝對數據庫的select操作?”
面向對象的設計是基于解決業務問題的設計,而不是基于具體編程技術的設計。我不會去封裝select語句的,我只封裝解決問題的業務邏輯,對數據庫的讀取是在業務邏輯的編碼實現階段才去考慮的問題。
回過頭看上面那個發廣告郵件的例子,應該如何應用面向對象的思維方法呢?
對于一個郵件來說,有郵件頭,郵件體,和郵件地址這三個屬性,發送郵件,需要一個發送的方法,另外還需要一個能把所有郵件地址列出來的方法。所以應該如下設計:
類JunkMail
屬性:
head
body
address
方法:
sendMail()// 發送郵件
listAllMail()// 列郵件地址
用Java來表示:
public class JunkMail {
private String head;
private String body;
private String address;
public JunkMain(){ // 默認的類構造器
// 從外部配置文件讀郵件頭和郵件體
this.head=...;
this.body=...;
}
public static boolean sendMail(String address){
// 調用qmail,發送email
}
public static Collection listAllMail(){
// 訪問數據庫,返回一個郵件地址集合}
}
當把JunkMail設計好了以后,再調用JunkMail類完成郵件的發送,將是非常輕松的事情。
如果說傳統的面向過程的編程是符合機器運行指令的流程的話,那么面向對象的思維方法就是符合現實生活中人類解決問題的思維過程。
在面向對象的軟件分析和設計的時候,要提醒自己,不要一上來就去想程序代碼的實現,應該拋開具體編程語言的束縛,集中精力分析我們要實現的軟件的業務邏輯,分析軟件的業務流程,思考應該如何去描述和實現軟件的業務。畢竟軟件只是一個載體,業務才是我們真正要實現的目標。
但是在設計過程中,心里卻往往在擔心,如果我完全不去考慮程序代碼的實現的話,那么我怎么知道我的設計一定合理呢?我怎么知道我設計的類、接口一定可以實現呢?所以經??梢钥吹降默F象就是:
在設計過程中,雖然知道不能過早考慮代碼實現,但是每設計一個類,一個接口,心里都要不知不覺的用自己熟悉的編程語言大概的評估一下,看看能否編出來,因此,一不小心,就會又回到按照程序功能實現的思路進行設計的老路上去了。
舉個例子來說明,在做Web程序設計的時候,經常要遇到分頁顯示數據的情況。比如說需要把系統中所有的用戶都列出來這樣的功能。假設使用User類來表示用戶,增加用戶addUser(),刪除用戶deleteUser(),查詢所有用戶listUsers()方法。而數據庫中有一個user表,一條記錄是一個用戶的信息。下面考慮一下User類的方法的實現:
addUser()和deleteUser()方法都好實現,就是對數據庫增加記錄和刪除記錄。對于listUsers()方法,其實就是對user表的select,取出一個記錄集。但是該怎么從listUsers()方法中得到所有用戶的列表呢?
一個方法調用的返回值只有一個,沒有多個,所以很多情況下采用的辦法就是返回值定義為集合類型,比如Vector。這樣就可以在listUsers()方法的具體代碼實現的時候,從數據庫依次取出一個個記錄,插入到Vector里面來。在主程序里面,調用listUsers()方法可以返回一個Vector,然后再對Vector遍歷操作,就可以得到用戶列表了。
public class User {
public static void addUser(...){
// 數據庫insert一條記錄
}
public static void deleteUser(...){
// 數據庫delete一條記錄
}
public Vector listUsers(...){
// 數據庫select結果放到一個集合里面
}
}
這樣的設計基本合理,但是仍然有點小問題。因為在設計的時候,就考慮到了用Java的集合類Vector來實現對不定長數據集的存放,因而違反了面向對象設計的一個原則:在設計的時候不應過早的考慮具體程序語言的實現。所以必須用抽象的方法,和具體實現無關的方法來表達業務邏輯。
我們知道,通常對具有集合特征的數據結構進行遍歷通??梢允褂胣ext和hasNext方法,next實現取下一個用戶,hasNext判斷是否還有元素。因此我們定義一個接口Iterator,這個接口中定義兩個方法next和hasNext:
public interface Iterator {
public boolean hasNext(){}
public Object next(){}
}
而User類的listUses方法返回值改為Iterator接口的實現類:
public class User {
...public Iterator listUsers(){
}
...}
這樣就把User類的設計和具體的實現方法分離開了,因為此時任何實現了next()和hasNext()方法的類都可以做為listUsers的返回值,都可以被用來表達“用戶列表”,而不僅僅可以使用Vector而已。比如,我可以用ArrayList來表達用戶列表,因為ArrayList也實現了Iterator,當然我也可以自己專門寫一個類來存放用戶列表,只要實現next()和hasNext()方法就行了。
這樣在具體的編寫代碼的時候,程序員具有了最大的靈活性,可以根據具體的情況,采用不同的編程方法來存放用戶列表。特別是降低了程序的耦合度,提高了程序的可移植性。對于上面那個JunkMail的listAllMail()方法也同樣應該改為接口類型。
然后,在主程序里面就這樣來使用User類的listUsers方法:
User myUser = new User();
Iterator iterator = myUser.listUsers();
while(iterator.hasNext()){
iterator.next();
}
這樣就可以完全不用考慮程序代碼實現了,從高層次上把功能抽象出來,定義成為接口,同時又可以把系統設計的很合理,完全根據業務的需求來進行設計。
結語
通過上面的幾個例子的設計說明,使用面向對象的思維方法,其實是一個把業務邏輯從具體的編程技術當中抽象出來的過程,而這個抽象的過程是自上而下的,非常符合人類的思維習慣,也就是先不考慮問題解決的細節,把問題的最主要的方面抽象成為一個簡單的框架,集中精力思考如何解決主要矛盾,然后在解決問題的過程中,再把問題的細節分割成一個一個小問題,再專門去解決細節問題。
因而一旦牢牢的抓住了這一點,你就會發現在軟件設計和開發過程中,你自己總是會不知不覺的運用面向對象的思維方法來設計和編寫程序,并且程序的設計和開發也變得不再那么枯燥,而一個合理運用面向對象技術進行設計和架構的軟件,更是具備了思維的藝術美感。
最后,愿面向對象的思維方法也能給您的程序設計之路帶來創作的樂趣。
第四篇:Java面向對象程序設計教學大綱
Java面向對象程序設計課程教學大綱
Object-Oriented Programming with Java Syllabus
課程名稱 課程類別 建設單位/教研室 前后課程 適用專業、層次 Java面向對象程序設課程英文名Object-Oriented Programming with Java 計 稱 專業必修課 學分/學時 4.0/42+42 計算機系/軟件工程教研室 考核方式 考試 C語言程序設計
軟件工程、計算機科學與技術、網絡工程
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.教學目的
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程序設計教程(第六版)英文版” 電子工業出版社 ISBN-978-7-121-08808-7 References:
1.《Java編程思想(英文版 第3版)》,(美)Bruce Eckel編,機械工業出版社出版社; 2.Java程序設計基礎》,(美)Gary J.Bronson編, 趙德奎 林仕平譯,北京大學出版社。
3.Cay S.Horstmann, Gary Cornell.Java 2核心技術 卷I:基礎知識.機械工業出版社, 2001.4.Cay S.Horstmann, Gary Cornell.Java 2核心技術 卷II:高級特性.機械工業出版社, 2001.教學內容 學時 基本要求
按章、節具體列出
教學內容 Topic 具體列出教學的基本要求,如了解、理解、掌握及應用等。
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 有關說明:
擬稿(簽名):謝彥麒 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面向對象程序設計教學大綱
《JAVA面向對象程序設計》課程教學大綱
Oriented object Programming in JAVA 編號: 08065121
適用專業:計算機科學與技術、網絡工程 學時數:32 學分數:2 執筆者:田小玲 編寫日期:2009年11月
一、課程的性質和目的
本課程是為計算機科學與技術以及網絡工程專業本科生開設的專業選修課,是一門面向對象的編程語言,通過本課程的學習,培養和提高學生面向對象程序設計的能力和Java語言在web開發中的應用能力。
二、課程教學內容
第一章 面向對象軟件開發概述(2學時)1.內容
面向對象問題求解的提出、面向對象問題求解的概述、對象、類與實體、對象的屬性與相互關系、面向對象的軟件開發過程、面向對象程序設計方法的優點、開發環境設置及開發工具簡介。
2.要求
(1)了解:面向對象軟件開發概述,面向對象的軟件開發過程及面向對象程序設計 方法的優點。
(2)掌握:對象的屬性與相互關系,對象、類與實體的基本概念。(3)熟練掌握:開發環境設置及開發工具簡介(補充)。3.重點
對象、類與實體的基本概念。
4.難點
面向對象程序設計方法的理解。第二章 Java概述(2學時)1.內容
Java語言的特點、Java虛擬機及垃圾回收機制、JDK目錄結構、Java 的API結構及Java程序結構、第一個Java Application程序、第一個Java Applet程序、圖形界面的輸入輸出、字符界面的輸入輸出。
2.要求
(1)了解:Java語言的發展歷史及特點,Java Application程序及Java Applet程 序,圖形界面的輸入輸出,字符界面的輸入輸出。
(2)掌握:Java語言實現機制(補充),Java體系結構(補充)。(3)熟練掌握:Java Application程序的結構。3.重點
Java Application程序的結構。
4.難點
Java語言實現機制。
第三章 Java語言基礎(2學時)1.內容
數據類型、變量與常量、表達式、流程控制語句。2.要求
(1)了解:java語言的發展。
(2)掌握:數據類型、變量與常量的定義及使用。(3)熟練掌握:表達式的使用,流程控制語句。3.重點
表達式的使用,流程控制語句。
4.難點
流程控制語句的運用。
第四章 抽象、封裝與類(6學時)
1.內容
抽象與封裝、Java的類、類的修飾符、域、方法、訪問控制符。2.要求
(1)了解:抽象、封裝概念,系統定義的類。
(2)掌握:類的修飾符(abstract和final),域(包括靜態域、靜態初始化器、最終域和易失域),方法(包括抽象方法、靜態方法、最終方法)。
(3)熟練掌握:用戶程序自定義類及創建對象與定義構造函數,訪問控制符(包括public、缺省訪問控制符、private、protected)的運用。
3.重點
自定義類、創建對象與定義構造函數。
4.難點
四種訪問控制符的運用。第五章 繼承與多態(4學時)1.內容
Java的繼承、多態、Java的重載、構造函數的繼承與重載、包及接口的概念。2.要求
(1)了解:繼承及多態的概念,Java接口的概念。(2)掌握:Java的方法重載,包的創建及引用。(3)熟練掌握:構造函數的繼承與重載。
3.重點
方法的重載、類的繼承。4.難點
屬性的隱藏、方法的覆蓋。第六章 工具類與算法(2學時)
1.內容
語言基礎類庫(包括Object類、數據類型類、Math類及System類)、Applet類與Applet小程序、數組。
2.要求
(1)了解:Applet類與Applet小程序。(2)掌握:Java語言基礎類庫。(3)熟練掌握:數組的聲明及初始化。3.重點
數組的聲明及初始化、數組的應用。4.難點
編寫Applet小程序。
第七章 圖形用戶界面的設計與實現(8學時)
1.內容
圖形用戶界面概述、GUI標準組件概述及布局設計、Java的事件處理機制。2.要求
(1)了解:圖形界面組件之間的層次關系、容器的概念和作用。(2)掌握:圖形用戶界面程序的基本結構。(3)熟練掌握:事件監聽機制。3.重點
圖形用戶界面程序的基本結構。4.難點
Java的事件處理機制。
第八章 Java高級編程(6學時)
1.內容
異常處理、Java多線程機制、Swing GUI 組件、流式輸入輸出與文件處理、用Java實現底層網絡通信、Java程序對網上資源的訪問。
2.要求
(1)了解:例外的概念、Java中線程的基本概念、Java的線程類與Runnable接口及如何在程序中實現多線程、Java輸入輸出類庫及文件的處理與隨機訪問、使用Java實現底層網絡通信、Java程序對網上資源的訪問。
3(2)掌握:例外處理機制。
(3)熟練掌握:Swing GUI組件的運用。3.重點
例外處理機制、Swing GUI組件的創建。
4.難點
自定義異常類。
三、課程教學的基本要求
課程教學的基本要求包含三項:上機環節、作業要求、考試方式。1.上機環節
根據課堂講授的理論,并結合上機操作讓學生及時掌握每章節所學的知識,通過實操可加深學生對面向對象程序設計的思想及Java程序設計的領會。
2.作業要求
(1)作業要求:獨立思考完成、書寫工整、按時交(2)作業量:每次課均布置作業,作業量約2~3題(3)總作業量:約30~40道題 3.考試方式
(1)考試方式:閉卷筆試(2)評定成績要求:
總成績=平時成績×30%+考試成績×70%
四、本課程與其它課程的聯系與分工
1.前期課程:
程序設計基礎、計算機網絡、C語言程序設計、C++程序設計 2.后續課程:
軟件工程、Web應用程序開發
五、建議教材與教學參考書
[1] 印旻.《Java語言與面向對象程序設計》,清華大學出版社 [2] 於東軍,楊靜宇.《Java程序設計與應用開發》,清華大學出版社 [3] 辛運幃.《Java程序設計》,清華大學出版社 [4] 姜剛.《Java語言程序設計》,人民郵電出版社 [5] 閻菲.《Java程序設計教程》,中國水利水電出版社