Java程序設計基礎 課件 第5章 Java類與對象_第1頁
Java程序設計基礎 課件 第5章 Java類與對象_第2頁
Java程序設計基礎 課件 第5章 Java類與對象_第3頁
Java程序設計基礎 課件 第5章 Java類與對象_第4頁
Java程序設計基礎 課件 第5章 Java類與對象_第5頁
已閱讀5頁,還剩46頁未讀 繼續(xù)免費閱讀

下載本文檔

版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領

文檔簡介

第五章Java類與對象5.1面向對象編程基礎5.2類與對象5.3構造函數(shù)5.4成員修飾符本章小結

5.1面向對象編程基礎

1.面向對象編程的優(yōu)點

(1)方便建模:雖然面向對象語言中的對象與現(xiàn)實生活中的對象并不是同一個概念,但很多時候可以將現(xiàn)實生活中對象的概念抽象后稍作修改來進行建模,大大方便了建模的過程。

(2)模塊化:通過封裝可以定義對象的屬性和方法的訪問級別,通過不同的訪問修飾符控制對外的接口,防止內部數(shù)據(jù)在不安全的情況下被修改。

(3)易維護:采用面向對象思想設計的結構可讀性高,繼承的存在增加了代碼的復用性,即使改變需求,維護也只是在局部模塊,方便且成本較低。

(4)易擴展:通過繼承、多態(tài)等技術減少冗余代碼,并易于擴展現(xiàn)有代碼,即在標準的模塊上構建程序,而不必一切從頭開始,從而提高了編程效率。

2.面向對象編程的三大特征

(1)封裝。封裝即把對象的屬性和方法封裝成一個獨立的單位,并隱蔽對象的內部細節(jié)。這主要體現(xiàn)為兩方面內容:

①封裝體:把對象的屬性和方法結合在一起,形成一個不可分割的獨立單位。

②信息隱蔽:可以通過訪問控制符來控制信息對外的公開程度,對象的使用者只是通過預先定義的接口關聯(lián)到某一對象的行為和數(shù)據(jù),而不知道其內部細節(jié)。

(2)繼承。繼承是在已有的類的基礎上進行擴充、改造,得到新的數(shù)據(jù)類型,可以實現(xiàn)程序的代碼復用,它是存在于面向對象程序中的兩個類之間的一種關系:當一個類獲得另一個類中所有非私有的成員屬性和行為時,就稱這兩個類之間具有繼承關系。被繼承的類稱為父類或超類,繼承了父類或超類的屬性和行為的類稱為子類。

(3)多態(tài)。在繼承的基礎上,某些類的方法只有在程序運行過程中才能看出具體表現(xiàn)出來的行為,稱之為多態(tài)性。多態(tài)性是增強程序擴展性、可維護性的重要手段和技術。

5.2類與對象

5.2.1類的基本概念類(Class)用來描述具有相同的屬性和方法的對象的集合,可以看成是對象的模板,它定義了該集合中所有對象共有的屬性和方法,而對象是類的具體實例。

程序設計所面對的問題域——客觀世界是由許多事物構成的,這些事物既可以是有形的(比如一個學生、一張桌子),也可以是無形的(比如一次購買、一次會議),把客觀世界中的事物映射到面向對象的程序設計中就是對象,對象是面向對象程序設計中用來描述客觀事物的程序單位。客觀世界中的許多對象,無論是其屬性還是其行為常常有許多共同性,抽象出這些對象的共同性便可以構成類,所以類是對象的抽象和歸納,對象是類的實例。

Java中的類被認為是一種自定義數(shù)據(jù)類型,C語言中則可以使用已有的類型作為自定義結構體類型的成員,從而生成新的結構體類型;但是C語言中的結構體類型只是封裝了成員變量,Java中的類除封裝了成員變量外,還封裝了成員方法,由類可以定義具體的實例——對象,每個對象具有自己的成員變量和成員方法。

5.2.2類的結構與定義

1.學生屬性(field)

在學生類眾多的屬性中,程序設計時有些屬性是必要的,如學生的學號、姓名、性別,有些屬性就需要根據(jù)程序的上下文(軟件的需求)進行取舍,比如軟件主要用于處理學生的成績,那么學生的籍貫、身高、愛好、體重、外貌、習慣、特長等等這些屬性就可以不用設計到學生類中,這些屬性對應到類的結構中,就稱為成員變量。

2.學生行為(method)

真的需要將現(xiàn)實世界中學生的行為設計到學生類中嗎?吃飯、學習、睡覺、跑步、游泳等等行為就算想在程序中實現(xiàn),也很難設計到學生類中(在一些特定的軟件環(huán)境中可能真的需要對這些行為進行程序實現(xiàn),比如3D游戲)。大多數(shù)情況下對于學生類行為設計指的是方法(函數(shù))的定義,對應學生類結構中的成員方法,這些成員方法主要是對學生類數(shù)據(jù)進行處理,比如顯示學生的信息、獲取學生的年齡、修改學生的成績、求學生成績的平均值等等,它們代表了學生類中提供的功能和服務,并不真的需要實現(xiàn)現(xiàn)實世界中學生的動態(tài)行為。

3.構造函數(shù)(Constructor)

學生類中有一類特殊的函數(shù),用于構造出學生類的實例,即具體的學生對象(如名叫張三的學生),這類函數(shù)被稱為構造函數(shù),在構造學生對象的時候使用new來調用。構造函數(shù)的作用是生成學生類對象,在函數(shù)中一般是對學生屬性進行初始化。如果一個構造函數(shù)什么也不做,那生成的學生實例就類似一張白紙,只表示有這么一個學生,但是學生的各個屬性沒有值。

上述內容定義一個學生類的主要結構,如圖5-1所示。圖5-1Student類結構

(1)定義一個學生類使用class關鍵字,如:

publicclassStudent1{

}

該類的名字Student1要與文件名Student1.java一致,花括號{}之間是類的定義。

(2)該類有五個成員變量,對應學生類的五個屬性,即學號、姓名、性別、分數(shù)1、分數(shù)2。對每個屬性需要定義屬性的類型,比如學號的類型可以是int,也可以是String,這需要根據(jù)學生的學號取值來定。如果學號全是整數(shù),可以使用int,也可以使用String;如果有其它字符,就只能使用String。

(3)成員變量還有一些其它的修飾符,如訪問控制符,靜態(tài)修飾符static,終態(tài)修飾符final等,會在后面具體說明。

(4)該類具有一個空的構造函數(shù)(目前暫時不用,具體在后面進行說明),使用new來調用該函數(shù)能夠生成一個Student類的對象。

(5)成員方法1用于求一個學生對象兩科分數(shù)的平均分。

(6)成員方法2用于顯示學生對象各個成員變量的信息。

5.2.3對象的基本概念

對象(object)是類的一個具體實例(instance),每個對象都有自己的成員變量和成員方法,在堆內存中具有一段內存空間以保存自己的成員變量,例如張三是學生類的一個具體學生對象。

上一節(jié)定義好了Student類,將現(xiàn)實世界的學生抽象到了程序中,這一節(jié)在程序中由該類產(chǎn)生具體的學生對象實例,如圖5-2所示。

圖5-2Student類與對象

定義好了Student類,就可以由類生成對象,主要語法是使用new調用類的構造函數(shù),在堆內存區(qū)域獲得一個對象的內存空間,在該空間中存放該對象的成員變量的值。例如語句“Students1=newStudent();”表示使用Student類生成了一個該類的對象,使用s1這個引用變量指向該對象,具體的內存示意圖如圖5-3所示。圖5-3Student對象內存示意圖

5.2.4對象的初始化

1.對象成員的類型

如何給s1對象中的成員進行賦值呢?首先要分清楚對象的成員有哪些類型,對象成員變量的類型主要有基本數(shù)據(jù)類型、JDK預定義類型和用戶自定義類型。

1)基本數(shù)據(jù)類型

如果某個成員變量是基本數(shù)據(jù)類型,即使沒有進行初始化,Java也會確保其有一個默認值,如表5-1所示。

2)?JDK預定義類型

預定義類型即JDK自帶的類,例如常用的字符串類String,學生類中很多成員變量都是String字符串類型的,如名字、性別、班級等等。JDK龐大的類庫能夠方便程序員構造程序,比如可以使用Date或者Calendar類來作為學生類的出生日期成員變量(出生日期)。在使用這些類作為成員變量類型時可查詢JDK幫助文檔,了解這些類的用法。

3)用戶自定義類型

也可以使用用戶自定義的類型來作為成員變量的類型,比如可以在學生類中定義一個Teacher(教師)類型的成員變量,表示學生的班主任屬性,那么在生成學生類對象的時候就要生成一個Teacher類對象作為該學生類對象的一個對象成員。

2.對象的初始化

學生類對象的初始化有以下兩種方式:

(1)使用圓點成員運算符(.)?!?”直接對指定對象的成員變量進行賦值:

s1.num=101;

="張三";

s1.gander="男";

s1.score1=80.0;

s1.score2=74.0;

(2)使用構造函數(shù)。構造函數(shù)的主要作用是對成員變量進行初始化??梢栽陬愔卸x不同參數(shù)的多個構造函數(shù)來對成員變量進行初始化(在一個類中有多個同名的函數(shù),但是參數(shù)列表不同,這稱為函數(shù)重載,在調用函數(shù)時根據(jù)傳入的參數(shù)來決定具體調用哪個函數(shù)),前面的Student類中只有一個空的構造函數(shù):

publicStudent1(){

}

函數(shù)定義的三個參數(shù)(intn,Strings,Stringg)是函數(shù)的形參,也是函數(shù)定義的局部變量。使用new調用該函數(shù)來生成學生類對象時,傳入三個實參(102,"李四","男"),分別交給n、s、g,然后該構造函數(shù)的函數(shù)體將這三個實參賦值給成員變量num、name和gander,這個賦值的內存示意圖如圖5-4所示。

圖5-4Student對象生成的內存示意圖

3.this

上述構造函數(shù)是寫在Student1類定義中的,定義該類的時候,是無法知道將要生成的對象名字是什么,所以用this這個關鍵字來代替將要生成的對象的名字,以構成“對象名.成員名”的形式,所以可以稱this為“當前(將要生成)對象的引用”。

除了構造函數(shù)能夠對成員變量初始化外,還可以使用一些成員函數(shù)來對指定的成員變量賦值或修改,如:

publicvoidsetNum(intnum){

this.num=num;

}

定義類的目的主要是生成對象,有了對象就能保存對象的成員變量值,并且調用對象的成員方法,這是面向對象編程的主要操作。成員方法往往代表了要提供的功能或服務,比如Student1類中有兩個成員方法,一個是用于求對象兩個成員變量的平均分,一個是用于顯示對象的信息。

程序示例5-2定義學生類。

程序分析:

(1)?Student2類中具有兩個構造函數(shù)的重載,在生成該類對象的時候,根據(jù)是否傳入?yún)?shù)來區(qū)分調用哪個構造函數(shù)。

(2)?Student2類中使用this來區(qū)分同名的成員變量和局部變量。

(3)定義好Student2類,在后面就能夠使用該類產(chǎn)生對象,并使用對象去調用其成員,完成相應的程序功能。

程序結果:

5.3構造函數(shù)

構造函數(shù)(constructor)是某個類用來生成該類對象的一類特殊函數(shù)。這里對構造函數(shù)總結如下:

1.構造函數(shù)的特點(1)構造函數(shù)的名字必須與類名一致。(2)構造函數(shù)沒有返回值類型。我們知道,函數(shù)定義的三要素中必須要有返回值類型,即使函數(shù)沒有返回值,在定義的時候也要用void修飾,但是構造函數(shù)既沒有返回值類型也沒有用void修飾。

2.構造函數(shù)的作用

(1)構造函數(shù)是使用new生成對象的時候被調用的函數(shù)。

(2)構造函數(shù)的功能主要是對對象成員變量進行初始化,在生成對象的時候能讓一些成員變量獲得值。

(3)可以按照程序的上下文和需求在對對象初始化的時候進行一些特定的操作,例如對構造函數(shù)實參的值范圍進行檢測等,但是不建議在該函數(shù)內進行復雜的邏輯處理,畢竟構造函數(shù)的主要作用是生成對象和初始化對象。

3.構造函數(shù)的重載

(1)一個類中具有多個構造函數(shù),但是參數(shù)列表不同,比如Student2類中就有兩個構造函數(shù),一個是沒有參數(shù)的,一個有三個參數(shù)對三個成員變量進行初始化。

(2)無參且空函數(shù)體的構造函數(shù),一般建議保留。如果在定義類的時候一個構造函數(shù)都沒寫,系統(tǒng)會自動生成一個無參空函數(shù)體的構造函數(shù);如果有了一個構造函數(shù),系統(tǒng)就不會再自動生成構造函數(shù)了。

(3)如果一個類有10個成員變量,需要寫幾個構造函數(shù)呢?可以根據(jù)軟件需求進行取舍,以方便在程序中進行調用。例如上述的Student2類,在實際生成對象的時候,必須對3個成員變量初始化,而有一些成員變量就可以在其它地方進行初始化。

(4)在一個類的一個構造函數(shù)中,可以使用this()來調用本類其它的構造函數(shù),如程序5-4所示。

5.4成?員?修?飾?符

5.4.1訪問控制符Java提供了3個訪問控制符,即private、protected和public,分別代表了三種訪問控制級別,另外還有一個不加任何訪問控制符的訪問控制級別,共四個訪問控制級別。Java訪問控制符的開放性如圖5-5所示,越往右邊,成員的可見性和可訪問性越趨于公開。

圖5-5訪問控制符的開放性

1.private(私有訪問權限)

如果類中的一個成員(包括成員變量、方法和構造器等)使用private訪問控制符來修飾,則這個成員只能在當前類的內部被訪問,對于外部類是不可見的。private訪問控制符用于修飾成員變量較合適,使用它來修飾成員變量就可以把成員變量隱藏在該類的內部,外部的類就不能直接使用“對象名.成員名”的方式來直接訪問該成員了。

為什么要采用較復雜的getter-setter方法,而不直接使用“對象名.成員名”方式直接來獲取/修改成員變量呢?原因如下:

(1)采用getter-setter方法能隱藏、保護對象的成員變量的數(shù)據(jù)。

(2)采用getter-setter方法的方式訪問和設置對象的成員,可以在方法中實施訪問、權限、日志記錄、修改值范圍等控制,如:

2.default(包package訪問權限)

如果類里的一個成員(包括成員變量、方法和構造器等)不使用任何訪問控制符修飾,就稱它為包(即文件夾)訪問權限。default訪問控制的成員可以被處于同一個包下的其他類訪問。在初學Java階段,使用這個進行訪問控制較為簡便。

3.protected(子類訪問權限)

如果一個成員(包括成員變量、方法和構造器等)使用protected訪問控制符修飾,那么這個成員既可以被同一個包中的其它類訪問,也可以被不同包中的子類(在后面的繼承知識點中將涉及)訪問。

4.?public(公共訪問權限)

這是一個最開放的訪問控制級別,如果一個成員(包括成員變量、方法和構造器等)或者一個外部類使用public訪問控制符修飾,那么這個成員或外部類就可以被所有類訪問,不管訪問類和被訪問類是否處于同一個包中,是否具有父子繼承關系,都可以直接使用“對象名.成員名”方式進行訪問或設置。

訪問控制修飾符的總結如表5-2所示。

5.4.2static修飾符

static修飾符可以修飾一個類的成員變量、成員方法和內部類等。

1.static修飾成員

在第3.5.2節(jié)中提到,類定義中的方法分為兩種:

(1)對象成員:不帶static修飾符,要使用該成員,必須先生成該類的對象,由對象調用該成員。

(2)類成員:帶static修飾符,可以由類名或者對象名來調用該成員,這樣的成員在內存中只有一個副本。

2.static修飾符的特點

(1)?static修飾的成員(變量/方法),隨著所在類的加載而被加載。當JVM把類的字節(jié)碼加載進JVM的時候,static修飾的成員已經(jīng)在內存中存在了,優(yōu)先于對象的存在,對象只有通過new創(chuàng)建出來后才會在堆內存中出現(xiàn)。

(2)?static修飾的成員被該類型的所有對象所共享;該類創(chuàng)建出來的任何對象,都可以訪問static成員;每個對象在內存中都有自己的副本,但是不管一個類具有多少個對象,static成員都只有一個副本。

(3)靜

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
  • 4. 未經(jīng)權益所有人同意不得將文件中的內容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內容本身不做任何修改或編輯,并不能對任何下載內容負責。
  • 6. 下載文件中如有侵權或不適當內容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

最新文檔

評論

0/150

提交評論