JAVA程序設(shè)計課件:學(xué)生類_第1頁
JAVA程序設(shè)計課件:學(xué)生類_第2頁
JAVA程序設(shè)計課件:學(xué)生類_第3頁
JAVA程序設(shè)計課件:學(xué)生類_第4頁
JAVA程序設(shè)計課件:學(xué)生類_第5頁
已閱讀5頁,還剩71頁未讀, 繼續(xù)免費閱讀

下載本文檔

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

文檔簡介

學(xué)生類5.1項目任務(wù)5.2項目解析5.3技術(shù)準(zhǔn)備5.4項目學(xué)做5.5強化訓(xùn)練5.6習(xí)題

單元概述

本單元以項目為向?qū)?,介紹Java語言中關(guān)于類的語法規(guī)則。在本單元中,讀者應(yīng)該理解面向?qū)ο蟮某绦蛟O(shè)計思想,掌握類的設(shè)計、對象的創(chuàng)建、類的封裝、構(gòu)造方法的定義及其重載、this和static關(guān)鍵字的使用。

目的與要求

·

了解面向?qū)ο蟪绦蛟O(shè)計的概念和思想

·

掌握類的定義、理解類和對象的關(guān)系

·

理解封裝的概念及意義

·

掌握創(chuàng)建和使用對象的方法

·

理解并掌握構(gòu)造方法的定義和作用

·

理解方法重載的概念及其使用規(guī)則

·

掌握this和static關(guān)鍵字的用法

重點與難點

·

類的定義

·

對象的創(chuàng)建和使用

·

類的封裝

·

構(gòu)造方法的定義和重載的規(guī)則

·

this和static關(guān)鍵字的使用。

5.1項目任務(wù)

采用面向?qū)ο笤O(shè)計的思想聲明一個描述學(xué)生成績管理系統(tǒng)特征的學(xué)生類,通過該學(xué)生類能夠最終實現(xiàn)學(xué)生的成績管理功能。

5.2項目解析

根據(jù)項目任務(wù)描述的項目功能需求,本項目需要定義一個學(xué)生類,具體包含如下內(nèi)容:該類中定義表示學(xué)生信息的屬性;定義學(xué)生類的構(gòu)造方法,用以給學(xué)生信息賦值;定義實現(xiàn)設(shè)置和獲取學(xué)生信息的方法(訪問器)。

定義一個學(xué)生類要解決如下問題:

(1)如何使用Java語言定義一個學(xué)生類?屬性和方法的定義格式是什么?

(2)什么是構(gòu)造方法?如何使用構(gòu)造方法為學(xué)生信息屬性賦值?

(3)如何聲明并實例化學(xué)生類對象?如何通過學(xué)生類的對象調(diào)用屬性和方法?

5.3技術(shù)準(zhǔn)備

現(xiàn)實生活中存在各種形態(tài)不同的事物,如桌子、筆記本、花、草、樹木,乃至我們自己都是具體的事物,這些事物之間存在著各種各樣的聯(lián)系。在程序中使用對象來映射現(xiàn)實中的事物,使用對象的關(guān)系來描述事物之間的聯(lián)系,這就是面向?qū)ο蟮乃枷搿?/p>

面向?qū)ο蟮木幊趟枷肓D在程序中對事物的描述與該事物在現(xiàn)實中的形態(tài)保持一致。為了做到這一點,面向?qū)ο蟮木幊趟枷胩岢隽祟惡蛯ο髢蓚€概念。類是對某一類事物的抽象描述,而對象用于表示現(xiàn)實中該類事物的個體。

在面向?qū)ο蟮乃枷胫凶詈诵牡木褪菍ο?,為了在程序中?chuàng)建對象,首先需要定義一個類。類是對象的抽象,它用于描述一組對象的共同特征和行為。

5.3.1類的定義

(1)示例代碼。

例5-1

定義Teacher類。

(2)代碼分析。

類中可以定義成員變量和成員方法,如例5-1的Teacher類中定義了兩個成員變量:String類型的name和int類型的age,其中成員變量用于描述對象的特征,也被稱為屬性。Teacher類中定義了一個返回值為void的teach()方法,稱為成員方法,成員方法用于描述對象的行為,可簡稱方法。

(3)知識點。

類定義的格式:

[修飾符]class類名{

[修飾符]類屬性定義

[修飾符]類方法定義

}

注意:在Java中定義在類體內(nèi)、方法外的變量稱為成員變量,也稱為類的屬性。定義在方法中的變量稱為局部變量。如果在某一個方法中定義的局部變量和成員變量同名,這種情況是允許的,此時方法中通過變量名訪問到的變量是局部變量而非成員變量。

5.3.2對象的創(chuàng)建與使用

應(yīng)用程序想要完成具體的功能,僅有類是遠遠不夠的,還需要根據(jù)類創(chuàng)建實例對象。

(1)示例代碼。

例5-2

Eg5_1.java。

運行結(jié)果如圖5-1所示。

圖5-1例5-2運行結(jié)果

(2)代碼分析。

其中,“newTeacher()”用于創(chuàng)建Teacher類的一個實例對象;“Teachert”則是聲明了一個Teacher類型的變量t(對象);中間的等號用于將Teacher對象在內(nèi)存中的地址賦值給變量t,這樣變量t便持有了對象的引用。在內(nèi)存中,變量t和對象之間的引用關(guān)系如圖5-2所示。

圖5-2內(nèi)存分析

例5-2中,t1、t2分別引用了Teacher類的兩個實例對象,從運行結(jié)果圖5-1可以看出,t1和t2對象在調(diào)用teach()方法時,輸出的name值完全不同,這是因為t1和t2對象是兩個獨立的個體,它們分別擁有各自的name屬性,對t1對象的name屬性賦值并不會影響到t2對象name屬性的值。

(3)知識點。

在Java程序中可以使用new關(guān)鍵字來創(chuàng)建對象,具體格式如下:

類名對象名稱=new類名();

如例5-2所示“Teachert1=newTeacher();”。

創(chuàng)建Teacher對象后,可以通過對象的引用來訪問對象所有的成員,具體格式如下:

對象引用.對象成員

如例5-2所示“="Lucy";”。

注意:在例5-2中,通過“="Lucy";”將t1對象的name屬性值賦值為“Lucy”,但并沒有對t2對象的name屬性進行賦值,也就是說t2對象的name屬性值應(yīng)該沒有值。但是從運行結(jié)果可以看出,t2對象的name屬性也是有值的,其值為null。這是因為當(dāng)一個對象被創(chuàng)建時,Java虛擬機會對其中各種類型的成員變量自動進行初始化賦值。基本數(shù)據(jù)類型初始化值為0,引用數(shù)據(jù)類型初始化值為null,具體如表5-1所示。

5.3.3構(gòu)造方法

從前面所學(xué)到的知識可以發(fā)現(xiàn),實例化一個類的對象后,如果要為這個對象中的屬性賦值,就必須要通過直接訪問對象的屬性或調(diào)用setXXX()方法的方式來實現(xiàn)。如果需要在實例化對象的同時就為這個對象的屬性進行賦值,可以通過構(gòu)造方法來實現(xiàn)。構(gòu)造方法是類的一個特殊的方法,它會在類的實例化對象時被自動調(diào)用。

(1)示例代碼。

例5-3

Eg5_2.java。

運行結(jié)果如圖5-3所示。

圖5-3例5-3運行結(jié)果

(2)代碼分析。

在例5-3的Student類中定義了一個無參的構(gòu)造方法Student()。從運行結(jié)果可以看出,Student類中無參的構(gòu)造方法被調(diào)用了。這是因為“Studentstul=newStudent()”這句代碼在實例化Student對象時會自動調(diào)用類的構(gòu)造方法,“newStudent()”語句的作用除了會實例化Student對象外,還會調(diào)用構(gòu)造方法Student()。

在一個類中除了定義無參的構(gòu)造方法,還可以定義有參的構(gòu)造方法,通過有參的構(gòu)造方法就可以實現(xiàn)對屬性的賦值。接下來對例5-3進行改寫,改寫后的代碼如例5-4所示。

例5-4

Eg5_3.java。

運行結(jié)果如圖5-4所示。

圖5-4例5-4運行結(jié)果

例5-4的Student類中定義了有參的構(gòu)造方法Student(Strings)?!癝tudents=newStudent("1001")”代碼中的“newStudent("1001")”會在實例化對象的同時調(diào)用有參的構(gòu)造方法,并傳入?yún)?shù)“1001”。在構(gòu)造方法Student(Strings)中將“1001”賦值給對象的num屬性。通過運行結(jié)果可以看出,Student對象在調(diào)用info()方法時,其num屬性已經(jīng)被賦值為“1001”。

(3)知識點。

在一個類中定義的方法如果同時滿足以下三個條件,該方法稱為構(gòu)造方法。

①函數(shù)的名稱與類相同。

②沒有返回值類型聲明。

③不能在方法中使用return語句返回一個值。

構(gòu)造方法定義的語法格式如下:

[訪問控制修飾符]類名([形參列表]){

方法體;

}

注意:沒有返回值類型聲明不等同于“void”。void也是一種返回值類型聲明,那就是沒有返回值。

5.3.4構(gòu)造方法的重載

在一個類中可以定義多個構(gòu)造方法,只要每個構(gòu)造方法的參數(shù)列表(參數(shù)類型、參數(shù)個數(shù)和參數(shù)順序)不同即可。在創(chuàng)建對象時,可以通過調(diào)用不同的構(gòu)造方法為不同的屬性賦值。接下來通過一個案例來學(xué)習(xí)構(gòu)造方法的重載。

(1)示例代碼。

例5-5

Eg5-4.java。

運行結(jié)果如圖5-5所示。

圖5-5例5-5運行結(jié)果

(2)代碼分析。

例5-5的Student類中定義了三個構(gòu)造方法,它們構(gòu)成了方法的重載。在創(chuàng)建s1、s2和s3對象時,根據(jù)傳入?yún)?shù)的不同,分別調(diào)用不同的構(gòu)造方法。從程序的運行結(jié)果可以看出,三個構(gòu)造方法對屬性賦值的情況是不一樣的,其中帶一個參數(shù)的構(gòu)造方法只針對num屬性進行賦值,這時name屬性的值默認為null,age屬性的值為默認值0。

(3)知識點。

在一個類中可以定義多個構(gòu)造方法,這些方法的參數(shù)列表有所不同,形成方法的重載。

注意:每一個類都至少有一個構(gòu)造方法,如果在定義類時,沒有顯式地聲明任何構(gòu)造方法,系統(tǒng)會自動為這個類創(chuàng)建一個無參的構(gòu)造方法,里面沒有任何代碼。

在定義構(gòu)造方法時,如果沒有特殊需要,都應(yīng)該使用public關(guān)鍵字修飾。

5.3.5this關(guān)鍵字

在例5-5中使用變量表示年齡時,構(gòu)造方法中使用的是cage,成員變量使用的是age。這樣的程序可讀性很差,這時需要將一個類中表示年齡的變量進行統(tǒng)一的命名,例如都聲明為age。但是這樣做又會導(dǎo)致成員變量和局部變量的名稱沖突,在方法中將無法訪問成員變量age。為了解決這個問題,Java提供了一個關(guān)鍵字this,用于在方法中訪問對象的其他成員。

1.用this關(guān)鍵字訪問成員屬性

(1)示例代碼。

例5-6

修改例5-5中的形參名稱,讓其與成員變量同名。

(2)代碼分析。

①通過this關(guān)鍵字可以明確地去訪問一個類的成員變量,解決與局部變量名稱沖突問題。

在上面的代碼中,構(gòu)造方法的參數(shù)被定義為num、name、age,它是一個局部變量,在類中還定義了同名的成員變量是num、name、age。在構(gòu)造方法中如果使用num、name、age,則是訪問局部變量,但如果使用this.num、、this.age,則是訪問成員變量。

②通過this關(guān)鍵字調(diào)用成員方法,具體示例代碼如下:

2.用this調(diào)用成員屬性和方法

(1)示例代碼。

例5-7

Eg5_5.java。

運行結(jié)果如圖5-6所示。

圖5-6例5-7運行結(jié)果

(2)代碼分析。

構(gòu)造方法是在實例化對象時被Java虛擬機自動調(diào)用的,在程序中不能像調(diào)用其他方法一樣去調(diào)用構(gòu)造方法,但可以在一個構(gòu)造方法中使用“this([參數(shù)1,參數(shù)2……])”的形式來調(diào)用其他的構(gòu)造方法。

例5-7中“Students=newStudent("張三")”代碼在實例化Student對象時調(diào)用了有參的構(gòu)造方法,在該方法中通過this()方法調(diào)用了無參的構(gòu)造方法,因此運行結(jié)果中顯示兩個構(gòu)造方法都被調(diào)用了。

(3)知識點。

①只能在構(gòu)造方法中使用this調(diào)用其他的構(gòu)造方法,不能在成員方法中使用。

②在構(gòu)造方法中,使用this調(diào)用構(gòu)造方法的語句必須位于第一行,且只能出現(xiàn)一次。

③不能在一個類的兩個構(gòu)造方法中使用this互相調(diào)用。

5.3.6static關(guān)鍵字

在Java中定義了一個static關(guān)鍵字,它用于修飾類的成員,如成員變量、成員方法以及代碼塊等。被static修飾的成員具備一些特殊性,接下來將對這些特殊性進行逐一講解。

1.靜態(tài)變量

(1)示例代碼。

例5-8

Eg5_6.java。

運行結(jié)果如圖5-7所示。

圖5-7例5-8運行結(jié)果

(2)代碼分析。

在定義一個類時,只是在描述某類事物的特征和行為,并沒有產(chǎn)生具體的數(shù)據(jù)。只有通過new關(guān)鍵字創(chuàng)建該類的實例對象后,系統(tǒng)才會為每個對象分配空間并存儲各自的數(shù)據(jù)。有時候,我們希望某些特定的數(shù)據(jù)在內(nèi)存中只有一份,而且能夠被一個類的所有實例對象所共享。例如,某個學(xué)校的某個專業(yè)的所有學(xué)生共享同一個系部名稱,此時完全不必在每個學(xué)生對象所占用的內(nèi)存空間中都定義一個變量來表示系部的名稱,而可以在對象以外的空間定義一個表示系部名稱的變量讓所有對象來共享。

Student類中定義了一個靜態(tài)變量DName,用于表示學(xué)生所在的系部名稱,它被所有的實例所共享。由于DName是靜態(tài)變量,因此可以直接使用Student.DName的方式進行調(diào)用,也可以通過Student的實例對象進行調(diào)用,如“Student.DName="計算機";”代碼將變量DName賦值為“計算機”,通過運行結(jié)果可以看出學(xué)生對象stu1和stu2的DName屬性均為“計算機”。

(3)知識點。

在一個java類中,可以使用static關(guān)鍵字來修飾成員變量,該變量被稱為靜態(tài)變量。靜態(tài)變量被所有實例共享,可以使用“類名,變量名”的形式來訪問。

靜態(tài)變量在類加載的時候就完成了初始化,它可以被所有實例所共享。

注意:static關(guān)鍵字只能用于修飾成員變量,不能用于修飾局部變量。

2.靜態(tài)方法

(1)示例代碼。

例5-9

Eg5_7.java。

運行結(jié)果如圖5-8所示。

圖5-8例5-9運行結(jié)果

(2)代碼分析。

例5-9的Student類中定義了靜態(tài)方法study(),通過“Student.study()”的形式調(diào)用了靜態(tài)方法,由此可見,靜態(tài)方法不需要創(chuàng)建對象就可以由類直接調(diào)用。

(3)知識點。

不實例化類對象的情況下就可以調(diào)用某個方法,換句話說,也就是使該方法不必和對象綁在一起。要實現(xiàn)這樣的效果,只需要在類中定義的方法前加上static關(guān)鍵字即可,我們稱這種方法為靜態(tài)方法。同靜態(tài)變量一樣,靜態(tài)方法可以使用“類名.方法名”的方式來訪問,也可以通過類的實例化對象來訪問。

注意:靜態(tài)方法內(nèi)部不能直接訪問外部非靜態(tài)的成員。在靜態(tài)方法內(nèi)部,只能通過創(chuàng)建該類的對象來訪問外部的非static的方法。在靜態(tài)方法中,不能使用this關(guān)鍵字。

3.靜態(tài)代碼塊

(1)示例代碼。

例5-10

Eg5_8.java。

運行結(jié)果如圖5-9所示。

圖5-9例5-10運行結(jié)果

(2)代碼分析。

從圖5-9所示的運行結(jié)果可以看出,程序中的兩段靜態(tài)代碼塊都被執(zhí)行了。虛擬機首先加載類Eg5_8,在加載類的同時就會執(zhí)行該類的靜態(tài)代碼塊。緊接著會調(diào)用main()方法,在該方法中創(chuàng)建了兩個Student對象。但在兩次實例化對象的過程中,靜態(tài)代碼塊只執(zhí)行一次,這就說明類在第一次使用時才會被加載,并且只會加載一次。

(3)知識點。

在java類中,使用一對大括號包圍起來的若干行代碼被稱為一個代碼塊,用static關(guān)鍵字修飾的代碼塊稱為靜態(tài)代碼塊。當(dāng)類被加載時,靜態(tài)代碼塊會執(zhí)行,由于類只加載一次,因此靜態(tài)代碼塊只執(zhí)行一次。在程序中,通常會使用靜態(tài)代碼塊來對類的成員變量進行初始化。

5.4項目學(xué)做

按以下步驟完成學(xué)生類的創(chuàng)建,包括成員屬性、靜態(tài)屬性、構(gòu)造方法、成員方法以及私有屬性的getter、setter訪問方法。

(1)定義學(xué)生類,有學(xué)生ID、姓名、密碼、性別、年齡、系部屬性,學(xué)校名稱為公共屬性,定義為靜態(tài)屬性。

(2)定義構(gòu)造方法,為Student類的屬性賦值。

(3)定義getter和setter方法,實現(xiàn)對成員變量值的獲取和設(shè)置功能。

(4)定義toString()方法,將對象在內(nèi)存中的內(nèi)容轉(zhuǎn)換為字符串輸出。

(5)定義一個包含主方法的測試類,在main()方法中聲明并實例化兩個Student類的對象,輸出學(xué)生信息。

運行結(jié)果如圖5-10所示。

圖5-10Eg5_9.java運行結(jié)果

在這個項目中我們定義了兩個類:一個是學(xué)生類Student,另一個是測試類Eg5_9,如果這兩個類放在一個源文件中,那么只能有一個類被public修飾。通常這個類是main()方法所在的類。

5.5強化訓(xùn)練

定義一個用戶類,有用戶ID、姓名、密碼等屬性,還有判定密碼一致的方法。定義一個測試類測試用戶信息和密碼的一致性。

5.6習(xí)題

1.填空題(1)在類中定義的構(gòu)造方法是為類提供的專用方法,在類被執(zhí)行時,構(gòu)造方法首先引用。因此,在類中定義構(gòu)造方法主要是為了

。(2)類是一組具有相同

的對象的抽象。

是由某個特定的類所描述的一個個具體的對象。

(3)構(gòu)造方法的方法名與

相同,若類中沒有定義任何的構(gòu)造方法,則運行時系統(tǒng)會自動為該類生成一個

方法。

(4)在Java中可以使用關(guān)鍵字

來創(chuàng)建類的實例對象。

(5)定義在類中的變量被稱為

,定義在方法中的變量被稱為

2.選擇題

(1)對于構(gòu)造方法,下列說法不正確的是()。

A.構(gòu)造方法是類的一種特殊方法,它的方法名必須與類名相同

B.構(gòu)造方法的返回類型只能是void型

C.構(gòu)造方法的主要作用是完成對類的對象的初始化工作

D.一般創(chuàng)建新對象時,系統(tǒng)會自動調(diào)用構(gòu)造方法

(2)如果要定義一個類變量或類方法,應(yīng)該使用()修飾符。

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. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(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)容負責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論