第2章類和對(duì)象的基本概念_第1頁
第2章類和對(duì)象的基本概念_第2頁
第2章類和對(duì)象的基本概念_第3頁
第2章類和對(duì)象的基本概念_第4頁
第2章類和對(duì)象的基本概念_第5頁
已閱讀5頁,還剩89頁未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

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

文檔簡介

1、Java語言程序設(shè)計(jì)(第2版)1第 2 章類與對(duì)象的基本概念2目錄2.1 面向?qū)ο蟮某绦蛟O(shè)計(jì)方法概述2.2 類與對(duì)象 2.3 對(duì)象初始化和回收 32.1 面向?qū)ο蟮某绦蛟O(shè)計(jì)方法概述(續(xù)) 面向?qū)ο蟮某绦蛟O(shè)計(jì) 與結(jié)構(gòu)化程序設(shè)計(jì)方法相比,更符合人類認(rèn)識(shí)現(xiàn)實(shí)世界的思維方式 已成為程序設(shè)計(jì)的主流方向 涉及的主要概念 抽象 封裝 繼承 多態(tài) 4 對(duì)象 現(xiàn)實(shí)世界中 萬物皆對(duì)象 都具有各自的屬性,對(duì)外界都呈現(xiàn)各自的行為 程序中 一切都是對(duì)象 都具有標(biāo)識(shí) (identity), 屬性和行為(方法) 通過一個(gè)或多個(gè)變量來保存其狀態(tài) 通過方法(method) 實(shí)現(xiàn)他的行為2.1 面向?qū)ο蟮某绦蛟O(shè)計(jì)方法概述(續(xù))5

2、 類 將屬性及行為相同或相似的對(duì)象歸為一類 類可以看成是對(duì)象的抽象,代表了此類對(duì)象所具有的共有屬性和行為 在面向?qū)ο蟮某绦蛟O(shè)計(jì)中,每一個(gè)對(duì)象都屬于某個(gè)特定的類, 2.1 面向?qū)ο蟮某绦蛟O(shè)計(jì)方法概述(續(xù))6 結(jié)構(gòu)化程序設(shè)計(jì) 通常由若干個(gè)程序模塊組成,每個(gè)程序模塊都可以是子程序或函數(shù) 數(shù)據(jù)和功能分離,代碼難于維護(hù)和復(fù)用 面向?qū)ο蟪绦蛟O(shè)計(jì) 基本組成單位是類 程序在運(yùn)行時(shí)由類生成對(duì)象,對(duì)象是面向?qū)ο蟪绦虻暮诵?對(duì)象之間通過發(fā)送消息進(jìn)行通信,互相協(xié)作完成相應(yīng)功能2.1 面向?qū)ο蟮某绦蛟O(shè)計(jì)方法概述(續(xù))72.1.1 抽象 抽象 忽略問題中與當(dāng)前目標(biāo)無關(guān)的方面,以便更充分地注意與當(dāng)前目標(biāo)有關(guān)的方面 例:鐘表

3、 數(shù)據(jù)(屬性) int Hour; int Minute; int Second; 方法(行為) SetTime(); ShowTime();2.1 面向?qū)ο蟮某绦蛟O(shè)計(jì)方法概述82.1.2 封裝 封裝 是一種信息隱蔽技術(shù) 利用抽象數(shù)據(jù)類型將數(shù)據(jù)和基于數(shù)據(jù)的操作封裝在一起 用戶只能看到對(duì)象的封裝界面信息,對(duì)象的內(nèi)部細(xì)節(jié)對(duì)用戶是隱蔽的 封裝的目的在于將對(duì)象的使用者和設(shè)計(jì)者分開,使用者不必知道行為實(shí)現(xiàn)的細(xì)節(jié),只需使用設(shè)計(jì)者提供的消息來訪問對(duì)象2.1 面向?qū)ο蟮某绦蛟O(shè)計(jì)方法概述9 封裝的定義 清楚的邊界 所有對(duì)象的內(nèi)部信息被限定在這個(gè)邊界內(nèi) 接口 對(duì)象向外界提供的方法,外界可以通過這些方法與對(duì)象進(jìn)行交

4、互 受保護(hù)的內(nèi)部實(shí)現(xiàn) 功能的實(shí)現(xiàn)細(xì)節(jié),不能從類外訪問。2.1.2 封裝(續(xù))2.1 面向?qū)ο蟮某绦蛟O(shè)計(jì)方法概述102.1.3 繼承 繼承 是指新的類可以獲得已有類(稱為超類、基類或父類)的屬性和行為,稱新類為已有類的派生類(也稱為子類) 在繼承過程中派生類繼承了基類的特性,包括方法和實(shí)例變量 派生類也可修改繼承的方法或增加新的方法,使之更適合特殊的需要 有助于解決軟件的可重用性問題,使程序結(jié)構(gòu)清晰,降低了編碼和維護(hù)的工作量2.1 面向?qū)ο蟮某绦蛟O(shè)計(jì)方法概述11 單繼承 任何一個(gè)派生類都只有單一的直接父類 類層次結(jié)構(gòu)為樹狀結(jié)構(gòu) 多繼承 一個(gè)類可以有一個(gè)以上的直接父類 類層次結(jié)構(gòu)為網(wǎng)狀結(jié)構(gòu),設(shè)計(jì)及

5、實(shí)現(xiàn)比較復(fù)雜 Java語言僅支持單繼承2.1.3 繼承(續(xù))2.1 面向?qū)ο蟮某绦蛟O(shè)計(jì)方法概述122.1.4 多態(tài) 多態(tài) 一個(gè)程序中同名的不同方法共存 主要通過子類對(duì)父類方法的覆蓋來實(shí)現(xiàn) 不同類的對(duì)象可以響應(yīng)同名的消息(方法) ,具體的實(shí)現(xiàn)方法卻不同 使語言具有靈活、抽象、行為共享、代碼共享的優(yōu)勢,很好地解決了應(yīng)用程序方法同名問題2.1 面向?qū)ο蟮某绦蛟O(shè)計(jì)方法概述13 類與對(duì)象 在程序中,對(duì)象是通過一種抽象數(shù)據(jù)類型來描述的,這種抽象數(shù)據(jù)類型稱為類(Class) 一個(gè)類是對(duì)一類對(duì)象的描述。類是構(gòu)造對(duì)象的模板 對(duì)象是類的具體實(shí)例2.2 類與對(duì)象142.2.1 類的聲明 聲明形式public abs

6、tract | final class 類名稱 extends 父類名稱 implements 接口名稱列表 變量成員聲明及初始化; 方法聲明及方法體; 類名首字母大寫 類里面的元素叫類的成員變量/屬性2.2 類與對(duì)象15 關(guān)鍵字 class 表明其后聲明的是一個(gè)類。 extends 如果所聲明的類是從某一父類派生而來,那么,父類的名字應(yīng)寫在extends之后 implements 如果所聲明的類要實(shí)現(xiàn)某些接口,那么,接口的名字應(yīng)寫在implements之后2.2.1 類的聲明(續(xù))2.2 類與對(duì)象16 修飾符 可以有多個(gè),用來限定類的使用方式 public 表明此類為公有類 abstract

7、 指明此類為抽象類 final 指明此類為終結(jié)類 類聲明體 變量成員聲明及初始化 可以有多個(gè) 方法聲明及方法體 可以有多個(gè)2.2.1 類的聲明(續(xù))2.2 類與對(duì)象17 鐘表類public class Clock / 成員變量成員變量 int hour ; int minute ; int second ; / 成員方法成員方法 public void setTime(int newH, int newM, int newS) hour=newH ; minute=newM ; second=news ; public void showTime() System.out.println(ho

8、ur+:+minute+:+second); 2.2.1 類的聲明(續(xù))例2-12.2 類與對(duì)象18 變量和對(duì)象 變量除了存儲(chǔ)基本數(shù)據(jù)類型的數(shù)據(jù),還能存儲(chǔ)對(duì)象的引用,用來存儲(chǔ)對(duì)象引用的變量稱為引用變量 類的對(duì)象也稱為類的實(shí)例2.2.2 對(duì)象的聲明與引用2.2 類與對(duì)象19 對(duì)象的聲明 格式類名 變量名 例如Clock是已經(jīng)聲明的類名,則下面語句聲明的變量aclock將用于存儲(chǔ)該類對(duì)象的引用: Clock aclock; 聲明一個(gè)引用變量時(shí)并沒有對(duì)象生成2.2.2 對(duì)象的聲明與引用(續(xù))2.2 類與對(duì)象20 對(duì)象的創(chuàng)建 生成實(shí)例的格式:new () 例如: aclock=new Clock()其

9、作用是: 在內(nèi)存中為此對(duì)象分配內(nèi)存空間 返回對(duì)象的引用(reference ,相當(dāng)于對(duì)象的存儲(chǔ)地址) 引用變量可以被賦以空值例如:aclock=null;2.2.2 對(duì)象的聲明與引用(續(xù))2.2 類與對(duì)象212.2.3 數(shù)據(jù)成員 數(shù)據(jù)成員表示Java類的狀態(tài)聲明數(shù)據(jù)成員必須給出變量名及其所屬的類型,同時(shí)還可以指定其他特性在一個(gè)類中成員變量名是唯一的數(shù)據(jù)成員的類型可以是Java中任意的數(shù)據(jù)類型(簡單類型,類,接口,數(shù)組)2.2 類與對(duì)象22 聲明格式public | protected | private static finaltransient volatile變量數(shù)據(jù)類型 變量名1=變量初

10、值, 變量名2=變量初值, ; 格式說明 public、protected、private 為訪問控制符 static指明這是一個(gè)靜態(tài)成員變量 final指明變量的值不能被修改 transient指明變量是臨時(shí)狀態(tài) volatile指明變量是一個(gè)共享變量2.2.3 數(shù)據(jù)成員(續(xù))2.2 類與對(duì)象23 實(shí)例變量 沒有static修飾的變量稱為實(shí)例變量(Instance Variables) 用來存儲(chǔ)所有實(shí)例都需要的屬性信息,不同實(shí)例的屬性值可能會(huì)不同 可通過下面的表達(dá)式訪問實(shí)例屬性的值.2.2 類與對(duì)象2.2.3 數(shù)據(jù)成員(續(xù))實(shí)例變量24 聲明一個(gè)表示圓的類,保存在文件Circle.java

11、中。然后編寫測試類,保存在文件ShapeTester.java中,并與Circle.java放在相同的目錄下public class Circle int radius; public class ShapeTester public static void main(String args) Circle x; x = new Circle(); System.out.println(x); System.out.println(radius = + x.radius); 2.2 類與對(duì)象2.2.3 數(shù)據(jù)成員(續(xù))例2-225 編譯后運(yùn)行結(jié)果如下:Circle26b249radius =0

12、解釋 默認(rèn)的toString()返回: 其中后面表示的是x所指對(duì)象存儲(chǔ)的地址2.2 類與對(duì)象2.2.3 數(shù)據(jù)成員(續(xù))例2-2的運(yùn)行結(jié)果26 聲明一個(gè)表示矩形的類,保存在Rectangle.java中;編寫測試類,保存在ShapeTester.java中,二文件保存在相同的目錄下public class Rectangle double width = 10.128; double height = 5.734; public class ShapeTester public static void main(String args) Circle x; Rectangle y; x = ne

13、w Circle(); y = new Rectangle(); System.out.println(x + + y); 2.2 類與對(duì)象2.2.3 數(shù)據(jù)成員(續(xù))例2-327 編譯后運(yùn)行結(jié)果如下:Circle82f0db Rectangle92d3422.2 類與對(duì)象2.2.3 數(shù)據(jù)成員(續(xù))例2-3的運(yùn)行結(jié)果28 對(duì)ShapeTester類進(jìn)行修改,使兩個(gè)實(shí)例具有不同的實(shí)例變量值public class ShapeTester public static void main(String args) Circle x; Rectangle y, z; x = new Circle();

14、y = new Rectangle(); z = new Rectangle(); x.radius = 50; z.width = 68.94; z.height = 47.54; System.out.println(x.radius + + y.width + + z.width); 2.2 類與對(duì)象2.2.3 數(shù)據(jù)成員(續(xù))例2-3修改29 編譯后運(yùn)行結(jié)果如下:50 10.128 68.94 解釋 Circle及Rectangle類對(duì)象的狀態(tài)如圖2.2 類與對(duì)象2.2.3 數(shù)據(jù)成員(續(xù))修改后運(yùn)行結(jié)果30 地址簿程序 一個(gè)人的地址通常包括以下信息:姓名,省份,城市,街道,門牌號(hào),郵政編

15、碼 采用過程化的程序設(shè)計(jì)方法,使用簡單變量存儲(chǔ),則存儲(chǔ)兩個(gè)人地址的代碼如下2.2 類與對(duì)象2.2.3 數(shù)據(jù)成員(續(xù))例2-431public static void main(String args) String name1,name2; int gateNumber1, gateNumber2; String streetName1,streetName2; String city1,city2; String province1,province2; String postalCode1,postalCode2; name1 = Zhang Li; gateNumber1 = 15; s

16、treetName1 = Tsinghua East Road; city1 = Beijing; province1 = “Beijing; postalCode1 = 100084; name2 = Li Hong; gateNumber2 = 2; streetName2 = BeiNong; city2 = Beijing; province2 = Beijing; postalCode2 = 102206; /.do something interesting 2.2 類與對(duì)象2.2.3 數(shù)據(jù)成員(續(xù))例2-432 采用面向?qū)ο蟮某绦蛟O(shè)計(jì)方法,則需要首先聲明Address類如下pub

17、lic class Address String name; int gateNumber; String streetName; String city; String province; String postalCode; /方法成員略 2.2 類與對(duì)象2.2.3 數(shù)據(jù)成員(續(xù))例2-433 主方法改寫如下public static void main(String args) Address address1 = new Address(), address2 = new Address(); = “Zhang Li; address1.streetNumb

18、er = 15; address1.streetName = “Tsinghua East Road; address1.city = “Beijing; vince = “Beijing; address1.postalCode = “100084; = “Li Hong; address2.streetNumber = 2; address2.streetName = “BeiNong; address2.city = “Beijing; vince = “Beijing; address2.postalCode

19、= “102206; /.do something interesting 2.2 類與對(duì)象2.2.3 數(shù)據(jù)成員(續(xù))例2-434 類變量 也稱為靜態(tài)變量,聲明時(shí)需加static修飾符 不管類的對(duì)象有多少,類變量只存在一份,在整個(gè)類中只有一個(gè)值 類初始化的同時(shí)就被賦值 適用情況 類中所有對(duì)象都相同的屬性 經(jīng)常需要共享的數(shù)據(jù) 系統(tǒng)中用到的一些常量值 引用格式.2.2 類與對(duì)象2.2.3 數(shù)據(jù)成員(續(xù))類變量35 對(duì)于一個(gè)圓類的所有對(duì)象,計(jì)算圓的面積時(shí),都需用到的值,可在Circle類的聲明中增加一個(gè)類屬性PIpublic class Circle static double PI = 3.141

20、59265; int radius; 當(dāng)我們生成Circle類的實(shí)例時(shí),在每一個(gè)實(shí)例中并沒有存儲(chǔ)PI的值,PI的值存儲(chǔ)在類中2.2 類與對(duì)象2.2.3 數(shù)據(jù)成員(續(xù))例2-536 對(duì)類變量進(jìn)行測試public class ClassVariableTester public static void main(String args) Circle x = new Circle(); System.out.println(x.PI); System.out.println(Circle.PI); Circle.PI = 3.14; System.out.println(x.PI); System

21、.out.println(Circle.PI); 測試結(jié)果3.141592653.1415926.3 數(shù)據(jù)成員(續(xù))例2-5運(yùn)行結(jié)果2.2 類與對(duì)象37 聲明一個(gè)Point類,有兩個(gè)私有變量保存點(diǎn)坐標(biāo),一個(gè)類變量保存已有點(diǎn)的個(gè)數(shù)public class Point private int x; private int y; public static int pointCount=0; public Point(int x, int y) this.x = x; this.y = y; pointCount+;2.2 類與對(duì)象2.2.3 數(shù)據(jù)成員(續(xù))Point.jav

22、a38 測試類ex2_4class ex2_4 public static void main(String args) Point p = new Point(1,1); System.out.println(p.pointCount); Point q = new Point(2,2); System.out.println(q.pointCount); System.out.println(q.pointCount = Point.pointCount); System.out.println(Point.pointCount);2.2 類與對(duì)象2.2.3 數(shù)據(jù)成員(續(xù))Point類測試

23、39 測試結(jié)果12true2 2.2 類與對(duì)象2.2.3 數(shù)據(jù)成員(續(xù))Point類測試結(jié)果402.2.4 方法成員 方法成員 定義類的行為 一個(gè)對(duì)象能夠做的事情 我們能夠從一個(gè)對(duì)象取得的信息 可以沒有,也可以有多個(gè);一旦在類中聲明了方法,它就成為了類聲明的一部分 分為實(shí)例方法和類方法2.2 類與對(duì)象41 聲明格式public | protected | private static finalabstract synchronized返回類型 方法名(參數(shù)列表) throws exceptionList方法體2.2 類與對(duì)象2.2.4 方法成員(續(xù))聲明格式42 格式說明 方法修飾 publ

24、ic、protected、private 為存取控制符 static指明方法是一個(gè)類方法 final指明方法是一個(gè)終結(jié)方法 abstract指明方法是一個(gè)抽象方法 synchronized用來控制多個(gè)并發(fā)線程對(duì)共享數(shù)據(jù)的訪問2.2 類與對(duì)象2.2.4 方法成員(續(xù))格式說明43 格式說明(續(xù)) 返回類型 方法返回值的類型,可以是任意的Java數(shù)據(jù)類型 當(dāng)不需要返回值時(shí),返回類型為void 參數(shù)類型 簡單數(shù)據(jù)類型, 引用類型(數(shù)組、類或接口) 可以有多個(gè)參數(shù),也可以沒有參數(shù),方法聲明時(shí)的參數(shù)稱為形式參數(shù) 方法體 方法的實(shí)現(xiàn) 包括局部變量的聲明以及所有合法的Java指令 局部變量的作用域只在該方法

25、內(nèi)部 throws exceptionList 用來處理異常2.2 類與對(duì)象2.2.4 方法成員(續(xù))格式說明44 方法調(diào)用 給對(duì)象發(fā)消息意味著調(diào)用對(duì)象的某個(gè)方法 從對(duì)象中取得信息 修改對(duì)象的狀態(tài)或進(jìn)行某種操作 進(jìn)行計(jì)算及取得結(jié)果等 調(diào)用格式.(參數(shù)列表)稱點(diǎn)操作符“.”前面的為消息的接收者(receiver) 參數(shù)傳遞 值傳遞:參數(shù)類型為基本數(shù)據(jù)類型時(shí) 引用傳遞:參數(shù)類型為對(duì)象類型或數(shù)組時(shí)2.2 類與對(duì)象2.2.4 方法成員(續(xù))方法調(diào)用45 實(shí)例方法 表示特定對(duì)象的行為 聲明時(shí)前面不加static修飾符 使用時(shí)需要發(fā)送給一個(gè)類實(shí)例2.2 類與對(duì)象2.2.4 方法成員(續(xù))實(shí)例方法46 在C

26、ircle類中聲明計(jì)算周長的方法 public class Circle static double PI = 3.14159265; int radius; public double circumference() return 2 * PI * radius; 由于radius是實(shí)例變量,在程序運(yùn)行時(shí),Java會(huì)自動(dòng)取其接收者對(duì)象的屬性值 也可將circumference方法體改為:return 2 * PI * this.radius; 關(guān)鍵字this代表此方法的接收者對(duì)象2.2 類與對(duì)象2.2.4 方法成員(續(xù))例2-647 方法調(diào)用測試public class Circumfere

27、nceTester public static void main(String args) Circle c1 = new Circle(); c1.radius = 50; Circle c2 = new Circle(); c2.radius = 10; double circum1 = c1.circumference(); double circum2 = c2.circumference(); System.out.println(Circle 1 has circumference + circum1); System.out.println(Circle 2 has circu

28、mference + circum2); 2.2 類與對(duì)象2.2.4 方法成員(續(xù))例2-648 運(yùn)行結(jié)果Circle 1 has circumference 314.159265Circle 2 has circumference 62.831853 說明 在使用實(shí)例方法時(shí),需要將其發(fā)送給一個(gè)實(shí)例對(duì)象(也稱給對(duì)象發(fā)送一條消息),radius的值即是接收者對(duì)象的值 在執(zhí)行c1.circumference()時(shí),radius的值為c1的radius屬性值;在執(zhí)行c2.circumference()時(shí),radius的值為c2的radius屬性值2.2 類與對(duì)象2.2.4 方法成員(續(xù))例2-6運(yùn)行

29、結(jié)果49 在Circle類及Rectangle類中聲明計(jì)算面積的方法area()public class Circle static double PI = 3.14159265; int radius; public double circumference() return 2 * PI * radius; public double area() return PI * radius * radius; public class Rectangle double width; double height; public double area() return width * heigh

30、t; 2.2 類與對(duì)象2.2.4 方法成員(續(xù))例2-750 聲明測試類,對(duì)Circle類及Rectangle類的area()方法進(jìn)行測試 public class AreaTester public static void main(String args) Circle c = new Circle(); c.radius = 50; Rectangle r = new Rectangle(); r.width = 20; r.height = 30; System.out.println(Circle has area + c.area(); System.out.println(Rec

31、tangle has area + r.area(); 2.2 類與對(duì)象2.2.4 方法成員(續(xù))例2-751 運(yùn)行結(jié)果Circle has area 7853.981625Rectangle has area 600.0 說明 不同的類中可以聲明相同方法名的方法 使用時(shí),系統(tǒng)會(huì)根據(jù)接收者對(duì)象的類型找到相應(yīng)類的方法2.2 類與對(duì)象2.2.4 方法成員(續(xù))例2-7運(yùn)行結(jié)果52 帶參數(shù)的方法舉例:在Circle類中增加方法改變圓的半徑public class Circle static double PI = 3.14159265; int radius; public double circu

32、mference() return 2 * PI * radius; public double area() return PI * radius * radius; public void enlarge(int factor) radius = radius * factor; 2.2 類與對(duì)象2.2.4 方法成員(續(xù))例2-853 測試類public class EnlargeTester public static void main(String args) Circle c1 = new Circle(); c1.radius = 50; Circle c2 = new Circ

33、le(); c2.radius = 10; System.out.println(Circle 1 的周長: + c1.circumference(); System.out.println(Circle 2 的周長: + c2.circumference(); c2.enlarge(4); System.out.println(Circle 2 擴(kuò)大后的周長: + c2.circumference(); 2.2 類與對(duì)象2.2.4 方法成員(續(xù))例2-854 運(yùn)行結(jié)果Circle 1 的周長: 314.159265Circle 2 的周長: 62.831853Circle 2 擴(kuò)大后的周長:

34、 251.3274122.2 類與對(duì)象2.2.4 方法成員(續(xù))例2-8運(yùn)行結(jié)果55 類方法 也稱為靜態(tài)方法,表示類中對(duì)象的共有行為 聲明時(shí)前面需加static修飾符 不能被聲明為抽象的 類方法可以在不建立對(duì)象的情況下用類名直接調(diào)用,也可用類實(shí)例調(diào)用2.2 類與對(duì)象2.2.4 方法成員(續(xù))類方法56 將攝氏溫度(centigrade)轉(zhuǎn)換成華氏溫度(fahrenheit) 轉(zhuǎn)換公式為 fahrenheit = centigrade * 9 / 5 + 32 除了攝氏溫度值及公式中需要的常量值,此功能不依賴于具體的類實(shí)例的屬性值,因此可聲明為類方法 轉(zhuǎn)換方法centigradeToFahren

35、heit放在類Converter中public class Converter public static int centigradeToFahrenheit(int cent) return (cent * 9 / 5 + 32); 方法調(diào)用Converter.centigradeToFahrenheit(40)2.2 類與對(duì)象2.2.4 方法成員(續(xù))例2-1057 包 是一組類的集合 一個(gè)包可以包含若干個(gè)類文件,還可包含若干個(gè)包 包的作用 將相關(guān)的源代碼文件組織在一起 類名的空間管理,利用包來劃分名字空間,便可以避免類名沖突 提供包一級(jí)的封裝及存取權(quán)限2.2 類與對(duì)象2.2.5 類的組

36、織包的概念58 包的命名 每個(gè)包的名稱必須是“獨(dú)一無二”的 Java中包名使用小寫字母表示 命名方式建議 將機(jī)構(gòu)的Internet域名反序,作為包名的前導(dǎo) 若包名中有任何不可用于標(biāo)識(shí)符的字符,用下劃線替代 若包名中的任何部分與關(guān)鍵字沖突,后綴下劃線 若包名中的任何部分以數(shù)字或其他不能用作標(biāo)識(shí)符起始的字符開頭,前綴下劃線2.2 類與對(duì)象2.2.5 類的組織包的概念59 編譯單元與類空間 一個(gè)Java源代碼文件稱為一個(gè)編譯單元,由三部分組成 所屬包的聲明(省略,則屬于默認(rèn)包) Import (引入)包的聲明,用于導(dǎo)入外部的類 類和接口的聲明 一個(gè)編譯單元中只能有一個(gè)public類,該類名與文件名相

37、同,編譯單元中的其他類往往是public類的輔助類,經(jīng)過編譯,每個(gè)類都會(huì)產(chǎn)一個(gè)class文件 利用包來劃分名字空間,便可以避免類名沖突2.2 類與對(duì)象2.2.5 類的組織包的概念(續(xù))60 包的聲明 命名的包(命名的包(Named Packages) 例如: package Mypackage; 默認(rèn)包(未命名的包)默認(rèn)包(未命名的包) 不含有包聲明的編譯單元是默認(rèn)包的一部分2.2 類與對(duì)象2.2.5 類的組織包的概念(續(xù))61 包與目錄 Java使用文件系統(tǒng)來存儲(chǔ)包和類 包名就是文件夾名,即目錄名 目錄名并不一定是包名 用javac編譯源程序時(shí),如遇到當(dāng)前目錄(包)中沒有聲明的類,就會(huì)以環(huán)境

38、變量classpath為相對(duì)查找路徑,按照包名的結(jié)構(gòu)來查找。因此,要指定搜尋包的路徑,需設(shè)置環(huán)境變量classpath2.2 類與對(duì)象2.2.5 類的組織包的概念(續(xù))62 引入包 為了使用其它包中所提供的類,需要使用import語句引入所需要的類 Java編譯器為所有程序自動(dòng)引入包java.lang import語句的格式 import package1.package2. (classname |*); 其中package1.package2表明包的層次,它對(duì)應(yīng)于文件目錄 classname則指明所要引入的類名 如果要引入一個(gè)包中的所有類,則可以使用星號(hào)(*)來代替類名2.2 類與對(duì)象2.

39、2.5 類的組織包的概念(續(xù))63 靜態(tài)引入 Java 5 新特性 在Java 5之前,通過類名使用類的靜態(tài)成員。例如,Math.PI,Math.sin(double) 如果在程序中需要多次使用靜態(tài)成員,則每次使用都需要加上類名 靜態(tài)引入分為兩種:單一引入和全體引入 單一引入是指引入某一個(gè)指定的靜態(tài)成員,例如:import static java.lang.Math.PI; 全體引入是指引入類中所有的靜態(tài)成員,例如:import static java.lang.Math.*; 2.2 類與對(duì)象2.2.5 類的組織包的概念(續(xù))64import static java.lang.Math.PI

40、;public class Circle int radius; public double circumference() return 2 * PI * radius; 2.2 類與對(duì)象2.2.5 類的組織包的概念(續(xù)) 例2-1265 類的訪問控制 類的訪問控制只有public(公共類)及無修飾符(缺省類)兩種 訪問權(quán)限符與訪問能力之間的關(guān)系如表類型無修飾public同一包中的類同一包中的類yesyes不同包中的類不同包中的類noyes2.2 類與對(duì)象2.2.6 類的訪問控制66 類成員的訪問控制 公有(public) 可以被其他任何對(duì)象訪問(前提是對(duì)類成員所在的類有訪問權(quán)限) 保護(hù)(p

41、rotected) 只可被同一類及其子類的實(shí)例對(duì)象訪問 私有(private) 只能被這個(gè)類本身訪問,在類外不可見 默認(rèn)(default) 僅允許同一個(gè)包內(nèi)的訪問;又被稱為“包(package)訪問權(quán)限”2.2 類與對(duì)象2.2.6 類的訪問控制67類型private無修飾protectedpublic同一類yesyesyesyes同一包中的子類noyesyesyes同一包中的非子類noyesyesyes不同包中的子類nonoyesyes不同包中的非子類nononoyes2.2 類與對(duì)象2.2.6 類的訪問控制(續(xù))68 對(duì)例2-6中的Circle類聲明進(jìn)行修改,給實(shí)例變量加上private修飾

42、符public class Circle static double PI = 3.14159265; private int radius; public double circumference() return 2 * PI * radius; 2.2 類與對(duì)象2.2.6 類的訪問控制(續(xù))例2-1369 再編譯CircumferenceTester.javapublic class CircumferenceTester public static void main(String args) Circle c1 = new Circle(); c1.radius = 50; Circ

43、le c2 = new Circle(); c2.radius = 10; double circum1 = c1.circumference(); double circum2 = c2.circumference(); System.out.println(Circle 1 has circumference + circum1); System.out.println(Circle 2 has circumference + circum2); 2.2 類與對(duì)象2.2.6 類的訪問控制(續(xù))例2-1370 編譯時(shí)會(huì)提示出錯(cuò)在編譯語句“c1.radius = 50;”及“c2.radius

44、 =10;”時(shí)會(huì)提示存在語法錯(cuò)誤“radius has private access in Circle” 說明 由于在Circle類聲明中變量radius被聲明為private,因此在其它類中不能直接對(duì)radius進(jìn)行存取 如果要允許其它類訪問radius的值,就需要在Circle類中聲明相應(yīng)的公有方法。通常有兩類典型的方法用于訪問屬性值,get方法及set方法2.2 類與對(duì)象2.2.6 類的訪問控制(續(xù))例2-13編譯71 get方法 功能是取得屬性變量的值 get方法名以“get”開頭,后面是實(shí)例變量的名字 一般具有以下格式:public get() return ; 對(duì)于實(shí)例變量rad

45、ius,聲明其get方法如下:public int getRadius() return radius; 2.2 類與對(duì)象2.2.6 類的訪問控制(續(xù))get方法72 set方法 功能是修改屬性變量的值 set方法名以“set”開頭,后面是實(shí)例變量的名字 一般具有以下格式public void set( ) = ; 聲明實(shí)例變量radius的set方法如下:public void setRadius(int r) radius = r;2.2 類與對(duì)象2.2.6 類的訪問控制(續(xù))set方法73 關(guān)鍵字this的使用 如果形式參數(shù)名與實(shí)例變量名相同,則需要在實(shí)例變量名之前加this關(guān)鍵字,否則

46、系統(tǒng)會(huì)將實(shí)例變量當(dāng)成形式參數(shù)。 在上面的set方法中,如果形式參數(shù)為radius,則需要在成員變量radius之前加上關(guān)鍵字this。代碼如下:public void setRadius(int radius) this.radius = radius; 2.2 類與對(duì)象2.2.6 類的訪問控制(續(xù))set方法742.3 對(duì)象初始化和回收 對(duì)象初始化 系統(tǒng)在生成對(duì)象時(shí),會(huì)為對(duì)象分配內(nèi)存空間,并自動(dòng)調(diào)用構(gòu)造方法對(duì)實(shí)例變量進(jìn)行初始化 對(duì)象回收 對(duì)象不再使用時(shí),系統(tǒng)會(huì)調(diào)用垃圾回收程序?qū)⑵湔加玫膬?nèi)存回收752.3.1 構(gòu)造方法 構(gòu)造方法 一種和類同名的特殊方法 用來初始化對(duì)象 Java中的每個(gè)類都有構(gòu)

47、造方法,用來初始化該類的一個(gè)新的對(duì)象 沒有定義構(gòu)造方法的類,系統(tǒng)自動(dòng)提供默認(rèn)的構(gòu)造方法2.3 對(duì)象初始化和回收76 構(gòu)造方法的特點(diǎn) 方法名與類名相同 沒有返回類型,修飾符void也不能有 通常被聲明為公有的(public) 可以有任意多個(gè)參數(shù) 主要作用是完成對(duì)象的初始化工作 不能在程序中顯式的調(diào)用 在生成一個(gè)對(duì)象時(shí),系統(tǒng)會(huì)自動(dòng)調(diào)用該類的構(gòu)造方法為新生成的對(duì)象初始化2.3.1 構(gòu)造方法(續(xù))2.3 對(duì)象初始化和回收77 系統(tǒng)提供的默認(rèn)構(gòu)造方法 如果在類的聲明中沒有聲明構(gòu)造方法,則Java編譯器會(huì)提供一個(gè)默認(rèn)的構(gòu)造方法 默認(rèn)的構(gòu)造方法沒有參數(shù),其方法體為空 使用默認(rèn)的構(gòu)造方法初始化對(duì)象時(shí),如果在類

48、聲明中沒有給實(shí)例變量賦初值,則對(duì)象的屬性值為零或空2.3 對(duì)象初始化和回收2.3.1 構(gòu)造方法(續(xù))默認(rèn)構(gòu)造方法78 聲明一個(gè)銀行帳號(hào)類及測試代碼public class BankAccountString ownerName; int accountNumber; float balance;public class BankTester public static void main(String args) BankAccount myAccount = new BankAccount(); System.out.println(ownerName= + myAccount.ownerN

49、ame); System.out.println(accountNumber= + myAccount.accountNumber); System.out.println(balance= + myAccount.balance);2.3 對(duì)象初始化和回收2.3.1 構(gòu)造方法(續(xù))例2-14(默認(rèn)構(gòu)造方法)79 運(yùn)行結(jié)果ownerName=nullaccountNumber=0balance=0.02.3 對(duì)象初始化和回收2.3.1 構(gòu)造方法(續(xù))例2-14運(yùn)行結(jié)果80 自定義構(gòu)造方法與方法重載 可在生成對(duì)象時(shí)給構(gòu)造方法傳送初始值,使用希望的值給對(duì)象初始化 構(gòu)造方法可以被重載,構(gòu)造方法的重載

50、和方法的重載一致 一個(gè)類中有兩個(gè)及以上同名的方法,但參數(shù)表不同,這種情況就被稱為方法重載。在方法調(diào)用時(shí),Java可以通過參數(shù)列表的不同來辨別應(yīng)調(diào)用哪一個(gè)方法2.3 對(duì)象初始化和回收2.3.1 構(gòu)造方法(續(xù))自定義構(gòu)造方法81 為BankAccount聲明一個(gè)有三個(gè)參數(shù)的構(gòu)造方法public BankAccount(String initName, int initAccountNumber, float initBalance) ownerName = initName; accountNumber = initAccountNumber; balance = initBalance; 假設(shè)一

51、個(gè)新帳號(hào)的初始余額可以為0,則可增加一個(gè)帶有兩個(gè)參數(shù)的構(gòu)造方法public BankAccount(String initName, int initAccountNumber) ownerName = initName; accountNumber = initAccountNumber; balance = 0.0f; 2.3 對(duì)象初始化和回收2.3.1 構(gòu)造方法(續(xù))例2-1582 自定義無參的構(gòu)造方法 無參的構(gòu)造方法對(duì)其子類的聲明很重要。如果在一個(gè)類中不存在無參的構(gòu)造方法,則要求其子類聲明時(shí)必須聲明構(gòu)造方法,否則在子類對(duì)象的初始化時(shí)會(huì)出錯(cuò) 在聲明構(gòu)造方法時(shí),好的聲明習(xí)慣是 不聲明構(gòu)造方

52、法 如果聲明,至少聲明一個(gè)無參構(gòu)造方法2.3 對(duì)象初始化和回收2.3.1 構(gòu)造方法(續(xù))自定義無參構(gòu)造方法83 構(gòu)建一個(gè)Bush類,有兩個(gè)有參數(shù)的構(gòu)造方法class Bush Bush(int i) Bush(double d) 如果寫:new Bush(); 編譯器將要告訴你找不到對(duì)應(yīng)的構(gòu)造方法 說明 用戶在進(jìn)行類聲明時(shí),如果沒有聲明任何構(gòu)造方法,系統(tǒng)會(huì)賦給此類一個(gè)默認(rèn)(無參)的構(gòu)造方法。但是,只要用戶聲明了構(gòu)造方法,即使沒有聲明無參的構(gòu)造方法,系統(tǒng)也不再賦默認(rèn)的構(gòu)造方法2.3 對(duì)象初始化和回收2.3.1 構(gòu)造方法(續(xù))Bush.java84 在例2-13基礎(chǔ)上再聲明一個(gè)無參的構(gòu)造方法pub

53、lic BankAccount() ownerName = ; accountNumber = 999999; balance = 0.0f; 2.3 對(duì)象初始化和回收2.3.1 構(gòu)造方法(續(xù))例2-1685 創(chuàng)建一個(gè)擁有兩個(gè)構(gòu)造方法的Tree類,一個(gè)有參,一個(gè)無參。import java.util.*;class Tree int height; Tree() prt(Planting a seedling); height = 0; Tree(int i) prt(Creating new Tree that is + i + feet tall); height = i; void in

54、fo() prt(Tree is + height + feet tall); void info(String s) prt(s + : Tree is + height + feet tall); static void prt(String s) System.out.println(s); 2.3 對(duì)象初始化和回收2.3.1 構(gòu)造方法(續(xù))Tree.java86 測試Tree類public class Overloading public static void main(String args) for(int i = 0; i 5; i+) Tree t = new Tree(i); (); (overloaded method); new Tree(); 2.3 對(duì)象初始化和回收2.3.1 構(gòu)造方法(續(xù))Overloading.java87 測試結(jié)果Creating new Tree that is 0 feet tallTree is 0 feet talloverloaded method: Tree is 0 fee

溫馨提示

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

最新文檔

評(píng)論

0/150

提交評(píng)論