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

下載本文檔

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

文檔簡介

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

2、 類 將屬性及行為相同或相似的對象歸為一類 類可以看成是對象的抽象,代表了此類對象所具有的共有屬性和行為 在面向?qū)ο蟮某绦蛟O(shè)計中,每一個對象都屬于某個特定的類, 2.1 面向?qū)ο蟮某绦蛟O(shè)計方法概述(續(xù))6 結(jié)構(gòu)化程序設(shè)計 通常由若干個程序模塊組成,每個程序模塊都可以是子程序或函數(shù) 數(shù)據(jù)和功能分離,代碼難于維護(hù)和復(fù)用 面向?qū)ο蟪绦蛟O(shè)計 基本組成單位是類 程序在運(yùn)行時由類生成對象,對象是面向?qū)ο蟪绦虻暮诵?對象之間通過發(fā)送消息進(jìn)行通信,互相協(xié)作完成相應(yīng)功能2.1 面向?qū)ο蟮某绦蛟O(shè)計方法概述(續(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è)計方法概述82.1.2 封裝 封裝 是一種信息隱蔽技術(shù) 利用抽象數(shù)據(jù)類型將數(shù)據(jù)和基于數(shù)據(jù)的操作封裝在一起 用戶只能看到對象的封裝界面信息,對象的內(nèi)部細(xì)節(jié)對用戶是隱蔽的 封裝的目的在于將對象的使用者和設(shè)計者分開,使用者不必知道行為實(shí)現(xiàn)的細(xì)節(jié),只需使用設(shè)計者提供的消息來訪問對象2.1 面向?qū)ο蟮某绦蛟O(shè)計方法概述9 封裝的定義 清楚的邊界 所有對象的內(nèi)部信息被限定在這個邊界內(nèi) 接口 對象向外界提供的方法,外界可以通過這些方法與對象進(jìn)行交

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

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

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

7、 指明此類為抽象類 final 指明此類為終結(jié)類 類聲明體 變量成員聲明及初始化 可以有多個 方法聲明及方法體 可以有多個2.2.1 類的聲明(續(xù))2.2 類與對象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 類與對象18 變量和對象 變量除了存儲基本數(shù)據(jù)類型的數(shù)據(jù),還能存儲對象的引用,用來存儲對象引用的變量稱為引用變量 類的對象也稱為類的實(shí)例2.2.2 對象的聲明與引用2.2 類與對象19 對象的聲明 格式類名 變量名 例如Clock是已經(jīng)聲明的類名,則下面語句聲明的變量aclock將用于存儲該類對象的引用: Clock aclock; 聲明一個引用變量時并沒有對象生成2.2.2 對象的聲明與引用(續(xù))2.2 類與對象20 對象的創(chuàng)建 生成實(shí)例的格式:new () 例如: aclock=new Clock()其

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

10、值, 變量名2=變量初值, ; 格式說明 public、protected、private 為訪問控制符 static指明這是一個靜態(tài)成員變量 final指明變量的值不能被修改 transient指明變量是臨時狀態(tài) volatile指明變量是一個共享變量2.2.3 數(shù)據(jù)成員(續(xù))2.2 類與對象23 實(shí)例變量 沒有static修飾的變量稱為實(shí)例變量(Instance Variables) 用來存儲所有實(shí)例都需要的屬性信息,不同實(shí)例的屬性值可能會不同 可通過下面的表達(dá)式訪問實(shí)例屬性的值.2.2 類與對象2.2.3 數(shù)據(jù)成員(續(xù))實(shí)例變量24 聲明一個表示圓的類,保存在文件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 類與對象2.2.3 數(shù)據(jù)成員(續(xù))例2-225 編譯后運(yùn)行結(jié)果如下:Circle26b249radius =0

12、解釋 默認(rèn)的toString()返回: 其中后面表示的是x所指對象存儲的地址2.2 類與對象2.2.3 數(shù)據(jù)成員(續(xù))例2-2的運(yùn)行結(jié)果26 聲明一個表示矩形的類,保存在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 類與對象2.2.3 數(shù)據(jù)成員(續(xù))例2-327 編譯后運(yùn)行結(jié)果如下:Circle82f0db Rectangle92d3422.2 類與對象2.2.3 數(shù)據(jù)成員(續(xù))例2-3的運(yùn)行結(jié)果28 對ShapeTester類進(jìn)行修改,使兩個實(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 類與對象2.2.3 數(shù)據(jù)成員(續(xù))例2-3修改29 編譯后運(yùn)行結(jié)果如下:50 10.128 68.94 解釋 Circle及Rectangle類對象的狀態(tài)如圖2.2 類與對象2.2.3 數(shù)據(jù)成員(續(xù))修改后運(yùn)行結(jié)果30 地址簿程序 一個人的地址通常包括以下信息:姓名,省份,城市,街道,門牌號,郵政編

15、碼 采用過程化的程序設(shè)計方法,使用簡單變量存儲,則存儲兩個人地址的代碼如下2.2 類與對象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 類與對象2.2.3 數(shù)據(jù)成員(續(xù))例2-432 采用面向?qū)ο蟮某绦蛟O(shè)計方法,則需要首先聲明Address類如下pub

17、lic class Address String name; int gateNumber; String streetName; String city; String province; String postalCode; /方法成員略 2.2 類與對象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 類與對象2.2.3 數(shù)據(jù)成員(續(xù))例2-434 類變量 也稱為靜態(tài)變量,聲明時需加static修飾符 不管類的對象有多少,類變量只存在一份,在整個類中只有一個值 類初始化的同時就被賦值 適用情況 類中所有對象都相同的屬性 經(jīng)常需要共享的數(shù)據(jù) 系統(tǒng)中用到的一些常量值 引用格式.2.2 類與對象2.2.3 數(shù)據(jù)成員(續(xù))類變量35 對于一個圓類的所有對象,計算圓的面積時,都需用到的值,可在Circle類的聲明中增加一個類屬性PIpublic class Circle static double PI = 3.141

20、59265; int radius; 當(dāng)我們生成Circle類的實(shí)例時,在每一個實(shí)例中并沒有存儲PI的值,PI的值存儲在類中2.2 類與對象2.2.3 數(shù)據(jù)成員(續(xù))例2-536 對類變量進(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 類與對象37 聲明一個Point類,有兩個私有變量保存點(diǎn)坐標(biāo),一個類變量保存已有點(diǎn)的個數(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 類與對象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 類與對象2.2.3 數(shù)據(jù)成員(續(xù))Point類測試

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

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

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

26、ircle類中聲明計算周長的方法 public class Circle static double PI = 3.14159265; int radius; public double circumference() return 2 * PI * radius; 由于radius是實(shí)例變量,在程序運(yùn)行時,Java會自動取其接收者對象的屬性值 也可將circumference方法體改為:return 2 * PI * this.radius; 關(guān)鍵字this代表此方法的接收者對象2.2 類與對象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 類與對象2.2.4 方法成員(續(xù))例2-648 運(yùn)行結(jié)果Circle 1 has circumference 314.159265Circle 2 has circumference 62.831853 說明 在使用實(shí)例方法時,需要將其發(fā)送給一個實(shí)例對象(也稱給對象發(fā)送一條消息),radius的值即是接收者對象的值 在執(zhí)行c1.circumference()時,radius的值為c1的radius屬性值;在執(zhí)行c2.circumference()時,radius的值為c2的radius屬性值2.2 類與對象2.2.4 方法成員(續(xù))例2-6運(yùn)行

29、結(jié)果49 在Circle類及Rectangle類中聲明計算面積的方法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 類與對象2.2.4 方法成員(續(xù))例2-750 聲明測試類,對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 類與對象2.2.4 方法成員(續(xù))例2-751 運(yùn)行結(jié)果Circle has area 7853.981625Rectangle has area 600.0 說明 不同的類中可以聲明相同方法名的方法 使用時,系統(tǒng)會根據(jù)接收者對象的類型找到相應(yīng)類的方法2.2 類與對象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 類與對象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 類與對象2.2.4 方法成員(續(xù))例2-854 運(yùn)行結(jié)果Circle 1 的周長: 314.159265Circle 2 的周長: 62.831853Circle 2 擴(kuò)大后的周長:

34、 251.3274122.2 類與對象2.2.4 方法成員(續(xù))例2-8運(yùn)行結(jié)果55 類方法 也稱為靜態(tài)方法,表示類中對象的共有行為 聲明時前面需加static修飾符 不能被聲明為抽象的 類方法可以在不建立對象的情況下用類名直接調(diào)用,也可用類實(shí)例調(diào)用2.2 類與對象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 類與對象2.2.4 方法成員(續(xù))例2-1057 包 是一組類的集合 一個包可以包含若干個類文件,還可包含若干個包 包的作用 將相關(guān)的源代碼文件組織在一起 類名的空間管理,利用包來劃分名字空間,便可以避免類名沖突 提供包一級的封裝及存取權(quán)限2.2 類與對象2.2.5 類的組

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

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

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

39、2.5 類的組織包的概念(續(xù))63 靜態(tài)引入 Java 5 新特性 在Java 5之前,通過類名使用類的靜態(tài)成員。例如,Math.PI,Math.sin(double) 如果在程序中需要多次使用靜態(tài)成員,則每次使用都需要加上類名 靜態(tài)引入分為兩種:單一引入和全體引入 單一引入是指引入某一個指定的靜態(tài)成員,例如:import static java.lang.Math.PI; 全體引入是指引入類中所有的靜態(tài)成員,例如:import static java.lang.Math.*; 2.2 類與對象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 類與對象2.2.5 類的組織包的概念(續(xù)) 例2-1265 類的訪問控制 類的訪問控制只有public(公共類)及無修飾符(缺省類)兩種 訪問權(quán)限符與訪問能力之間的關(guān)系如表類型無修飾public同一包中的類同一包中的類yesyes不同包中的類不同包中的類noyes2.2 類與對象2.2.6 類的訪問控制66 類成員的訪問控制 公有(public) 可以被其他任何對象訪問(前提是對類成員所在的類有訪問權(quán)限) 保護(hù)(p

41、rotected) 只可被同一類及其子類的實(shí)例對象訪問 私有(private) 只能被這個類本身訪問,在類外不可見 默認(rèn)(default) 僅允許同一個包內(nèi)的訪問;又被稱為“包(package)訪問權(quán)限”2.2 類與對象2.2.6 類的訪問控制67類型private無修飾protectedpublic同一類yesyesyesyes同一包中的子類noyesyesyes同一包中的非子類noyesyesyes不同包中的子類nonoyesyes不同包中的非子類nononoyes2.2 類與對象2.2.6 類的訪問控制(續(xù))68 對例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 類與對象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 類與對象2.2.6 類的訪問控制(續(xù))例2-1370 編譯時會提示出錯在編譯語句“c1.radius = 50;”及“c2.radius

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

45、ius,聲明其get方法如下:public int getRadius() return radius; 2.2 類與對象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 類與對象2.2.6 類的訪問控制(續(xù))set方法73 關(guān)鍵字this的使用 如果形式參數(shù)名與實(shí)例變量名相同,則需要在實(shí)例變量名之前加this關(guān)鍵字,否則

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

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

48、聲明中沒有給實(shí)例變量賦初值,則對象的屬性值為零或空2.3 對象初始化和回收2.3.1 構(gòu)造方法(續(xù))默認(rèn)構(gòu)造方法78 聲明一個銀行帳號類及測試代碼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 對象初始化和回收2.3.1 構(gòu)造方法(續(xù))例2-14(默認(rèn)構(gòu)造方法)79 運(yùn)行結(jié)果ownerName=nullaccountNumber=0balance=0.02.3 對象初始化和回收2.3.1 構(gòu)造方法(續(xù))例2-14運(yùn)行結(jié)果80 自定義構(gòu)造方法與方法重載 可在生成對象時給構(gòu)造方法傳送初始值,使用希望的值給對象初始化 構(gòu)造方法可以被重載,構(gòu)造方法的重載

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

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

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

53、lic BankAccount() ownerName = ; accountNumber = 999999; balance = 0.0f; 2.3 對象初始化和回收2.3.1 構(gòu)造方法(續(xù))例2-1685 創(chuàng)建一個擁有兩個構(gòu)造方法的Tree類,一個有參,一個無參。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 對象初始化和回收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 對象初始化和回收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等.壓縮文件請下載最新的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)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論