




版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領
文檔簡介
學生類5.1項目任務5.2項目解析5.3技術準備5.4項目學做5.5強化訓練5.6習題
單元概述
本單元以項目為向導,介紹Java語言中關于類的語法規則。在本單元中,讀者應該理解面向對象的程序設計思想,掌握類的設計、對象的創建、類的封裝、構造方法的定義及其重載、this和static關鍵字的使用。
目的與要求
·
了解面向對象程序設計的概念和思想
·
掌握類的定義、理解類和對象的關系
·
理解封裝的概念及意義
·
掌握創建和使用對象的方法
·
理解并掌握構造方法的定義和作用
·
理解方法重載的概念及其使用規則
·
掌握this和static關鍵字的用法
重點與難點
·
類的定義
·
對象的創建和使用
·
類的封裝
·
構造方法的定義和重載的規則
·
this和static關鍵字的使用。
5.1項目任務
采用面向對象設計的思想聲明一個描述學生成績管理系統特征的學生類,通過該學生類能夠最終實現學生的成績管理功能。
5.2項目解析
根據項目任務描述的項目功能需求,本項目需要定義一個學生類,具體包含如下內容:該類中定義表示學生信息的屬性;定義學生類的構造方法,用以給學生信息賦值;定義實現設置和獲取學生信息的方法(訪問器)。
定義一個學生類要解決如下問題:
(1)如何使用Java語言定義一個學生類?屬性和方法的定義格式是什么?
(2)什么是構造方法?如何使用構造方法為學生信息屬性賦值?
(3)如何聲明并實例化學生類對象?如何通過學生類的對象調用屬性和方法?
5.3技術準備
現實生活中存在各種形態不同的事物,如桌子、筆記本、花、草、樹木,乃至我們自己都是具體的事物,這些事物之間存在著各種各樣的聯系。在程序中使用對象來映射現實中的事物,使用對象的關系來描述事物之間的聯系,這就是面向對象的思想。
面向對象的編程思想力圖在程序中對事物的描述與該事物在現實中的形態保持一致。為了做到這一點,面向對象的編程思想提出了類和對象兩個概念。類是對某一類事物的抽象描述,而對象用于表示現實中該類事物的個體。
在面向對象的思想中最核心的就是對象,為了在程序中創建對象,首先需要定義一個類。類是對象的抽象,它用于描述一組對象的共同特征和行為。
5.3.1類的定義
(1)示例代碼。
例5-1
定義Teacher類。
(2)代碼分析。
類中可以定義成員變量和成員方法,如例5-1的Teacher類中定義了兩個成員變量:String類型的name和int類型的age,其中成員變量用于描述對象的特征,也被稱為屬性。Teacher類中定義了一個返回值為void的teach()方法,稱為成員方法,成員方法用于描述對象的行為,可簡稱方法。
(3)知識點。
類定義的格式:
[修飾符]class類名{
[修飾符]類屬性定義
[修飾符]類方法定義
}
注意:在Java中定義在類體內、方法外的變量稱為成員變量,也稱為類的屬性。定義在方法中的變量稱為局部變量。如果在某一個方法中定義的局部變量和成員變量同名,這種情況是允許的,此時方法中通過變量名訪問到的變量是局部變量而非成員變量。
5.3.2對象的創建與使用
應用程序想要完成具體的功能,僅有類是遠遠不夠的,還需要根據類創建實例對象。
(1)示例代碼。
例5-2
Eg5_1.java。
運行結果如圖5-1所示。
圖5-1例5-2運行結果
(2)代碼分析。
其中,“newTeacher()”用于創建Teacher類的一個實例對象;“Teachert”則是聲明了一個Teacher類型的變量t(對象);中間的等號用于將Teacher對象在內存中的地址賦值給變量t,這樣變量t便持有了對象的引用。在內存中,變量t和對象之間的引用關系如圖5-2所示。
圖5-2內存分析
例5-2中,t1、t2分別引用了Teacher類的兩個實例對象,從運行結果圖5-1可以看出,t1和t2對象在調用teach()方法時,輸出的name值完全不同,這是因為t1和t2對象是兩個獨立的個體,它們分別擁有各自的name屬性,對t1對象的name屬性賦值并不會影響到t2對象name屬性的值。
(3)知識點。
在Java程序中可以使用new關鍵字來創建對象,具體格式如下:
類名對象名稱=new類名();
如例5-2所示“Teachert1=newTeacher();”。
創建Teacher對象后,可以通過對象的引用來訪問對象所有的成員,具體格式如下:
對象引用.對象成員
如例5-2所示“="Lucy";”。
注意:在例5-2中,通過“="Lucy";”將t1對象的name屬性值賦值為“Lucy”,但并沒有對t2對象的name屬性進行賦值,也就是說t2對象的name屬性值應該沒有值。但是從運行結果可以看出,t2對象的name屬性也是有值的,其值為null。這是因為當一個對象被創建時,Java虛擬機會對其中各種類型的成員變量自動進行初始化賦值?;緮祿愋统跏蓟禐?,引用數據類型初始化值為null,具體如表5-1所示。
5.3.3構造方法
從前面所學到的知識可以發現,實例化一個類的對象后,如果要為這個對象中的屬性賦值,就必須要通過直接訪問對象的屬性或調用setXXX()方法的方式來實現。如果需要在實例化對象的同時就為這個對象的屬性進行賦值,可以通過構造方法來實現。構造方法是類的一個特殊的方法,它會在類的實例化對象時被自動調用。
(1)示例代碼。
例5-3
Eg5_2.java。
運行結果如圖5-3所示。
圖5-3例5-3運行結果
(2)代碼分析。
在例5-3的Student類中定義了一個無參的構造方法Student()。從運行結果可以看出,Student類中無參的構造方法被調用了。這是因為“Studentstul=newStudent()”這句代碼在實例化Student對象時會自動調用類的構造方法,“newStudent()”語句的作用除了會實例化Student對象外,還會調用構造方法Student()。
在一個類中除了定義無參的構造方法,還可以定義有參的構造方法,通過有參的構造方法就可以實現對屬性的賦值。接下來對例5-3進行改寫,改寫后的代碼如例5-4所示。
例5-4
Eg5_3.java。
運行結果如圖5-4所示。
圖5-4例5-4運行結果
例5-4的Student類中定義了有參的構造方法Student(Strings)。“Students=newStudent("1001")”代碼中的“newStudent("1001")”會在實例化對象的同時調用有參的構造方法,并傳入參數“1001”。在構造方法Student(Strings)中將“1001”賦值給對象的num屬性。通過運行結果可以看出,Student對象在調用info()方法時,其num屬性已經被賦值為“1001”。
(3)知識點。
在一個類中定義的方法如果同時滿足以下三個條件,該方法稱為構造方法。
①函數的名稱與類相同。
②沒有返回值類型聲明。
③不能在方法中使用return語句返回一個值。
構造方法定義的語法格式如下:
[訪問控制修飾符]類名([形參列表]){
方法體;
}
注意:沒有返回值類型聲明不等同于“void”。void也是一種返回值類型聲明,那就是沒有返回值。
5.3.4構造方法的重載
在一個類中可以定義多個構造方法,只要每個構造方法的參數列表(參數類型、參數個數和參數順序)不同即可。在創建對象時,可以通過調用不同的構造方法為不同的屬性賦值。接下來通過一個案例來學習構造方法的重載。
(1)示例代碼。
例5-5
Eg5-4.java。
運行結果如圖5-5所示。
圖5-5例5-5運行結果
(2)代碼分析。
例5-5的Student類中定義了三個構造方法,它們構成了方法的重載。在創建s1、s2和s3對象時,根據傳入參數的不同,分別調用不同的構造方法。從程序的運行結果可以看出,三個構造方法對屬性賦值的情況是不一樣的,其中帶一個參數的構造方法只針對num屬性進行賦值,這時name屬性的值默認為null,age屬性的值為默認值0。
(3)知識點。
在一個類中可以定義多個構造方法,這些方法的參數列表有所不同,形成方法的重載。
注意:每一個類都至少有一個構造方法,如果在定義類時,沒有顯式地聲明任何構造方法,系統會自動為這個類創建一個無參的構造方法,里面沒有任何代碼。
在定義構造方法時,如果沒有特殊需要,都應該使用public關鍵字修飾。
5.3.5this關鍵字
在例5-5中使用變量表示年齡時,構造方法中使用的是cage,成員變量使用的是age。這樣的程序可讀性很差,這時需要將一個類中表示年齡的變量進行統一的命名,例如都聲明為age。但是這樣做又會導致成員變量和局部變量的名稱沖突,在方法中將無法訪問成員變量age。為了解決這個問題,Java提供了一個關鍵字this,用于在方法中訪問對象的其他成員。
1.用this關鍵字訪問成員屬性
(1)示例代碼。
例5-6
修改例5-5中的形參名稱,讓其與成員變量同名。
(2)代碼分析。
①通過this關鍵字可以明確地去訪問一個類的成員變量,解決與局部變量名稱沖突問題。
在上面的代碼中,構造方法的參數被定義為num、name、age,它是一個局部變量,在類中還定義了同名的成員變量是num、name、age。在構造方法中如果使用num、name、age,則是訪問局部變量,但如果使用this.num、、this.age,則是訪問成員變量。
②通過this關鍵字調用成員方法,具體示例代碼如下:
2.用this調用成員屬性和方法
(1)示例代碼。
例5-7
Eg5_5.java。
運行結果如圖5-6所示。
圖5-6例5-7運行結果
(2)代碼分析。
構造方法是在實例化對象時被Java虛擬機自動調用的,在程序中不能像調用其他方法一樣去調用構造方法,但可以在一個構造方法中使用“this([參數1,參數2……])”的形式來調用其他的構造方法。
例5-7中“Students=newStudent("張三")”代碼在實例化Student對象時調用了有參的構造方法,在該方法中通過this()方法調用了無參的構造方法,因此運行結果中顯示兩個構造方法都被調用了。
(3)知識點。
①只能在構造方法中使用this調用其他的構造方法,不能在成員方法中使用。
②在構造方法中,使用this調用構造方法的語句必須位于第一行,且只能出現一次。
③不能在一個類的兩個構造方法中使用this互相調用。
5.3.6static關鍵字
在Java中定義了一個static關鍵字,它用于修飾類的成員,如成員變量、成員方法以及代碼塊等。被static修飾的成員具備一些特殊性,接下來將對這些特殊性進行逐一講解。
1.靜態變量
(1)示例代碼。
例5-8
Eg5_6.java。
運行結果如圖5-7所示。
圖5-7例5-8運行結果
(2)代碼分析。
在定義一個類時,只是在描述某類事物的特征和行為,并沒有產生具體的數據。只有通過new關鍵字創建該類的實例對象后,系統才會為每個對象分配空間并存儲各自的數據。有時候,我們希望某些特定的數據在內存中只有一份,而且能夠被一個類的所有實例對象所共享。例如,某個學校的某個專業的所有學生共享同一個系部名稱,此時完全不必在每個學生對象所占用的內存空間中都定義一個變量來表示系部的名稱,而可以在對象以外的空間定義一個表示系部名稱的變量讓所有對象來共享。
Student類中定義了一個靜態變量DName,用于表示學生所在的系部名稱,它被所有的實例所共享。由于DName是靜態變量,因此可以直接使用Student.DName的方式進行調用,也可以通過Student的實例對象進行調用,如“Student.DName="計算機";”代碼將變量DName賦值為“計算機”,通過運行結果可以看出學生對象stu1和stu2的DName屬性均為“計算機”。
(3)知識點。
在一個java類中,可以使用static關鍵字來修飾成員變量,該變量被稱為靜態變量。靜態變量被所有實例共享,可以使用“類名,變量名”的形式來訪問。
靜態變量在類加載的時候就完成了初始化,它可以被所有實例所共享。
注意:static關鍵字只能用于修飾成員變量,不能用于修飾局部變量。
2.靜態方法
(1)示例代碼。
例5-9
Eg5_7.java。
運行結果如圖5-8所示。
圖5-8例5-9運行結果
(2)代碼分析。
例5-9的Student類中定義了靜態方法study(),通過“Student.study()”的形式調用了靜態方法,由此可見,靜態方法不需要創建對象就可以由類直接調用。
(3)知識點。
不實例化類對象的情況下就可以調用某個方法,換句話說,也就是使該方法不必和對象綁在一起。要實現這樣的效果,只需要在類中定義的方法前加上static關鍵字即可,我們稱這種方法為靜態方法。同靜態變量一樣,靜態方法可以使用“類名.方法名”的方式來訪問,也可以通過類的實例化對象來訪問。
注意:靜態方法內部不能直接訪問外部非靜態的成員。在靜態方法內部,只能通過創建該類的對象來訪問外部的非static的方法。在靜態方法中,不能使用this關鍵字。
3.靜態代碼塊
(1)示例代碼。
例5-10
Eg5_8.java。
運行結果如圖5-9所示。
圖5-9例5-10運行結果
(2)代碼分析。
從圖5-9所示的運行結果可以看出,程序中的兩段靜態代碼塊都被執行了。虛擬機首先加載類Eg5_8,在加載類的同時就會執行該類的靜態代碼塊。緊接著會調用main()方法,在該方法中創建了兩個Student對象。但在兩次實例化對象的過程中,靜態代碼塊只執行一次,這就說明類在第一次使用時才會被加載,并且只會加載一次。
(3)知識點。
在java類中,使用一對大括號包圍起來的若干行代碼被稱為一個代碼塊,用static關鍵字修飾的代碼塊稱為靜態代碼塊。當類被加載時,靜態代碼塊會執行,由于類只加載一次,因此靜態代碼塊只執行一次。在程序中,通常會使用靜態代碼塊來對類的成員變量進行初始化。
5.4項目學做
按以下步驟完成學生類的創建,包括成員屬性、靜態屬性、構造方法、成員方法以及私有屬性的getter、setter訪問方法。
(1)定義學生類,有學生ID、姓名、密碼、性別、年齡、系部屬性,學校名稱為公共屬性,定義為靜態屬性。
(2)定義構造方法,為Student類的屬性賦值。
(3)定義getter和setter方法,實現對成員變量值的獲取和設置功能。
(4)定義toString()方法,將對象在內存中的內容轉換為字符串輸出。
(5)定義一個包含主方法的測試類,在main()方法中聲明并實例化兩個Student類的對象,輸出學生信息。
運行結果如圖5-10所示。
圖5-10Eg5_9.java運行結果
在這個項目中我們定義了兩個類:一個是學生類Student,另一個是測試類Eg5_9,如果這兩個類放在一個源文件中,那么只能有一個類被public修飾。通常這個類是main()方法所在的類。
5.5強化訓練
定義一個用戶類,有用戶ID、姓名、密碼等屬性,還有判定密碼一致的方法。定義一個測試類測試用戶信息和密碼的一致性。
5.6習題
1.填空題(1)在類中定義的構造方法是為類提供的專用方法,在類被執行時,構造方法首先引用。因此,在類中定義構造方法主要是為了
。(2)類是一組具有相同
和
的對象的抽象。
是由某個特定的類所描述的一個個具體的對象。
(3)構造方法的方法名與
相同,若類中沒有定義任何的構造方法,則運行時系統會自動為該類生成一個
方法。
(4)在Java中可以使用關鍵字
來創建類的實例對象。
(5)定義在類中的變量被稱為
,定義在方法中的變量被稱為
。
2.選擇題
(1)對于構造方法,下列說法不正確的是()。
A.構造方法是類的一種特殊方法,它的方法名必須與類名相同
B.構造方法的返回類型只能是void型
C.構造方法的主要作用是完成對類的對象的初始化工作
D.一般創建新對象時,系統會自動調用構造方法
(2)如果要定義一個類變量或類方法,應該使用()修飾符。
A.
package B.
private C.
public D.
static
(3)?Point類的定義為()。
classPoint{
privateintx,y;
publicPoint(intx,inty){
this.x=x;
this.y=y;
}
}
其中的this代表()。
A.類名Point
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯系上傳者。文件的所有權益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網頁內容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
- 4. 未經權益所有人同意不得將文件中的內容挪作商業或盈利用途。
- 5. 人人文庫網僅提供信息存儲空間,僅對用戶上傳內容的表現方式做保護處理,對用戶上傳分享的文檔內容本身不做任何修改或編輯,并不能對任何下載內容負責。
- 6. 下載文件中如有侵權或不適當內容,請與我們聯系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 2025年進口啤酒項目合作計劃書
- 水產養殖與生態農業綜合開發股權合作協議
- 智能合約區塊鏈電子證據收集與驗證補充協議
- 旅游團隊醫療保障補充合同
- 抖音平臺專業團購運營培訓全面服務合同
- 建筑施工企業安全風險評估與培訓服務協議
- 婚慶策劃影視廣告拍攝制作與愛情故事合同
- 新能源汽車電池回收與梯次利用市場拓展合作協議
- 金融機構間貨幣信貸補充協議
- 人與植物自然對話課件
- 上海市材料工程學校招聘真題
- 校園保安服務投標方案
- “三個代表”重要思想
- 化工設備安裝工程施工質量驗收標準
- 異分母分數加減法教學設計
- 森林經營方案編制技術規程
- 完整版雙膝骨性關節炎護理查房ppt
- ABPLC系統1756模塊接線狀態說明
- 新建房屋補助申請書
- 2020版成人非阿片類鎮痛藥圍術期應用專家共識
- 中班音樂:快樂的六一課件
評論
0/150
提交評論