版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報或認(rèn)領(lǐng)
文檔簡介
第五章Java類與對象5.1面向?qū)ο缶幊袒A(chǔ)5.2類與對象5.3構(gòu)造函數(shù)5.4成員修飾符本章小結(jié)
5.1面向?qū)ο缶幊袒A(chǔ)
1.面向?qū)ο缶幊痰膬?yōu)點
(1)方便建模:雖然面向?qū)ο笳Z言中的對象與現(xiàn)實生活中的對象并不是同一個概念,但很多時候可以將現(xiàn)實生活中對象的概念抽象后稍作修改來進(jìn)行建模,大大方便了建模的過程。
(2)模塊化:通過封裝可以定義對象的屬性和方法的訪問級別,通過不同的訪問修飾符控制對外的接口,防止內(nèi)部數(shù)據(jù)在不安全的情況下被修改。
(3)易維護(hù):采用面向?qū)ο笏枷朐O(shè)計的結(jié)構(gòu)可讀性高,繼承的存在增加了代碼的復(fù)用性,即使改變需求,維護(hù)也只是在局部模塊,方便且成本較低。
(4)易擴(kuò)展:通過繼承、多態(tài)等技術(shù)減少冗余代碼,并易于擴(kuò)展現(xiàn)有代碼,即在標(biāo)準(zhǔn)的模塊上構(gòu)建程序,而不必一切從頭開始,從而提高了編程效率。
2.面向?qū)ο缶幊痰娜筇卣?/p>
(1)封裝。封裝即把對象的屬性和方法封裝成一個獨立的單位,并隱蔽對象的內(nèi)部細(xì)節(jié)。這主要體現(xiàn)為兩方面內(nèi)容:
①封裝體:把對象的屬性和方法結(jié)合在一起,形成一個不可分割的獨立單位。
②信息隱蔽:可以通過訪問控制符來控制信息對外的公開程度,對象的使用者只是通過預(yù)先定義的接口關(guān)聯(lián)到某一對象的行為和數(shù)據(jù),而不知道其內(nèi)部細(xì)節(jié)。
(2)繼承。繼承是在已有的類的基礎(chǔ)上進(jìn)行擴(kuò)充、改造,得到新的數(shù)據(jù)類型,可以實現(xiàn)程序的代碼復(fù)用,它是存在于面向?qū)ο蟪绦蛑械膬蓚€類之間的一種關(guān)系:當(dāng)一個類獲得另一個類中所有非私有的成員屬性和行為時,就稱這兩個類之間具有繼承關(guān)系。被繼承的類稱為父類或超類,繼承了父類或超類的屬性和行為的類稱為子類。
(3)多態(tài)。在繼承的基礎(chǔ)上,某些類的方法只有在程序運(yùn)行過程中才能看出具體表現(xiàn)出來的行為,稱之為多態(tài)性。多態(tài)性是增強(qiáng)程序擴(kuò)展性、可維護(hù)性的重要手段和技術(shù)。
5.2類與對象
5.2.1類的基本概念類(Class)用來描述具有相同的屬性和方法的對象的集合,可以看成是對象的模板,它定義了該集合中所有對象共有的屬性和方法,而對象是類的具體實例。
程序設(shè)計所面對的問題域——客觀世界是由許多事物構(gòu)成的,這些事物既可以是有形的(比如一個學(xué)生、一張桌子),也可以是無形的(比如一次購買、一次會議),把客觀世界中的事物映射到面向?qū)ο蟮某绦蛟O(shè)計中就是對象,對象是面向?qū)ο蟪绦蛟O(shè)計中用來描述客觀事物的程序單位??陀^世界中的許多對象,無論是其屬性還是其行為常常有許多共同性,抽象出這些對象的共同性便可以構(gòu)成類,所以類是對象的抽象和歸納,對象是類的實例。
Java中的類被認(rèn)為是一種自定義數(shù)據(jù)類型,C語言中則可以使用已有的類型作為自定義結(jié)構(gòu)體類型的成員,從而生成新的結(jié)構(gòu)體類型;但是C語言中的結(jié)構(gòu)體類型只是封裝了成員變量,Java中的類除封裝了成員變量外,還封裝了成員方法,由類可以定義具體的實例——對象,每個對象具有自己的成員變量和成員方法。
5.2.2類的結(jié)構(gòu)與定義
1.學(xué)生屬性(field)
在學(xué)生類眾多的屬性中,程序設(shè)計時有些屬性是必要的,如學(xué)生的學(xué)號、姓名、性別,有些屬性就需要根據(jù)程序的上下文(軟件的需求)進(jìn)行取舍,比如軟件主要用于處理學(xué)生的成績,那么學(xué)生的籍貫、身高、愛好、體重、外貌、習(xí)慣、特長等等這些屬性就可以不用設(shè)計到學(xué)生類中,這些屬性對應(yīng)到類的結(jié)構(gòu)中,就稱為成員變量。
2.學(xué)生行為(method)
真的需要將現(xiàn)實世界中學(xué)生的行為設(shè)計到學(xué)生類中嗎?吃飯、學(xué)習(xí)、睡覺、跑步、游泳等等行為就算想在程序中實現(xiàn),也很難設(shè)計到學(xué)生類中(在一些特定的軟件環(huán)境中可能真的需要對這些行為進(jìn)行程序?qū)崿F(xiàn),比如3D游戲)。大多數(shù)情況下對于學(xué)生類行為設(shè)計指的是方法(函數(shù))的定義,對應(yīng)學(xué)生類結(jié)構(gòu)中的成員方法,這些成員方法主要是對學(xué)生類數(shù)據(jù)進(jìn)行處理,比如顯示學(xué)生的信息、獲取學(xué)生的年齡、修改學(xué)生的成績、求學(xué)生成績的平均值等等,它們代表了學(xué)生類中提供的功能和服務(wù),并不真的需要實現(xiàn)現(xiàn)實世界中學(xué)生的動態(tài)行為。
3.構(gòu)造函數(shù)(Constructor)
學(xué)生類中有一類特殊的函數(shù),用于構(gòu)造出學(xué)生類的實例,即具體的學(xué)生對象(如名叫張三的學(xué)生),這類函數(shù)被稱為構(gòu)造函數(shù),在構(gòu)造學(xué)生對象的時候使用new來調(diào)用。構(gòu)造函數(shù)的作用是生成學(xué)生類對象,在函數(shù)中一般是對學(xué)生屬性進(jìn)行初始化。如果一個構(gòu)造函數(shù)什么也不做,那生成的學(xué)生實例就類似一張白紙,只表示有這么一個學(xué)生,但是學(xué)生的各個屬性沒有值。
上述內(nèi)容定義一個學(xué)生類的主要結(jié)構(gòu),如圖5-1所示。圖5-1Student類結(jié)構(gòu)
(1)定義一個學(xué)生類使用class關(guān)鍵字,如:
publicclassStudent1{
…
}
該類的名字Student1要與文件名Student1.java一致,花括號{}之間是類的定義。
(2)該類有五個成員變量,對應(yīng)學(xué)生類的五個屬性,即學(xué)號、姓名、性別、分?jǐn)?shù)1、分?jǐn)?shù)2。對每個屬性需要定義屬性的類型,比如學(xué)號的類型可以是int,也可以是String,這需要根據(jù)學(xué)生的學(xué)號取值來定。如果學(xué)號全是整數(shù),可以使用int,也可以使用String;如果有其它字符,就只能使用String。
(3)成員變量還有一些其它的修飾符,如訪問控制符,靜態(tài)修飾符static,終態(tài)修飾符final等,會在后面具體說明。
(4)該類具有一個空的構(gòu)造函數(shù)(目前暫時不用,具體在后面進(jìn)行說明),使用new來調(diào)用該函數(shù)能夠生成一個Student類的對象。
(5)成員方法1用于求一個學(xué)生對象兩科分?jǐn)?shù)的平均分。
(6)成員方法2用于顯示學(xué)生對象各個成員變量的信息。
5.2.3對象的基本概念
對象(object)是類的一個具體實例(instance),每個對象都有自己的成員變量和成員方法,在堆內(nèi)存中具有一段內(nèi)存空間以保存自己的成員變量,例如張三是學(xué)生類的一個具體學(xué)生對象。
上一節(jié)定義好了Student類,將現(xiàn)實世界的學(xué)生抽象到了程序中,這一節(jié)在程序中由該類產(chǎn)生具體的學(xué)生對象實例,如圖5-2所示。
圖5-2Student類與對象
定義好了Student類,就可以由類生成對象,主要語法是使用new調(diào)用類的構(gòu)造函數(shù),在堆內(nèi)存區(qū)域獲得一個對象的內(nèi)存空間,在該空間中存放該對象的成員變量的值。例如語句“Students1=newStudent();”表示使用Student類生成了一個該類的對象,使用s1這個引用變量指向該對象,具體的內(nèi)存示意圖如圖5-3所示。圖5-3Student對象內(nèi)存示意圖
5.2.4對象的初始化
1.對象成員的類型
如何給s1對象中的成員進(jìn)行賦值呢?首先要分清楚對象的成員有哪些類型,對象成員變量的類型主要有基本數(shù)據(jù)類型、JDK預(yù)定義類型和用戶自定義類型。
1)基本數(shù)據(jù)類型
如果某個成員變量是基本數(shù)據(jù)類型,即使沒有進(jìn)行初始化,Java也會確保其有一個默認(rèn)值,如表5-1所示。
2)?JDK預(yù)定義類型
預(yù)定義類型即JDK自帶的類,例如常用的字符串類String,學(xué)生類中很多成員變量都是String字符串類型的,如名字、性別、班級等等。JDK龐大的類庫能夠方便程序員構(gòu)造程序,比如可以使用Date或者Calendar類來作為學(xué)生類的出生日期成員變量(出生日期)。在使用這些類作為成員變量類型時可查詢JDK幫助文檔,了解這些類的用法。
3)用戶自定義類型
也可以使用用戶自定義的類型來作為成員變量的類型,比如可以在學(xué)生類中定義一個Teacher(教師)類型的成員變量,表示學(xué)生的班主任屬性,那么在生成學(xué)生類對象的時候就要生成一個Teacher類對象作為該學(xué)生類對象的一個對象成員。
2.對象的初始化
學(xué)生類對象的初始化有以下兩種方式:
(1)使用圓點成員運(yùn)算符(.)。“.”直接對指定對象的成員變量進(jìn)行賦值:
s1.num=101;
="張三";
s1.gander="男";
s1.score1=80.0;
s1.score2=74.0;
(2)使用構(gòu)造函數(shù)。構(gòu)造函數(shù)的主要作用是對成員變量進(jìn)行初始化。可以在類中定義不同參數(shù)的多個構(gòu)造函數(shù)來對成員變量進(jìn)行初始化(在一個類中有多個同名的函數(shù),但是參數(shù)列表不同,這稱為函數(shù)重載,在調(diào)用函數(shù)時根據(jù)傳入的參數(shù)來決定具體調(diào)用哪個函數(shù)),前面的Student類中只有一個空的構(gòu)造函數(shù):
publicStudent1(){
}
函數(shù)定義的三個參數(shù)(intn,Strings,Stringg)是函數(shù)的形參,也是函數(shù)定義的局部變量。使用new調(diào)用該函數(shù)來生成學(xué)生類對象時,傳入三個實參(102,"李四","男"),分別交給n、s、g,然后該構(gòu)造函數(shù)的函數(shù)體將這三個實參賦值給成員變量num、name和gander,這個賦值的內(nèi)存示意圖如圖5-4所示。
圖5-4Student對象生成的內(nèi)存示意圖
3.this
上述構(gòu)造函數(shù)是寫在Student1類定義中的,定義該類的時候,是無法知道將要生成的對象名字是什么,所以用this這個關(guān)鍵字來代替將要生成的對象的名字,以構(gòu)成“對象名.成員名”的形式,所以可以稱this為“當(dāng)前(將要生成)對象的引用”。
除了構(gòu)造函數(shù)能夠?qū)Τ蓡T變量初始化外,還可以使用一些成員函數(shù)來對指定的成員變量賦值或修改,如:
publicvoidsetNum(intnum){
this.num=num;
}
定義類的目的主要是生成對象,有了對象就能保存對象的成員變量值,并且調(diào)用對象的成員方法,這是面向?qū)ο缶幊痰闹饕僮?。成員方法往往代表了要提供的功能或服務(wù),比如Student1類中有兩個成員方法,一個是用于求對象兩個成員變量的平均分,一個是用于顯示對象的信息。
程序示例5-2定義學(xué)生類。
程序分析:
(1)?Student2類中具有兩個構(gòu)造函數(shù)的重載,在生成該類對象的時候,根據(jù)是否傳入?yún)?shù)來區(qū)分調(diào)用哪個構(gòu)造函數(shù)。
(2)?Student2類中使用this來區(qū)分同名的成員變量和局部變量。
(3)定義好Student2類,在后面就能夠使用該類產(chǎn)生對象,并使用對象去調(diào)用其成員,完成相應(yīng)的程序功能。
程序結(jié)果:
5.3構(gòu)造函數(shù)
構(gòu)造函數(shù)(constructor)是某個類用來生成該類對象的一類特殊函數(shù)。這里對構(gòu)造函數(shù)總結(jié)如下:
1.構(gòu)造函數(shù)的特點(1)構(gòu)造函數(shù)的名字必須與類名一致。(2)構(gòu)造函數(shù)沒有返回值類型。我們知道,函數(shù)定義的三要素中必須要有返回值類型,即使函數(shù)沒有返回值,在定義的時候也要用void修飾,但是構(gòu)造函數(shù)既沒有返回值類型也沒有用void修飾。
2.構(gòu)造函數(shù)的作用
(1)構(gòu)造函數(shù)是使用new生成對象的時候被調(diào)用的函數(shù)。
(2)構(gòu)造函數(shù)的功能主要是對對象成員變量進(jìn)行初始化,在生成對象的時候能讓一些成員變量獲得值。
(3)可以按照程序的上下文和需求在對對象初始化的時候進(jìn)行一些特定的操作,例如對構(gòu)造函數(shù)實參的值范圍進(jìn)行檢測等,但是不建議在該函數(shù)內(nèi)進(jìn)行復(fù)雜的邏輯處理,畢竟構(gòu)造函數(shù)的主要作用是生成對象和初始化對象。
3.構(gòu)造函數(shù)的重載
(1)一個類中具有多個構(gòu)造函數(shù),但是參數(shù)列表不同,比如Student2類中就有兩個構(gòu)造函數(shù),一個是沒有參數(shù)的,一個有三個參數(shù)對三個成員變量進(jìn)行初始化。
(2)無參且空函數(shù)體的構(gòu)造函數(shù),一般建議保留。如果在定義類的時候一個構(gòu)造函數(shù)都沒寫,系統(tǒng)會自動生成一個無參空函數(shù)體的構(gòu)造函數(shù);如果有了一個構(gòu)造函數(shù),系統(tǒng)就不會再自動生成構(gòu)造函數(shù)了。
(3)如果一個類有10個成員變量,需要寫幾個構(gòu)造函數(shù)呢?可以根據(jù)軟件需求進(jìn)行取舍,以方便在程序中進(jìn)行調(diào)用。例如上述的Student2類,在實際生成對象的時候,必須對3個成員變量初始化,而有一些成員變量就可以在其它地方進(jìn)行初始化。
(4)在一個類的一個構(gòu)造函數(shù)中,可以使用this()來調(diào)用本類其它的構(gòu)造函數(shù),如程序5-4所示。
5.4成?員?修?飾?符
5.4.1訪問控制符Java提供了3個訪問控制符,即private、protected和public,分別代表了三種訪問控制級別,另外還有一個不加任何訪問控制符的訪問控制級別,共四個訪問控制級別。Java訪問控制符的開放性如圖5-5所示,越往右邊,成員的可見性和可訪問性越趨于公開。
圖5-5訪問控制符的開放性
1.private(私有訪問權(quán)限)
如果類中的一個成員(包括成員變量、方法和構(gòu)造器等)使用private訪問控制符來修飾,則這個成員只能在當(dāng)前類的內(nèi)部被訪問,對于外部類是不可見的。private訪問控制符用于修飾成員變量較合適,使用它來修飾成員變量就可以把成員變量隱藏在該類的內(nèi)部,外部的類就不能直接使用“對象名.成員名”的方式來直接訪問該成員了。
為什么要采用較復(fù)雜的getter-setter方法,而不直接使用“對象名.成員名”方式直接來獲取/修改成員變量呢?原因如下:
(1)采用getter-setter方法能隱藏、保護(hù)對象的成員變量的數(shù)據(jù)。
(2)采用getter-setter方法的方式訪問和設(shè)置對象的成員,可以在方法中實施訪問、權(quán)限、日志記錄、修改值范圍等控制,如:
2.default(包package訪問權(quán)限)
如果類里的一個成員(包括成員變量、方法和構(gòu)造器等)不使用任何訪問控制符修飾,就稱它為包(即文件夾)訪問權(quán)限。default訪問控制的成員可以被處于同一個包下的其他類訪問。在初學(xué)Java階段,使用這個進(jìn)行訪問控制較為簡便。
3.protected(子類訪問權(quán)限)
如果一個成員(包括成員變量、方法和構(gòu)造器等)使用protected訪問控制符修飾,那么這個成員既可以被同一個包中的其它類訪問,也可以被不同包中的子類(在后面的繼承知識點中將涉及)訪問。
4.?public(公共訪問權(quán)限)
這是一個最開放的訪問控制級別,如果一個成員(包括成員變量、方法和構(gòu)造器等)或者一個外部類使用public訪問控制符修飾,那么這個成員或外部類就可以被所有類訪問,不管訪問類和被訪問類是否處于同一個包中,是否具有父子繼承關(guān)系,都可以直接使用“對象名.成員名”方式進(jìn)行訪問或設(shè)置。
訪問控制修飾符的總結(jié)如表5-2所示。
5.4.2static修飾符
static修飾符可以修飾一個類的成員變量、成員方法和內(nèi)部類等。
1.static修飾成員
在第3.5.2節(jié)中提到,類定義中的方法分為兩種:
(1)對象成員:不帶static修飾符,要使用該成員,必須先生成該類的對象,由對象調(diào)用該成員。
(2)類成員:帶static修飾符,可以由類名或者對象名來調(diào)用該成員,這樣的成員在內(nèi)存中只有一個副本。
2.static修飾符的特點
(1)?static修飾的成員(變量/方法),隨著所在類的加載而被加載。當(dāng)JVM把類的字節(jié)碼加載進(jìn)JVM的時候,static修飾的成員已經(jīng)在內(nèi)存中存在了,優(yōu)先于對象的存在,對象只有通過new創(chuàng)建出來后才會在堆內(nèi)存中出現(xiàn)。
(2)?static修飾的成員被該類型的所有對象所共享;該類創(chuàng)建出來的任何對象,都可以訪問static成員;每個對象在內(nèi)存中都有自己的副本,但是不管一個類具有多少個對象,static成員都只有一個副本。
(3)靜
溫馨提示
- 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)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 統(tǒng)計調(diào)查員崗位聘用合同
- 服裝物流運(yùn)輸合同
- 氣質(zhì)形體修煉課程設(shè)計
- 2024市政道路施工合同范本
- 體育場照明大型活動
- 時尚創(chuàng)意工作室品牌方案
- 智能家居項目招投標(biāo)監(jiān)管方案
- 商場防雷接地實施方案
- 汽車散熱器課程設(shè)計內(nèi)容
- 鐵路運(yùn)輸安全隱患排查方案
- DDI-高績效輔導(dǎo)培訓(xùn)課件
- 外研版七年級上冊英語思維導(dǎo)圖各個單元的內(nèi)容
- 基礎(chǔ)護(hù)理生命體征測量
- 小升初個人簡歷模板-
- 人教版中職數(shù)學(xué)教材基礎(chǔ)模塊上下冊教案
- 糕點生產(chǎn)許可證審查細(xì)則
- XX銀行信息系統(tǒng)軟件版本管理辦法
- 叉車選型的注意點
- 第一單元 計算機(jī)中的編碼 課件 初中信息技術(shù)七年級上冊
- 燒結(jié)過程中氮氧化物生成機(jī)理及控制
-
評論
0/150
提交評論