攻克java基礎(chǔ)知識:總結(jié) 計劃 匯報 設(shè)計 純word可編輯_第1頁
攻克java基礎(chǔ)知識:總結(jié) 計劃 匯報 設(shè)計 純word可編輯_第2頁
攻克java基礎(chǔ)知識:總結(jié) 計劃 匯報 設(shè)計 純word可編輯_第3頁
攻克java基礎(chǔ)知識:總結(jié) 計劃 匯報 設(shè)計 純word可編輯_第4頁
攻克java基礎(chǔ)知識:總結(jié) 計劃 匯報 設(shè)計 純word可編輯_第5頁
已閱讀5頁,還剩132頁未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

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

文檔簡介

1、第二章類與對象的根本概念尹 曉JAVA語言程序設(shè)計1目錄2.1 面向?qū)ο蟮某绦蛟O(shè)計方法概述2.2 類與對象 2.3 對象初始化和回收 2.4 應(yīng)用舉例 2.5 UML簡介2.6 本章小節(jié)22.1 面向?qū)ο蟮某绦蛟O(shè)計方法概述面向?qū)ο蟮某绦蛟O(shè)計與結(jié)構(gòu)化程序設(shè)計方法相比,更符合人類認(rèn)識現(xiàn)實(shí)世界的思維方式 已成為程序設(shè)計的主流方向3對象現(xiàn)實(shí)世界中萬物皆對象都具有各自的屬性,對外界都呈現(xiàn)各自的行為 程序中一切都是對象都具有標(biāo)識 (identity), 屬性和行為(方法)通過一個或多個變量來保存其狀態(tài)通過方法(method) 實(shí)現(xiàn)他的行為2.1 面向?qū)ο蟮某绦蛟O(shè)計方法概述(續(xù))面向?qū)ο蟪绦蛟O(shè)計方法概述4類

2、將屬性及行為相同或相似的對象歸為一類類可以看成是對象的抽象,代表了此類對象所具有的共有屬性和行為在面向?qū)ο蟮某绦蛟O(shè)計中,每一個對象都屬于某個特定的類, 面向?qū)ο蟪绦蛟O(shè)計方法概述2.1 面向?qū)ο蟮某绦蛟O(shè)計方法概述(續(xù))5結(jié)構(gòu)化程序設(shè)計通常由假設(shè)干個程序模塊組成,每個程序模塊都可以是子程序或函數(shù)數(shù)據(jù)和功能別離,代碼難于維護(hù)和復(fù)用面向?qū)ο蟪绦蛟O(shè)計根本組成單位是類程序在運(yùn)行時由類生成對象,對象是面向?qū)ο蟪绦虻暮诵膶ο笾g通過發(fā)送消息進(jìn)行通信,互相協(xié)作完成相應(yīng)功能2.1 面向?qū)ο蟮某绦蛟O(shè)計方法概述(續(xù))面向?qū)ο蟪绦蛟O(shè)計方法概述6以圖書館信息系統(tǒng)為例圖書館信息系統(tǒng)面向?qū)ο蟮姆治雠c設(shè)計按對象或概念分解圖書目

3、錄圖書管理員圖書圖書館結(jié)構(gòu)化的分析與設(shè)計按功能或過程分解系統(tǒng)借書登記上架新書超期罰款7結(jié)構(gòu)化程序設(shè)計8面向?qū)ο蟪绦蛟O(shè)計92.1 面向?qū)ο蟮某绦蛟O(shè)計方法概述面向?qū)ο蟮某绦蛟O(shè)計涉及的主要概念抽象封裝繼承多態(tài) 面向?qū)ο蟮娜髾C(jī)制10抽象抽象指的是忽略問題中跟當(dāng)前目標(biāo)無關(guān)的方面,以便更充分的注意與當(dāng)前目標(biāo)有關(guān)的方面。2.1 面向?qū)ο蟮某绦蛟O(shè)計方法概述11封裝封裝是指把對象的屬性和方法包圍起來,對外隱藏細(xì)節(jié),對數(shù)據(jù)的訪問只能通過接口進(jìn)行。例如,汽車的剎車腳踏板。封裝起到兩個方面的作用一方面,對象內(nèi)部的狀態(tài)被保護(hù)起來,不會被與該對象溝通的對象直接篡改;另一方面,對象內(nèi)部特征的變化不會改變與其他對象的溝通方

4、式。2.1 面向?qū)ο蟮某绦蛟O(shè)計方法概述12繼承繼承是指從現(xiàn)有的類中派生出一個新類。通過繼承創(chuàng)立的新類稱為“子類或“派生類。被繼承的類稱為“基類、“父類或“超類。子類將繼承父類的所有屬性和方法,并可以修改或增加新的屬性和方法。2.1 面向?qū)ο蟮某绦蛟O(shè)計方法概述132.1 面向?qū)ο蟮某绦蛟O(shè)計方法概述類的繼承關(guān)系 多繼承Java只支持單繼承14多態(tài)多態(tài)是指兩個或多個屬于不同類的對象,對同一個消息做出不同響應(yīng)的能力。例如,如果我們要求三種人外科醫(yī)生、發(fā)型師和演員“cut!,那么:外科醫(yī)生會在病人身體上割開一個切口cut=切開發(fā)型師會開始剪頭發(fā)cut=剪演員會停止表演,等待導(dǎo)演下一步指令cut=停止拍攝

5、可以把這三種不同職業(yè)的人看作屬于不同類的對象。每個對象都得到同一個消息“cut,但他們知道對于自己來說,這個命令意味著什么,因?yàn)樗麄兌记宄约旱穆殬I(yè)所屬的類。2.1 面向?qū)ο蟮某绦蛟O(shè)計方法概述15又比方,在一個應(yīng)用中需要畫各種圖形,圓、矩形、三角形、平行四邊形的畫法是不一樣的。在傳統(tǒng)方法中的控制邏輯:假設(shè)使用OO方法,將圖形抽象為父類,每種圖形都是該父類的子類。每個子類中定義方法draw()來畫圖。2.1 面向?qū)ο蟮某绦蛟O(shè)計方法概述case of graphtype: circle: DrawCircle( ); rectangle: DrawRectangle ( ); triangle:

6、DarwTriangle( ); parallelogram: DrawParallelogram ( );end case;graphtype draw( );16類與對象在程序中,對象是通過一種抽象數(shù)據(jù)類型來描述的,這種抽象數(shù)據(jù)類型稱為類(Class)一個類是對一類對象的描述。類是構(gòu)造對象的模板對象是類的具體實(shí)例(instance)2.2 類與對象172.2.1 類的聲明聲明形式public abstract | final class 類名稱 extends 父類名稱 implements 接口名稱列表 變量成員聲明及初始化; 方法聲明及方法體;類與對象18關(guān)鍵字Class說明其后聲明的

7、是一個類。extends如果所聲明的類是從某一父類派生而來,那么,父類的名字應(yīng)寫在extends之后implements如果所聲明的類要實(shí)現(xiàn)某些接口,那么,接口的名字應(yīng)寫在implements之后2.2.1 類的聲明(續(xù))類與對象19修飾符可以有多個,用來限定類的使用方式public說明此類為公有類abstract指明此類為抽象類final指明此類為終結(jié)類 類聲明體變量成員聲明及初始化可以有多個方法聲明及方法體可以有多個2.2.1 類的聲明(續(xù))類與對象20鐘表類public class Clock / 成員變量 int hour ; int minute ; int second ; / 成

8、員方法 public void setTime(int newH, int newM, int newS) hour=newH ; minute=newM ; second=news ; public void showTime() System.out.println(hour+:+minute+:+second); 2.2.1 類的聲明(續(xù)) 例2_1類與對象21變量和對象變量除了存儲根本數(shù)據(jù)類型的數(shù)據(jù),還能存儲對象的引用reference,相當(dāng)于對象的存儲地址,用來存儲對象引用的變量稱為引用變量。類的對象也稱為類的實(shí)例(instance)。2.2.2 對象的聲明與引用類與對象22對象的聲

9、明格式類名 變量名 例如Clock是已經(jīng)聲明的類名,那么下面語句聲明的變量aclock將用于存儲該類對象的引用: Clock aclock; 聲明一個引用變量時并沒有對象生成2.2.2 對象的聲明與引用(續(xù))類與對象23對象的創(chuàng)立生成實(shí)例的格式:new () 例如: aclock=new Clock()其作用是:在內(nèi)存中為此對象分配內(nèi)存空間返回對象的引用(reference ,相當(dāng)于對象的存儲地址)引用變量可以被賦以空值例如:aclock=null;2.2.2 對象的聲明與引用(續(xù))類與對象242.2.3 數(shù)據(jù)成員數(shù)據(jù)成員表示Java類的狀態(tài)在一個類中成員變量名是唯一的數(shù)據(jù)成員的類型可以是Ja

10、va中任意的數(shù)據(jù)類型(簡單類型,類,接口,數(shù)組)分為實(shí)例變量和類變量類與對象25聲明格式public | protected | private static finaltransient volatile變量數(shù)據(jù)類型 變量名1=變量初值, 變量名2=變量初值, ;格式說明public、protected、private 為訪問控制符static指明這是一個靜態(tài)成員變量final指明變量的值不能被修改transient指明變量是臨時狀態(tài)volatile指明變量是一個共享變量2.2.3 數(shù)據(jù)成員(續(xù))類 與 對 象26實(shí)例變量沒有static修飾的變量稱為實(shí)例變量(Instance Variab

11、les)用來存儲所有實(shí)例都需要的屬性信息,不同實(shí)例的屬性值可能會不同可通過下面的表達(dá)式訪問實(shí)例屬性的值.2.2.3 數(shù)據(jù)成員(續(xù))實(shí)例變量類與對象27聲明一個表示圓的類,保存在文件Circle.java 中。然后編寫測試類,保存在文件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);

12、 System.out.println(radius = + x.radius); 2.2.3 數(shù)據(jù)成員(續(xù))例2_2類與對象28編譯后運(yùn)行結(jié)果如下:Circle26b249radius =0解釋之后的數(shù)值為x所指的對象的存儲地址x的值及對象的狀態(tài)如圖2.2.3 數(shù)據(jù)成員(續(xù))例2_2運(yùn)行結(jié)果類與對象29聲明一個表示矩形的類,保存在Rectangle.java中;編寫測試類,保存在ShapeTester.java中,二文件保存在相同的目錄下public class Rectangle double width = 10.128; double height = 5.734; public cl

13、ass ShapeTester public static void main(String args) Circle x; Rectangle y; x = new Circle(); y = new Rectangle(); System.out.println(x + + y); 2.2.3 數(shù)據(jù)成員(續(xù))例2_3類與對象30編譯后運(yùn)行結(jié)果如下:Circle82f0db Rectangle92d342解釋Circle及Rectangle類對象的狀態(tài)如圖2.2.3 數(shù)據(jù)成員(續(xù))例2_3運(yùn)行結(jié)果類與對象31對ShapeTester類進(jìn)行修改,使兩個實(shí)例具有不同的實(shí)例變量值public cl

14、ass ShapeTester public static void main(String args) Circle x; Rectangle y, z; x = new Circle(); 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.3 數(shù)據(jù)成員(續(xù))例2_3修改類與對象32編譯后運(yùn)行結(jié)果如下:50 10.128 68.94解釋Circl

15、e及Rectangle類對象的狀態(tài)如圖2.2.3 數(shù)據(jù)成員(續(xù))修改后運(yùn)行結(jié)果類與對象33地址簿程序一個人的地址通常包括以下信息:姓名,省份,城市,街道,門牌號,郵政編碼采用過程化的程序設(shè)計方法,不使用結(jié)構(gòu)體和數(shù)組,使用簡單變量存儲,那么存儲兩個人地址的代碼如下2.2.3 數(shù)據(jù)成員(續(xù))例2_4類與對象34public static void main(String args) String name1,name2; int gateNumber1, gateNumber2; String streetName1,streetName2; String city1,city2; String

16、province1,province2; String postalCode1,postalCode2; name1 = Zhang Li; gateNumber1 = 15; streetName1 = Tsinghua East Road; city1 = Beijing; province1 = “Beijing; postalCode1 = 100084; name2 = Li Hong; gateNumber2 = 2; streetName2 = BeiNong; city2 = Beijing; province2 = Beijing; postalCode2 = 102206;

17、 /.do something interesting 2.2.3 數(shù)據(jù)成員(續(xù))例2_4類與對象35采用面向?qū)ο蟮某绦蛟O(shè)計方法,那么需要首先聲明Address類如下public class Address String name; int gateNumber; String streetName; String city; String province; String postalCode; /方法成員略 2.2.3 數(shù)據(jù)成員(續(xù))例2_4類與對象36主方法改寫如下public static void main(String args) Address address1 = new Ad

18、dress();Address address2 = new Address(); = “Zhang Li; address1.streetNumber = 15; address1.streetName = “Tsinghua East Road; address1.city = “Beijing; vince = “Beijing; address1.postalCode = “100084; = “Li Hong; address2.streetNumber = 2; address2.streetName = “BeiNong;

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

20、PIpublic class Circle static double PI = 3.14159265; int radius; 當(dāng)我們生成Circle類的實(shí)例時,在每一個實(shí)例中并沒有存儲PI的值,PI的值存儲在類中2.2.3 數(shù)據(jù)成員(續(xù))例2_5類與對象392.2.3 數(shù)據(jù)成員(續(xù))例2_5類與對象PI3.14159265radius29radius45radius68radius120類變量和實(shí)例變量的存儲40對類變量進(jìn)行測試public class ClassVariableTester public static void main(String args) Circle x = n

21、ew 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); 2.2.3 數(shù)據(jù)成員(續(xù))例2_5運(yùn)行結(jié)果類與對象測試結(jié)果:3.141592653.141592653.143.1441聲明一個Point類,有兩個私有變量保存點(diǎn)坐標(biāo),一個類變量保存已有點(diǎn)的個數(shù)public class Point private int x; private int y; public st

22、atic int pointCount=0; public Point(int x, int y) this.x = x; this.y = y; pointCount+;2.2.3 數(shù)據(jù)成員(續(xù))Point.java類與對象構(gòu)造方法:用于初始化該類的一個新建對象。一個類可以有多個構(gòu)造方法。42測試類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.ou

23、t.println(q.pointCount); System.out.println(q.pointCount = Point.pointCount); System.out.println(Point.pointCount);2.2.3 數(shù)據(jù)成員(續(xù))Point類測試類與對象測試結(jié)果:12true243實(shí)例變量和類變量都可被聲明為final,表示這個變量一旦被初始化便不可改變對根本類型來說,其值不變對對象變量來說,其引用不可再變final變量的初始化可以在兩個地方:在定義處在構(gòu)造方法中兩個地方只能任選其一2.2.3 數(shù)據(jù)成員(續(xù))final修飾符類與對象442.2.4 方法成員方法成員定義

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

25、象方法native用來集成java代碼和其它語言的代碼synchronized用來控制多個并發(fā)線程對共享數(shù)據(jù)的訪問throws exceptionList用來處理異常2.2.4 方法成員(續(xù))格式說明類與對象47格式說明(續(xù))返回類型方法返回值的類型,可以是任意的Java數(shù)據(jù)類型當(dāng)不需要返回值時,返回類型為void參數(shù)類型簡單數(shù)據(jù)類型,引用類型(數(shù)組、類或接口)可以有多個參數(shù),也可以沒有參數(shù),方法聲明時的參數(shù)稱為形式參數(shù)方法體方法的實(shí)現(xiàn)包括局部變量的聲明以及所有合法的Java指令局部變量的作用域只在該方法內(nèi)部throws exceptionList用來處理異常2.2.4 方法成員(續(xù))格式說明

26、類與對象48方法調(diào)用給對象發(fā)消息意味著調(diào)用對象的某個方法從對象中取得信息 修改對象的狀態(tài)或進(jìn)行某種操作 進(jìn)行計算及取得結(jié)果等調(diào)用格式.參數(shù)列表稱點(diǎn)操作符“.前面的為消息的接收者(receiver)2.2.4 方法成員(續(xù))方法調(diào)用類與對象49 實(shí)例方法表示特定對象的行為聲明時前面不加static修飾符使用時需要發(fā)送給一個類實(shí)例2.2.4 方法成員(續(xù))實(shí)例方法類與對象50在Circle類中聲明計算周長的方法 public class Circle static double PI = 3.14159265; int radius; public double circumference() r

27、eturn 2 * PI * radius; 由于radius是實(shí)例變量,在程序運(yùn)行時,Java會自動取其接收者對象的屬性值2.2.4 方法成員(續(xù))例2_6類與對象實(shí)例方法51方法調(diào)用測試public class CircumferenceTester 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

28、 = c2.circumference(); (Circle 1 has circumference + circum1); (Circle 2 has circumference + circum2); 2.2.4 方法成員(續(xù))例2_6類與對象52運(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屬性值

29、;在執(zhí)行c2.circumference()時,radius的值為c2的radius屬性值類與對象2.2.4 方法成員(續(xù))例2_6運(yùn)行結(jié)果53在Circle類及Rectangle類中聲明計算面積的方法area()2.2.4 方法成員(續(xù))例2_7public class Circle static double PI = 3.14159265; int radius; public double circumference() return 2 * PI * radius; public double area() return PI * radius * radius; public cl

30、ass Rectangle double width; double height; public double area() return width * height; 其中area表現(xiàn)出其多態(tài)性類與對象54聲明測試類,對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

31、= 30; System.out.println(Circle has area + c.area(); System.out.println(Rectangle has area + r.area(); 類與對象2.2.4 方法成員(續(xù))例2_755運(yùn)行結(jié)果Circle has area 7853.981625Rectangle has area 600.0說明不同的類中可以聲明相同方法名的方法使用時,系統(tǒng)會根據(jù)接收者對象的類型找到相應(yīng)類的方法2.2.4 方法成員(續(xù))例2_7運(yùn)行結(jié)果類與對象56帶參數(shù)的方法舉例:在Circle類中增加方法改變圓的半徑public class Circle

32、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; 2.2.4 方法成員(續(xù))例2_8類與對象57測試類public class EnlargeTester public static void main(String args) Circl

33、e 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(Circle 2 擴(kuò)大后的周長: + c2.circumference(); 2.2.4 方法成員(續(xù))例2_8類與對象58運(yùn)行結(jié)果Circle 1 的周

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

35、t factor) radius = radius * factor; public boolean fitsInside (Rectangle r) return (2 * radius r.width) & (2 * radius r.height); 2.2.4 方法成員(續(xù))例2_9類與對象60 測試類 public class InsideTester public static void main(String args) Circle c1 = new Circle(); c1.radius = 8; Circle c2 = new Circle(); c2.radius = 1

36、5; 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); 2.2.4 方法成員(續(xù))例2_9類與對象61運(yùn)行結(jié)果Circle 1 fits inside Rectangle: trueCircle 2 fits inside Rectangle:

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

38、r中public class Converter public static int centigradeToFahrenheit(int cent) return (cent * 9 / 5 + 32); 方法調(diào)用Converter.centigradeToFahrenheit(40);2.2.4 方法成員(續(xù))例2_10類與對象64包是一組類的集合一個包可以包含假設(shè)干個類文件,還可包含假設(shè)干個包包的作用將相關(guān)的源代碼文件組織在一起類名的空間管理,利用包來劃分名字空間,便可以防止類名沖突提供包一級的封裝及存取權(quán)限2.2.5 類的組織包的概念類與對象65包的命名每個包的名稱必須是“獨(dú)一無二的J

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

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

41、續(xù))類與對象69引入包 為了使用其它包中所提供的類,需要使用import語句引入所需要的類Java編譯器為所有程序自動引入包java.langimport語句的格式 import package1.package2. (classname |*);其中package1.package2說明包的層次,它對應(yīng)于文件目錄classname那么指明所要引入的類名如果要引入一個包中的所有類,那么可以使用星號*來代替類名例如:import java.awt.*; import java.io.*; import ;類與對象2.2.5 類的組織包的概念(續(xù))70類的訪問控制類的訪問控制只有public公共類

42、及無修飾符缺省類兩種訪問權(quán)限符與訪問能力之間的關(guān)系如表類與對象2.2.6 類的訪問控制類型無修飾public同一包中的類yesyes不同包中的類noyes71類成員的訪問控制公有(public)可以被其他任何對象訪問(前提是對類成員所在的類有訪問權(quán)限) 保護(hù)(protected)只可被同一類及其子類的實(shí)例對象訪問私有(private)只能被這個類本身訪問,在類外不可見默認(rèn)(default)僅允許同一個包內(nèi)的訪問;又被稱為“包package)訪問權(quán)限2.2.6 類成員的訪問控制類與對象72類型private無修飾protectedpublic同一類yesyesyesyes同一包中的子類noyes

43、yesyes同一包中的非子類noyesnoyes不同包中的子類nonoyesyes不同包中的非子類nononoyes2.2.6 類成員的訪問控制(續(xù))類與對象73對例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; 2.2.6 類成員的訪問控制(續(xù))例2_11類與對象74再編譯CircumferenceTester.javap

44、ublic class CircumferenceTester 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(); (Circle 1 has circumference + circum1); (Circle 2 has circumference + cir

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

46、et方法名以“get開頭,后面是實(shí)例變量的名字一般具有以下格式:public get() return ; 對于實(shí)例變量radius,聲明其get方法如下:public int getRadius() return radius; 2.2.6 類成員的訪問控制(續(xù))get方法類與對象77set方法功能是修改屬性變量的值set方法名以“set開頭,后面是實(shí)例變量的名字一般具有以下格式public void set( ) = ; 聲明實(shí)例變量radius的set方法如下:public void setRadius(int r) radius = r;2.2.6 類成員的訪問控制(續(xù))set方法類與

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

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

49、法體為空使用默認(rèn)的構(gòu)造方法初始化對象時,如果在類聲明中沒有給實(shí)例變量賦初值,那么對象的屬性值為零或空對象初始化和回收2.3.1 構(gòu)造方法(續(xù))默認(rèn)構(gòu)造方法83聲明一個銀行帳號類及測試代碼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

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

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

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

53、聲明,至少聲明一個無參構(gòu)造方法對象初始化和回收2.3.1 構(gòu)造方法(續(xù))自定義無參構(gòu)造方法88構(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.1 構(gòu)造方法(續(xù))Bush.java對象初始化和回收89在例2_13根底上再聲明一個無參的構(gòu)造方法public BankAccount()

54、ownerName = ; accountNumber = 999999; balance = 0.0f; 對象初始化和回收2.3.1 構(gòu)造方法(續(xù))例2_1490創(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 info() prt(Tree is + heig

55、ht + feet tall); void info(String s) prt(s + : Tree is + height + feet tall); static void prt(String s) System.out.println(s); 2.3.1 構(gòu)造方法(續(xù))Tree.java對象初始化和回收91測試Tree類public class Overloading public static void main(String args) for(int i = 0; i 5; i+) Tree t = new Tree(i); (); (overloaded method); n

56、ew Tree(); 2.3.1 構(gòu)造方法(續(xù))Overloading.java對象初始化和回收92測試結(jié)果Creating new Tree that is 0 feet tallTree is 0 feet talloverloaded method: Tree is 0 feet tallCreating new 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 tallov

57、erloaded 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 feet tallTree is 4 feet talloverloaded method: Tree is 4 feet tallPlanting a seedling2.3.1 構(gòu)造方法(續(xù))Overloading測試結(jié)果對象初始化和回收93this關(guān)鍵字的使用可以使用this關(guān)

58、鍵字在一個構(gòu)造方法中調(diào)用另外的構(gòu)造方法代碼更簡潔,維護(hù)起來也更容易通常用參數(shù)個數(shù)比較少的構(gòu)造方法調(diào)用參數(shù)個數(shù)最多的構(gòu)造方法2.3.1 構(gòu)造方法(續(xù))this關(guān)鍵字的使用對象初始化和回收94使用this關(guān)鍵字,修改BankAccout類中無參數(shù)和二參數(shù)的構(gòu)造方法對象初始化和回收public BankAccount() this(, 999999, 0.0f); public BankAccount(String initName, int initAccountNumber) this(initName, initAccountNumber, 0.0f); public BankAccount(

59、String initName, int initAccountNumber, float initBalance) ownerName = initName; accountNumber = initAccountNumber; balance = initBalance; 2.3.1 構(gòu)造方法(續(xù))BankAccount.java95內(nèi)存回收技術(shù)當(dāng)一個對象在程序中不再被使用時,就成為一個無用對象當(dāng)前的代碼段不屬于對象的作用域把對象的引用賦值為空J(rèn)ava運(yùn)行時系統(tǒng)通過垃圾收集器周期性地釋放無用對象所使用的內(nèi)存Java運(yùn)行時系統(tǒng)會在對對象進(jìn)行自動垃圾回收前,自動調(diào)用對象的finalize()方

60、法2.3.2 內(nèi)存回收技術(shù)對象初始化和回收96垃圾收集器自動掃描對象的動態(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)行2.3.2 內(nèi)存回收技術(shù)(續(xù))垃圾收集器對象初始化和回收97finalize()方法在類中聲明,因此 Java中的每一個類都有該方法用于釋放系統(tǒng)資源,如關(guān)閉翻開的文件或socket等聲明格式protected void finalize() throws throwable如果一個類需要釋放除內(nèi)存以外的資源,那么需在類中重寫finalize()方法2.

溫馨提示

  • 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

提交評論