02Java類與對象基本概念課件_第1頁
02Java類與對象基本概念課件_第2頁
02Java類與對象基本概念課件_第3頁
02Java類與對象基本概念課件_第4頁
02Java類與對象基本概念課件_第5頁
已閱讀5頁,還剩119頁未讀 繼續(xù)免費(fèi)閱讀

下載本文檔

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

文檔簡介

1、第二章類與對象的基本概念12本章內(nèi)容面向?qū)ο蟪绦蛟O(shè)計的基本概念和思想Java 類與對象的基本概念和語法,包括類的聲明、類成員的訪問,以及對象的構(gòu)造、初始化和回收本章要求理解類和對象的概念熟練使用類及其成員的訪問控制方法熟練掌握各種構(gòu)造方法了解java的垃圾回收機(jī)制2.1 面向?qū)ο蟮某绦蛟O(shè)計方法概述面向?qū)ο蟮某绦蛟O(shè)計(Object Oriented Programming,簡稱OOP)與結(jié)構(gòu)化程序設(shè)計方法相比,更符合人類認(rèn)識現(xiàn)實(shí)世界的思維方式 已成為程序設(shè)計的主流方向涉及的主要概念抽象(abstraction)封裝(encapsulation)繼承(inheritance)多態(tài)(polymorp

2、hism)32.1 面向?qū)ο蟮某绦蛟O(shè)計方法概述(續(xù))對象現(xiàn)實(shí)世界中萬物皆對象都具有各自的屬性,對外界都呈現(xiàn)各自的行為 程序中一切都是對象都具有標(biāo)識 (identity), 屬性和行為(方法)通過一個或多個變量來保存其狀態(tài)通過方法(method) 實(shí)現(xiàn)他的行為42.1 面向?qū)ο蟮某绦蛟O(shè)計方法概述(續(xù))類將屬性及行為相同或相似的對象歸為一類類可以看成是對象的抽象,代表了此類對象所具有的共有屬性和行為在面向?qū)ο蟮某绦蛟O(shè)計中,每一個對象都屬于某個特定的類 52.1 面向?qū)ο蟮某绦蛟O(shè)計方法概述(續(xù))結(jié)構(gòu)化程序設(shè)計通常由若干個程序模塊組成,每個程序模塊都可以是子程序或函數(shù)數(shù)據(jù)和功能分離,代碼難于維護(hù)和復(fù)用

3、面向?qū)ο蟪绦蛟O(shè)計基本組成單位是類程序在運(yùn)行時由類生成對象,對象是面向?qū)ο蟪绦虻暮诵膶ο笾g通過發(fā)送消息進(jìn)行通信,互相協(xié)作完成相應(yīng)功能62.1.1 抽象計算機(jī)軟件開發(fā)中所使用的抽象有過程抽象數(shù)據(jù)抽象72.1.1 抽象(續(xù))數(shù)據(jù)抽象將需要處理的數(shù)據(jù)和這些數(shù)據(jù)上的操作結(jié)合在一起,抽象成不同的抽象數(shù)據(jù)類型每個抽象數(shù)據(jù)類型既包含了數(shù)據(jù),也包含了針對這些數(shù)據(jù)的操作相對于過程抽象,數(shù)據(jù)抽象是更為合理的抽象方法82.1.1 抽象(續(xù))例:鐘表數(shù)據(jù)(屬性)int Hour; int Minute; int Second;方法(行為)SetTime(); ShowTime();92.1.1 抽象(續(xù))例:人數(shù)據(jù)(

4、屬性)Char name; char gender; int age; int id;方法(行為)生物行為Eat(), Sleep(),社會行為Work(), Study(),102.1.2 封裝封裝是一種信息隱蔽技術(shù)利用抽象數(shù)據(jù)類型將數(shù)據(jù)和基于數(shù)據(jù)的操作封裝在一起用戶只能看到對象的封裝界面信息,對象的內(nèi)部細(xì)節(jié)對用戶是隱蔽的封裝的目的在于將對象的使用者和設(shè)計者分開,使用者不必知道行為實(shí)現(xiàn)的細(xì)節(jié),只需使用設(shè)計者提供的消息來訪問對象112.1.2 封裝(續(xù))封裝的定義清楚的邊界所有對象的內(nèi)部信息被限定在這個邊界內(nèi)接口對象向外界提供的方法,外界可以通過這些方法與對象進(jìn)行交互受保護(hù)的內(nèi)部實(shí)現(xiàn)功能的實(shí)現(xiàn)

5、細(xì)節(jié),不能從類外訪問。122.1.2 封裝(續(xù))封裝的意義在面向?qū)ο蟮某绦蛟O(shè)計中,類封裝了數(shù)據(jù)及對數(shù)據(jù)的操作,是程序中的最小模塊禁止了外界直接操作類中的數(shù)據(jù),模塊與模塊之間只能通過嚴(yán)格控制的接口進(jìn)行交互,這使得模塊之間的偶合度大大降低保證了模塊具有較好的獨(dú)立性,程序維護(hù)和修改較為容易132.1.3 繼承繼承是指新的類可以獲得已有類(稱為超類、基類或父類)的屬性和行為,稱新類為已有類的派生類(也稱為子類)在繼承過程中派生類繼承了基類的特性,包括方法和實(shí)例變量派生類也可修改繼承的方法或增加新的方法,使之更適合特殊的需要有助于解決軟件的可重用性問題,使程序結(jié)構(gòu)清晰,降低了編碼和維護(hù)的工作量142.1

6、.3 繼承(續(xù))單繼承任何一個派生類都只有單一的直接父類類層次結(jié)構(gòu)為樹狀結(jié)構(gòu)多繼承一個類可以有一個以上的直接父類類層次結(jié)構(gòu)為網(wǎng)狀結(jié)構(gòu),設(shè)計及實(shí)現(xiàn)比較復(fù)雜Java語言僅支持單繼承152.1.4 多態(tài)多態(tài)一個程序中同名的不同方法共存主要通過子類對父類方法的覆蓋來實(shí)現(xiàn)不同類的對象可以響應(yīng)同名的消息(方法) ,具體的實(shí)現(xiàn)方法卻不同使語言具有靈活、抽象、行為共享、代碼共享的優(yōu)勢,很好地解決了應(yīng)用程序方法同名問題162.2 類與對象類與對象在程序中,對象是通過一種抽象數(shù)據(jù)類型來描述的,這種抽象數(shù)據(jù)類型稱為類(Class)一個類是對一類對象的描述。類是構(gòu)造對象的模板對象是類的具體實(shí)例172.2.1 類的聲明

7、聲明形式public abstract | final class 類名稱 extends 父類名稱 implements 接口名稱列表 變量成員聲明及初始化; 方法聲明及方法體;182.2.1 類的聲明(續(xù))關(guān)鍵字class表明其后聲明的是一個類。extends如果所聲明的類是從某一父類派生而來,那么,父類的名字應(yīng)寫在extends之后implements如果所聲明的類要實(shí)現(xiàn)某些接口,那么,接口的名字應(yīng)寫在implements之后19public abstract | final class 類名稱 extends 父類名稱 implements 接口名稱列表 2.2.1 類的聲明(續(xù))修飾

8、符可以有多個,用來限定類的使用方式public 表明此類為公有類abstract 指明此類為抽象類final 指明此類為終結(jié)類 類聲明體變量成員聲明及初始化:可以有多個方法聲明及方法體: 可以有多個20public abstract | final class 類名稱 extends 父類名稱 implements 接口名稱列表 變量成員聲明及初始化; 方法聲明及方法體;2.2.1 類的聲明(續(xù))例2_1:鐘表類public class Clock / 成員變量 int hour ; int minute ; int second ; / 成員方法 public void setTime(in

9、t newH, int newM, int newS) hour=newH ; minute=newM ; second=newS ; public void showTime() System.out.println(hour+:+minute+:+second); 212.2.2 對象的聲明與引用變量和對象變量除了存儲基本數(shù)據(jù)類型的數(shù)據(jù),還能存儲對象的引用,用來存儲對象引用的變量稱為引用變量類的對象也稱為類的實(shí)例222.2.2 對象的聲明與引用(續(xù))對象的聲明格式類名 變量名 例如Clock是已經(jīng)聲明的類名,則下面語句聲明的變量aclock將用于存儲該類對象的引用: Clock acloc

10、k; 聲明一個引用變量時并沒有對象生成232.2.2 對象的聲明與引用(續(xù))對象的創(chuàng)建生成實(shí)例的格式:new () 例如: aclock=new Clock();其作用是:在內(nèi)存中為此對象分配內(nèi)存空間返回對象的引用(reference ,相當(dāng)于對象的存儲地址)引用變量可以被賦以空值例如:aclock=null;242.2.3 數(shù)據(jù)成員數(shù)據(jù)成員表示Java類的狀態(tài)聲明數(shù)據(jù)成員必須給出變量名及其所屬的類型,同時還可以指定其他特性在一個類中成員變量名是唯一的數(shù)據(jù)成員的類型可以是Java中任意的數(shù)據(jù)類型(簡單類型,類,接口,數(shù)組)分為實(shí)例變量和類變量252.2.3 數(shù)據(jù)成員(續(xù))聲明格式public

11、| protected | private staticfinaltransient volatile變量數(shù)據(jù)類型 變量名1=變量初值, 變量名2=變量初值, ;格式說明public、protected、private 為訪問控制符static指明這是一個靜態(tài)成員變量final指明變量的值不能被修改transient指明變量是臨時狀態(tài)volatile指明變量是一個共享變量262.2.3 數(shù)據(jù)成員(續(xù))實(shí)例變量沒有static修飾的變量稱為實(shí)例變量(Instance Variables)用來存儲所有實(shí)例都需要的屬性信息,不同實(shí)例的屬性值可能會不同可通過下面的表達(dá)式訪問實(shí)例屬性的值.272.2.3

12、 數(shù)據(jù)成員(續(xù))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); 28例2_2:聲明一個表示圓的類,保存在文件Circle.java 中。然后編寫測試類,保存在文件ShapeTester.java中,并與Circle.java放在相同的目錄下。2.2.3 數(shù)據(jù)成員(續(xù))編譯后運(yùn)行結(jié)果如下:C

13、ircle26b249radius =0解釋之后的數(shù)值為x所指的對象的存儲地址x的值及對象的狀態(tài)如圖29例2_2運(yùn)行結(jié)果2.2.3 數(shù)據(jù)成員(續(xù))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 = new Circle(); y = new Rectangle(); System.out.println(x+ +y); 30例2_3:

14、聲明一個表示矩形的類,保存在Rectangle.java中;編寫測試類,保存在ShapeTester.java中,文件保存在相同的目錄下2.2.3 數(shù)據(jù)成員(續(xù))編譯后運(yùn)行結(jié)果如下:Circle82f0db Rectangle92d342解釋Circle及Rectangle類對象的狀態(tài)如圖31例2_3運(yùn)行結(jié)果2.2.3 數(shù)據(jù)成員(續(xù))對ShapeTester類進(jìn)行修改,使兩個實(shí)例具有不同的實(shí)例變量值public class ShapeTester public static void main(String args) Circle x; Rectangle y, z; x = new Cir

15、cle(); 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); 32例2_3修改2.2.3 數(shù)據(jù)成員(續(xù))編譯后運(yùn)行結(jié)果如下:50, 10.128, 68.94解釋Circle及Rectangle類對象的狀態(tài)如圖33修改后運(yùn)行結(jié)果2.2.3 數(shù)據(jù)成員(續(xù))地址簿程序一個人的地址通常包括以下信息:姓名,省份,城市,街道,門牌號,郵政編碼34例2_

16、42.2.3 數(shù)據(jù)成員(續(xù))public 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; streetName1 = Tsinghua East Road; city1 = Beijing;

17、province1 = “Beijing; postalCode1 = 100084; name2 = Li Hong; gateNumber2 = 2; streetName2 = BeiNong; city2 = Beijing; province2 = Beijing; postalCode2 = 102206; /.do something interesting 35采用過程化的程序設(shè)計方法,使用簡單變量存儲,則存儲兩個人地址的代碼如下:2.2.3 數(shù)據(jù)成員(續(xù))采用面向?qū)ο蟮某绦蛟O(shè)計方法,則需要首先聲明Address類如下public class Address String na

18、me; int gateNumber; String streetName; String city; String province; String postalCode; /方法成員略 362.2.3 數(shù)據(jù)成員(續(xù))主方法改寫如下public static void main(String args) Address address1 = new Address(), address2 = new Address(); = “Zhang Li; address1.streetNumber = 15; address1.streetName = “Tsinghua East Road; ad

19、dress1.city = “Beijing; vince = “Beijing; address1.postalCode = “100084; = “Li Hong; address2.streetNumber = 2; address2.streetName = “BeiNong; address2.city = “Beijing; vince = “Beijing; address2.postalCode = “102206; /.do something interesting 372.2.3 數(shù)據(jù)成員(續(xù))類變量也稱為靜態(tài)變量,聲明時需加static修飾符

20、不管類的對象有多少,類變量只存在一份,在整個類中只有一個值類初始化的同時就被賦值適用情況類中所有對象都相同的屬性經(jīng)常需要共享的數(shù)據(jù)系統(tǒng)中用到的一些常量值引用格式.382.2.3 數(shù)據(jù)成員(續(xù))對于一個圓類的所有對象,計算圓的面積時,都需用到的值,可在Circle類的聲明中增加一個類屬性PI。public class Circle static double PI = 3.14159265; int radius; 當(dāng)我們生成Circle類的實(shí)例時,在每一個實(shí)例中并沒有存儲PI的值,PI的值存儲在類中。39例2_5:2.2.3 數(shù)據(jù)成員(續(xù))對類變量進(jìn)行測試public class ClassV

21、ariableTester 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.out.println(Circle.PI); 測試結(jié)果3.141592653.141592653.143.1440例2_5:2.2.3 數(shù)據(jù)成員(續(xù))聲明一個Point類,有兩個私有變量保存點(diǎn)坐標(biāo),一個類變量保存已有點(diǎn)的個數(shù)pub

22、lic 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+;41練習(xí): Point.java2.2.3 數(shù)據(jù)成員(續(xù))Point類測試class ex2_4 public static void main(String args) Point p = new Point(1,1); System.out.println(p.pointCount); Point q = new

23、 Point(2,2); System.out.println(q.pointCount); System.out.println(q.pointCount =Point.pointCount); System.out.println(Point.pointCount);422.2.3 數(shù)據(jù)成員(續(xù))Point類測試結(jié)果12true2 432.2.3 數(shù)據(jù)成員(續(xù))final修飾符實(shí)例變量和類變量都可被聲明為finalfinal實(shí)例變量必須在每個構(gòu)造方法結(jié)束之前賦初值,以保證使用之前會被初始化final類變量必須在聲明的同時初始化442.2.4 方法成員方法成員定義類的行為一個對象能夠做的事情

24、我們能夠從一個對象取得的信息可以沒有,也可以有多個;一旦在類中聲明了方法,它就成為了類聲明的一部分分為實(shí)例方法和類方法452.2.4 方法成員(續(xù))聲明格式public | protected | private static finalabstract native synchronized返回類型 方法名(參數(shù)列表) throws exceptionList方法體462.2.4 方法成員(續(xù))格式說明方法修飾public、protected、private 為存取控制符static指明方法是一個類方法final指明方法是一個終結(jié)方法abstract指明方法是一個抽象方法native用來集成

25、java代碼和其它語言的代碼synchronized用來控制多個并發(fā)線程對共享數(shù)據(jù)的訪問47public | protected | private static finalabstract native synchronized 返回類型 方法名(參數(shù)列表) throws exceptionList 方法體2.2.4 方法成員(續(xù))格式說明(續(xù))返回類型方法返回值的類型,可以是任意的Java數(shù)據(jù)類型當(dāng)不需要返回值時,返回類型為void參數(shù)類型簡單數(shù)據(jù)類型,引用類型(數(shù)組、類或接口)可以有多個參數(shù),也可以沒有參數(shù),方法聲明時的參數(shù)稱為形式參數(shù)方法體方法的實(shí)現(xiàn)包括局部變量的聲明以及所有合法的Ja

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

27、ircle static double PI = 3.14159265; int radius; public double circumference() return 2 * PI * radius; 由于radius是實(shí)例變量,在程序運(yùn)行時,Java會自動取當(dāng)前對象的屬性值也可將circumference方法體改為:return 2 * PI * this.radius; 關(guān)鍵字this代表此方法的當(dāng)前對象51例2_6:2.2.4 方法成員(續(xù))方法調(diào)用測試public class CircumferenceTester public static void main(String ar

28、gs) 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 circumference + circum2); 522.2.4 方法成員(續(xù))運(yùn)行結(jié)果Cir

29、cle 1 has circumference 314.159265Circle 2 has circumference 62.831853說明在執(zhí)行c1.circumference()時,radius的值為c1的radius屬性值;在執(zhí)行c2.circumference()時,radius的值為c2的radius屬性值532.2.4 方法成員(續(xù))在Circle類及Rectangle類中聲明計算面積的方法area()54public class Circle static double PI = 3.14159265; int radius; public double circumfere

30、nce() return 2 * PI * radius; public double area() return PI * radius * radius; public class Rectangle double width; double height; public double area() return width * height; 例2_7:2.2.4 方法成員(續(xù))測試類,對Circle類及Rectangle類的area()方法進(jìn)行測試 public class AreaTester public static void main(String args) Circle c

31、 = 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(Rectangle has area + r.area(); 55例2_7:2.2.4 方法成員(續(xù))例2_7運(yùn)行結(jié)果Circle has area 7853.981625Rectangle has area 600.0說明不同的類中可以聲明相同方法名的方法使用時,系統(tǒng)會根據(jù)對象的類

32、型找到相應(yīng)類的方法562.2.4 方法成員(續(xù))帶參數(shù)的方法舉例:在Circle類中增加方法改變圓的半徑。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 void enlarge(int factor) radius = radius * factor; 57例2_8:2.2.4 方法成員(續(xù))例2

33、_8測試類public class EnlargeTester public static void main(String args) Circle c1 = new Circle(); c1.radius = 50; Circle c2 = new Circle(); c2.radius = 10; System.out.println(Circle 1 的周長: + c1.circumference(); System.out.println(Circle 2 的周長: + c2.circumference(); c2.enlarge(4); System.out.println(Cir

34、cle 2 擴(kuò)大后的周長: + c2.circumference(); 582.2.4 方法成員(續(xù))例2_8運(yùn)行結(jié)果Circle 1 的周長: 314.159265Circle 2 的周長: 62.831853Circle 2 擴(kuò)大后的周長: 251.327412592.2.4 方法成員(續(xù))以對象作為參數(shù)的方法舉例:在Circle類中增加fitsInside方法判斷一個圓能否在一個長方形內(nèi),需要以Rectangle類的對象作為參數(shù)public class Circle static double PI = 3.14159265; int radius; public double circ

35、umference() return 2 * PI * radius; public void enlarge(int factor) radius = radius * factor; public boolean fitsInside (Rectangle r) return (2 * radius r.width) & (2 * radius r.height); 60例2_9:2.2.4 方法成員(續(xù))例2_9測試類 public class InsideTester public static void main(String args) Circle c1 = new Circle

36、(); c1.radius = 8; Circle c2 = new Circle(); c2.radius = 15; Rectangle r = new Rectangle(); r.width = 20; r.height = 30; System.out.println(Circle 1 fits inside Rectangle: + c1.fitsInside(r); System.out.println(Circle 2 fits inside Rectangle: + c2.fitsInside(r); 612.2.4 方法成員(續(xù))例2_9運(yùn)行結(jié)果Circle 1 fits

37、inside Rectangle: trueCircle 2 fits inside Rectangle: false622.2.4 方法成員(續(xù))類方法也稱為靜態(tài)方法,表示類中對象的共有行為聲明時前面需加static修飾符不能被聲明為抽象的類方法可以在不建立對象的情況下用類名直接調(diào)用,也可用類實(shí)例調(diào)用632.2.4 方法成員(續(xù))將攝氏溫度(centigrade)轉(zhuǎn)換成華氏溫度(fahrenheit)轉(zhuǎn)換公式為 fahrenheit = centigrade * 9 / 5 + 32除了攝氏溫度值及公式中需要的常量值,此功能不依賴于具體的類實(shí)例的屬性值,因此可聲明為類方法轉(zhuǎn)換方法centig

38、radeToFahrenheit放在類Converter中public class Converter public static int centigradeToFahrenheit(int cent) return (cent * 9 / 5 + 32); 方法調(diào)用Converter.centigradeToFahrenheit(40)64例2_10:2.2.5 類的組織包的概念包是一組類的集合一個包可以包含若干個類文件,還可包含若干個包包的作用將相關(guān)的源代碼文件組織在一起類名的空間管理,利用包來劃分名字空間,可以避免類名沖突提供包一級的封裝及存取權(quán)限652.2.5 類的組織包的概念包的命

39、名Java中包名使用小寫字母表示命名方式建議將機(jī)構(gòu)的Internet域名反序,作為包名的前導(dǎo)若包名中有任何不可用于標(biāo)識符的字符,用下劃線替代若包名中的任何部分與關(guān)鍵字沖突,后綴下劃線若包名中的任何部分以數(shù)字或其他不能用作標(biāo)識符起始的字符開頭,前綴下劃線662.2.5 類的組織包的概念(續(xù))編譯單元與類空間一個Java源代碼文件稱為一個編譯單元,由三部分組成所屬包的聲明(省略,則屬于默認(rèn)包)import (引入)包的聲明,用于導(dǎo)入外部的類類和接口的聲明一個編譯單元中只能有一個public類,該類名與文件名相同,編譯單元中的其他類往往是public類的輔助類,經(jīng)過編譯,每個類都會產(chǎn)一個class文

40、件利用包來劃分名字空間,便可以避免類名沖突672.2.5 類的組織包的概念(續(xù))包的聲明命名的包(Named Packages)例如: package Mypackage;默認(rèn)包(未命名的包)不含有包聲明的編譯單元是默認(rèn)包的一部分682.2.5 類的組織包的概念(續(xù))包與目錄Java使用文件系統(tǒng)來存儲包和類包名就是文件夾名,即目錄名目錄名并不一定是包名用javac編譯源程序時,如遇到當(dāng)前目錄(包)中沒有聲明的類,就會以環(huán)境變量classpath為相對查找路徑,按照包名的結(jié)構(gòu)來查找。因此,要指定搜尋包的路徑,需設(shè)置環(huán)境變量classpath692.2.5 類的組織包的概念(續(xù))引入包 為了使用其

41、它包中所提供的類,需要使用import語句引入所需要的類Java編譯器為所有程序自動引入包java.lang.import格式 import package1.package2. (classname |*);其中package1.package2表明包的層次,它對應(yīng)于文件目錄classname則指明所要引入的類名如果要引入一個包中的所有類,則可以使用星號(*)來代替類名702.2.6 類的訪問控制類的訪問控制類的訪問控制只有public(公共類)及無修飾符(缺省類)兩種訪問權(quán)限符與訪問能力之間的關(guān)系如表71類型無修飾public同一包中的類yesyes不同包中的類noyes2.2.6 類成員

42、的訪問控制類成員的訪問控制公有(public)可以被其他任何對象訪問(前提是對類成員所在的類有訪問權(quán)限) 保護(hù)(protected)可被同一包及其子類的實(shí)例對象訪問私有(private)只能被這個類本身訪問,在類外不可見默認(rèn)(default)僅允許同一個包內(nèi)的訪問;又被稱為“包(package)訪問權(quán)限”722.2.6 類成員的訪問控制(續(xù))類型private無修飾protectedpublic同一類yesyesyesyes同一包中的子類noyesyesyes同一包中的非子類noyesyesyes不同包中的子類nonoyesyes不同包中的非子類nononoyes732.2.6 類成員的訪問控

43、制(續(xù))對例2-6中的Circle類聲明進(jìn)行修改,給實(shí)例變量加上private修飾符public class Circle static double PI = 3.14159265; private int radius; public double circumference() return 2 * PI * radius; 74例2_11:2.2.6 類成員的訪問控制(續(xù))再編譯CircumferenceTester.javapublic class CircumferenceTester public static void main(String args) Circle c1 =

44、 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 circumference + circum2); 75例2_11:2.2.6 類成員的訪問控制(續(xù))編譯時會提示出錯在編譯語

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

46、eturn ; 對于實(shí)例變量radius,聲明其get方法如下:public int getRadius() return radius; 772.2.6 類成員的訪問控制(續(xù))set方法功能是修改屬性變量的值set方法名以“set”開頭,后面是實(shí)例變量的名字一般具有以下格式public void set( ) = ; 聲明實(shí)例變量radius的set方法如下:public void setRadius(int r) radius = r;782.2.6 類成員的訪問控制(續(xù))關(guān)鍵字this的使用如果形式參數(shù)名與實(shí)例變量名相同,則需要在實(shí)例變量名之前加this關(guān)鍵字,否則系統(tǒng)會將實(shí)例變量當(dāng)成形

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

48、1 構(gòu)造方法(續(xù))構(gòu)造方法的特點(diǎn)方法名與類名相同沒有返回類型,修飾符void也不能有通常被聲明為公有的(public)可以有任意多個參數(shù)主要作用是完成對象的初始化工作不能在程序中顯式的調(diào)用在生成一個對象時,系統(tǒng)會自動調(diào)用該類的構(gòu)造方法為新生成的對象初始化822.3.1 構(gòu)造方法(續(xù))默認(rèn)構(gòu)造方法系統(tǒng)提供的默認(rèn)構(gòu)造方法如果在類的聲明中沒有聲明構(gòu)造方法,則Java編譯器會提供一個默認(rèn)的構(gòu)造方法默認(rèn)的構(gòu)造方法沒有參數(shù),其方法體為空使用默認(rèn)的構(gòu)造方法初始化對象時,如果在類聲明中沒有給實(shí)例變量賦初值,則對象的屬性值為零或空832.3.1 構(gòu)造方法(續(xù))例2_12(使用默認(rèn)構(gòu)造方法)聲明一個銀行帳號類及測

49、試代碼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.ownerName); System.out.println(accountNumber= + myAccount.accountNumber); Sy

50、stem.out.println(balance= + myAccount.balance);842.3.1 構(gòu)造方法(續(xù))例2_12運(yùn)行結(jié)果運(yùn)行結(jié)果ownerName=nullaccountNumber=0balance=0.0852.3.1 構(gòu)造方法(續(xù))自定義構(gòu)造方法自定義構(gòu)造方法與方法重載可在生成對象時給構(gòu)造方法傳送初始值,使用希望的值給對象初始化構(gòu)造方法可以被重載,構(gòu)造方法的重載和方法的重載一致一個類中有兩個及以上同名的方法,但參數(shù)表不同,這種情況就被稱為方法重載。在方法調(diào)用時,Java可以通過參數(shù)列表的不同來辨別應(yīng)調(diào)用哪一個方法862.3.1 構(gòu)造方法(續(xù))例2_13為BankAc

51、count聲明一個有三個參數(shù)的構(gòu)造方法public BankAccount(String initName, int initAccountNumber, float initBalance) ownerName = initName; accountNumber = initAccountNumber; balance = initBalance; 假設(shè)一個新帳號的初始余額可以為0,則可增加一個帶有兩個參數(shù)的構(gòu)造方法public BankAccount(String initName, int initAccountNumber) ownerName = initName; accountN

52、umber = initAccountNumber; balance = 0.0f; 872.3.1 構(gòu)造方法(續(xù))自定義無參構(gòu)造方法自定義無參的構(gòu)造方法無參的構(gòu)造方法對其子類的聲明很重要。如果在一個類中不存在無參的構(gòu)造方法,則要求其子類聲明時必須聲明構(gòu)造方法,否則在子類對象的初始化時會出錯在聲明構(gòu)造方法時,好的聲明習(xí)慣是不聲明構(gòu)造方法如果聲明,至少聲明一個無參構(gòu)造方法882.3.1 構(gòu)造方法(續(xù))Bush.java構(gòu)建一個Bush類,有兩個有參數(shù)的構(gòu)造方法class Bush Bush(int i) Bush(double d) 如果寫:new Bush(); 編譯器將要告訴你找不到對應(yīng)的構(gòu)

53、造方法說明用戶在進(jìn)行類聲明時,如果沒有聲明任何構(gòu)造方法,系統(tǒng)會賦給此類一個默認(rèn)(無參)的構(gòu)造方法。但是,只要用戶聲明了構(gòu)造方法,即使沒有聲明無參的構(gòu)造方法,系統(tǒng)也不再賦默認(rèn)的構(gòu)造方法892.3.1 構(gòu)造方法(續(xù))例2_14在例2_13基礎(chǔ)上再聲明一個無參的構(gòu)造方法public BankAccount() ownerName = ; accountNumber = 999999; balance = 0.0f; 902.3.1 構(gòu)造方法(續(xù))Tree.java創(chuàng)建一個擁有兩個構(gòu)造方法的Tree類,一個有參,一個無參。import java.util.*;class Tree int height

54、; Tree() prt(Planting a seedling); height = 0; Tree(int i) prt(Creating new Tree that is + i + feet tall); height = i; void info() 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); 912.3.1 構(gòu)造方法(續(xù))Overloadi

55、ng.java測試Tree類public class Overloading public static void main(String args) for(int i = 0; i 5; i+) Tree t = new Tree(i); t(); t(overloaded method); new Tree(); 922.3.1 構(gòu)造方法(續(xù))Overloading測試結(jié)果測試結(jié)果Creating new Tree that is 0 feet tallTree is 0 feet talloverloaded method: Tree is 0 feet tallCreating ne

56、w Tree that is 1 feet tallTree is 1 feet talloverloaded method: Tree is 1 feet tallCreating new Tree that is 2 feet tallTree is 2 feet talloverloaded method: Tree is 2 feet tallCreating new Tree that is 3 feet tallTree is 3 feet talloverloaded method: Tree is 3 feet tallCreating new Tree that is 4 f

57、eet tallTree is 4 feet talloverloaded method: Tree is 4 feet tallPlanting a seedling932.3.1 構(gòu)造方法(續(xù))this關(guān)鍵字的使用this關(guān)鍵字的使用可以使用this關(guān)鍵字在一個構(gòu)造方法中調(diào)用另外的構(gòu)造方法代碼更簡潔,維護(hù)起來也更容易通常用參數(shù)個數(shù)比較少的構(gòu)造方法調(diào)用參數(shù)個數(shù)最多的構(gòu)造方法942.3.1 構(gòu)造方法(續(xù))BankAccount.java使用this關(guān)鍵字,修改BankAccout類中無參數(shù)和二參數(shù)的構(gòu)造方法95public BankAccount() this(, 999999, 0.0f);

58、 public BankAccount(String initName, int initAccountNumber) this(initName, initAccountNumber, 0.0f); public BankAccount(String initName, int initAccountNumber, float initBalance) ownerName = initName; accountNumber = initAccountNumber; balance = initBalance; 2.3.2 內(nèi)存回收技術(shù)內(nèi)存回收技術(shù)當(dāng)一個對象在程序中不再被使用時,就成為一個無用

59、對象當(dāng)前的代碼段不屬于對象的作用域把對象的引用賦值為空J(rèn)ava運(yùn)行時系統(tǒng)通過垃圾收集器周期性地釋放無用對象所使用的內(nèi)存Java運(yùn)行時系統(tǒng)會在對對象進(jìn)行自動垃圾回收前,自動調(diào)用對象的finalize()方法962.3.2 內(nèi)存回收技術(shù)(續(xù))垃圾收集器垃圾收集器自動掃描對象的動態(tài)內(nèi)存區(qū),對不再使用的對象做上標(biāo)記以進(jìn)行垃圾回收作為一個線程運(yùn)行通常在系統(tǒng)空閑時異步地執(zhí)行當(dāng)系統(tǒng)的內(nèi)存用盡或程序中調(diào)用System.gc()要求進(jìn)行垃圾收集時,與系統(tǒng)同步運(yùn)行972.3.2 內(nèi)存回收技術(shù)(續(xù))finalize()方法finalize()方法在類java.lang.Object中聲明,因此 Java中的每一個類

60、都有該方法用于釋放系統(tǒng)資源,如關(guān)閉打開的文件或socket等聲明格式protected void finalize() throws throwable如果一個類需要釋放除內(nèi)存以外的資源,則需在類中重寫finalize()方法982.3.2 內(nèi)存回收技術(shù)(續(xù))同C和C+的區(qū)別同C和C+的區(qū)別C語言中通過free來釋放內(nèi)存C+中則通過delete來釋放內(nèi)存在C和C+中,如果程序員忘記釋放內(nèi)存,則容易造成內(nèi)存泄漏甚至導(dǎo)致內(nèi)存耗盡在Java中不會發(fā)生內(nèi)存泄漏情況,但對于其它資源,則有產(chǎn)生泄漏的可能性992.4 應(yīng)用舉例對銀行帳戶類BankAccount進(jìn)行一系列修改和測試聲明BankAccount類

溫馨提示

  • 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

提交評論