類的定義和應(yīng)用_第1頁
類的定義和應(yīng)用_第2頁
類的定義和應(yīng)用_第3頁
類的定義和應(yīng)用_第4頁
類的定義和應(yīng)用_第5頁
已閱讀5頁,還剩58頁未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

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

文檔簡介

1、第五章 類的定義教學(xué)內(nèi)容什么是類5.1定義類5.2方法的定義5.3 構(gòu)造函數(shù)5.4類的定義和使用5.5 方法重載5.6對(duì)象的使用5.7教學(xué)內(nèi)容遞歸理解包5.9控制對(duì)類成員的訪問5.10 嵌套類5.11finalize( )方法5.12本地方法5.13教學(xué)重點(diǎn)了解面向?qū)ο笏枷?,掌握?duì)象和類的基本概念、明確Java中的類的定義方法、構(gòu)造方法、方法重載和this的使用。 掌握對(duì)象的使用方法,明確封裝的作用與方法。 了解繼承的基本概念,明確方法重寫的作用,要注意與重載的區(qū)別,掌握super關(guān)鍵字的使用、繼承中的構(gòu)造方法調(diào)用;了解Finalizer。 掌握多態(tài)性的基本概念、明確多態(tài)實(shí)現(xiàn)的條件,熟練掌握多

2、態(tài)性的代碼實(shí)現(xiàn) 類的定義:類是一類對(duì)象的抽象或原形,它定義了該類對(duì)象的共同的狀態(tài)和方法。用戶可以使用類的定義來生成該類的對(duì)象,生成的對(duì)象將可以使用該類的所以組件。類中包含兩種內(nèi)容:(1)成員(field)域:是存儲(chǔ)數(shù)據(jù)項(xiàng)的變量。成員域也稱類的數(shù)據(jù)成員(data member)。(2)方法(method):定義了用戶可以進(jìn)行的操作,也決定了利用類的對(duì)象可以做的事情。5.1 什么是類例1. 定義了一個(gè)名為SimplePoint 的類public class SimplePoint public int x = 0; /x為成員變量 public int y = 0; /y為成員變量 5.1 什么是

3、類5.1 什么是類當(dāng)創(chuàng)建一個(gè)新的對(duì)象時(shí)(對(duì)該類實(shí)例化), 就會(huì)為該對(duì)象及其成員分配空間,同時(shí)對(duì)成員變量進(jìn)行初始化。例2 定義一個(gè)名為SimpleRectangle類public class SimpleRectangle public int width = 0;public int height = 0;public SimplePoint origin = new SimplePoint();5.1 什么是類5.1 什么是類5.1 什么是類例3 public class Point public int x = 0; public int y = 0; / a constructor! p

4、ublic Point(int x, int y) this.x = x; this.y = y; new Point(44, 78)類變量(class variable):也稱為靜態(tài)成員變量(static field)。在聲明時(shí)使用關(guān)鍵字static。只與類有關(guān),被該類的所有對(duì)象共享。未創(chuàng)建該類的對(duì)象時(shí),這些變量仍然存在。實(shí)例變量(instance varible):也稱為非靜態(tài)成員變量(non-static field)。該類型變量與類的每個(gè)實(shí)例有關(guān)。該類的每個(gè)實(shí)例都有他自己的變量的副本和賦值。5.1.1 類定義中的變量類Sphere的定義public class Sphere /clas

5、s variablestatic double PI=3.14;/instance variabledouble xCenter;double yCenter;double zCenter;double radius;由所有對(duì)象共享globexCenteryCenterzCenterradiusballxCenteryCenterzCenterradius方法的定義:提供了使用類定義中指定的變量進(jìn)行的操作。方法的分類:實(shí)例方法(instance method):只可以在特定的對(duì)象中執(zhí)行。類方法(class method):使用static進(jìn)行聲明,即使該類沒有對(duì)象存在也可以執(zhí)行。注意:類方法不

6、能引用實(shí)例變量。5.1.2 類定義中的方法訪問靜態(tài)成員或靜態(tài)方法:類名.成員名類名.方法名例如: double rootPi = Math.sqrt ( Math. PI );實(shí)例變量和實(shí)例方法只能通過對(duì)象的引用來調(diào)用,因?yàn)樵诙x中已經(jīng)和一個(gè)特定的對(duì)象相關(guān)。例如:若有對(duì)象ball存在,則: double ballVolume = ball.volume();5.1.3 變量和方法的訪問定義類:class 類名類的詳細(xì)定義; 5.2 定義類例如: class Sphere static final double PI=3.14; static int count=0; double radius

7、; double xCenter; double yCenter; double zCenter; 方法概念:是一個(gè)自包含的代碼塊有自己的名稱及可以重復(fù)使用的屬性可以根據(jù)需要在程序多個(gè)不同的地方被執(zhí)行可以使用其名字來調(diào)用方法方法可以指定返回值的類型,若沒有返回值,則應(yīng)聲明方法的返回對(duì)象類型為void5.3 方法的定義方法的基本結(jié)構(gòu)如下:return_type methodName(arg1,arg2,argn)statement;方法的形式參數(shù)出現(xiàn)在方法名后的大括號(hào)中,指定了在方法調(diào)用時(shí)需要向其傳遞的信息。當(dāng)用戶調(diào)用方法時(shí)提供給形參的值稱為實(shí)參。注意:方法也可以沒有參數(shù)。5.3 方法的定義有返

8、回值:return return_value;無返回值:return 或 不寫注意:如果方法有返回值,則返回值的類型要與聲明方法時(shí)定義的返回值類型保持一致。5.3.1 由方法返回形參:定義了當(dāng)調(diào)用該方法時(shí)傳遞給該方法的類型及其值,包括參數(shù)類型和參數(shù)名,并出現(xiàn)在方法定義的形參列表中。實(shí)參:定義了執(zhí)行方法時(shí)傳遞給形參的值,而且實(shí)參的值通過執(zhí)行該方法時(shí)的形參名來引用。注意: (1)實(shí)參值的類型一定要和定義方法時(shí)對(duì)應(yīng)的形參類型保持一致。 (2)對(duì)于非類對(duì)象的數(shù)據(jù),實(shí)參到形參的數(shù)據(jù)采用值傳遞的方法。5.3.2 形式參數(shù)表示例程序: VariableDemofinal形參意義:如果將方法中的形參聲明為fi

9、nal,可以防止再調(diào)用該方法時(shí),實(shí)參的值被修改。說明:final形參對(duì)于值傳遞的方式?jīng)]有意義,而對(duì)于引用類對(duì)象的形參有意義,這樣做可以防止對(duì)實(shí)參對(duì)象的誤操作。5.3.2 形式參數(shù)表定義類方法:在定義的方法前面加關(guān)鍵字static。例:class Spherestatic int getCount() return count;注意:這樣的方法不能直接引用任何實(shí)例變量。因?yàn)椴淮嬖谌魏晤悓?duì)象靜態(tài)方法也能被執(zhí)行。5.3.3 類方法的定義實(shí)例方法可以訪問類的任何數(shù)據(jù)成員,直接使用即可。class Spherestatic final double PI=3.14;static int count=0;

10、double radius;double xCenter;double yCenter;double zCenter; static int getCount() return count; double volume() return 4.0/3.0*PI*radius*radius*radius; 5.3.4 在方法中訪問類的數(shù)據(jù)成員每個(gè)實(shí)例方法都有一個(gè)名為this的變量,它引用調(diào)用該方法的當(dāng)前對(duì)象,即當(dāng)一個(gè)方法引用類的一個(gè)實(shí)例變量時(shí),由編譯器默認(rèn)使用。例如,類中有實(shí)例變量value、a、b,則如下兩條語句等價(jià)。 value = a+b; this.value = this.a+this.

11、b;5.3.5 this變量this是Java的一個(gè)關(guān)鍵字,表示某個(gè)對(duì)象。 this可以出現(xiàn)在實(shí)例方法和構(gòu)造方法中,但不可以出現(xiàn)在類方法中。 this關(guān)鍵字出現(xiàn)在類的構(gòu)造方法中時(shí),代表使用該構(gòu)造方法所創(chuàng)建的對(duì)象。 this關(guān)鍵字出現(xiàn)在類的實(shí)例方法中時(shí),代表正在調(diào)用該方法的當(dāng)前對(duì)象。 5.3.5 this變量class Sphere static final double PI = 3.14; / 初始化靜態(tài)成員 double radius = 5.0; /初始化非靜態(tài)成員 double xCenter = 10.0; /初始化非靜態(tài)成員 5.3.6 初始化數(shù)據(jù)成員初始化塊: 指位于括號(hào)中的一個(gè)

12、代碼塊,它在類的對(duì)象生成之前執(zhí)行初始化塊的分類:1、靜態(tài)初始化塊:使用static定義的代碼塊,當(dāng)類裝載到系統(tǒng)時(shí)將執(zhí)行一次。靜態(tài)初始化塊只能初始化類的靜態(tài)數(shù)據(jù)成員。2、非靜態(tài)初始化塊:對(duì)每個(gè)要生成的對(duì)象執(zhí)行一次,可以初始化類的實(shí)例變量。程序見:5.3.6 初始化數(shù)據(jù)成員構(gòu)造函數(shù):函數(shù)名與類名相同,且不指定返回對(duì)象類型,可以有參數(shù),也可以無參數(shù),一個(gè)類中可以有多個(gè)構(gòu)造函數(shù)。構(gòu)造函數(shù)功能:在對(duì)象實(shí)例化時(shí),系統(tǒng)首先調(diào)用構(gòu)造函數(shù),對(duì)生成的對(duì)象的實(shí)例變量進(jìn)行初始化,其由系統(tǒng)默認(rèn)調(diào)用。注意:如果類中沒有顯示聲明構(gòu)造函數(shù),則系統(tǒng)會(huì)提供一個(gè)默認(rèn)的構(gòu)造函數(shù),其無參,并且不做任何工作。5.4 構(gòu)造函數(shù)例如:cla

13、ss Sphere double radius, xCenter, yCenter, zCenter; Sphere(double theRadius, double x, double y, double z) radius = theRadius; xCenter = x; yCenter = y; zCenter = z; 5.4 構(gòu)造函數(shù)如果沒有為類定義任何構(gòu)造函數(shù),編譯器將自動(dòng)提供一個(gè)默認(rèn)構(gòu)造函數(shù),但其沒有任何參數(shù),也沒有任何語句,僅提供一個(gè)生成對(duì)象的入口。注意: 如果類中已有構(gòu)造函數(shù),則系統(tǒng)將不再提供默認(rèn)構(gòu)造函數(shù),如果此時(shí)需要一個(gè)無參構(gòu)造函數(shù),則需要顯示定義一個(gè)。5.4.1 默認(rèn)構(gòu)

14、造函數(shù)聲明類類型變量 Sphere ball;注意:此時(shí)系統(tǒng)沒有生成對(duì)象,因此也就沒有調(diào)用構(gòu)造函數(shù),只是生成了用于存儲(chǔ)該對(duì)象的引用。生成類對(duì)象 ball = new Sphere(10.0, 1.0, 1.0, 1.0);5.4.2 生成類的對(duì)象將對(duì)象傳遞給方法: 把對(duì)象當(dāng)作實(shí)參傳遞給一個(gè)方法的時(shí)候,采用引用傳遞的機(jī)制。即實(shí)參和形參引用的是同一個(gè)對(duì)象,沒有對(duì)實(shí)際對(duì)象進(jìn)行復(fù)制。對(duì)象的生存期: 對(duì)象的生存期由引用它的變量決定,即對(duì)象將在引用它的變量的作用域之外消失。處理消失對(duì)象的過程稱為垃圾收集。程序見:CreateSpheres.java 和5.4.2 生成類的對(duì)象注意:將兩個(gè)源程序放在一個(gè)目錄

15、下,在JDK編譯器下,只需編譯包含main()定義的文件,就可以編譯該程序涉及到的所有源文件。方法重載:在一個(gè)類中,用同樣的名字定義的多個(gè)方法。重載條件:各重載函數(shù)的形參列表必須不相同。注意: 函數(shù)返回值不能作為判斷重載的條件。簽名:方法的名稱、形參的類型及其順序統(tǒng)稱為簽名。類中的每個(gè)方法的簽名都必須唯一,編譯器將以此判斷該調(diào)用那一個(gè)函數(shù)。5.6 方法重載如果希望通過不同的初始化數(shù)據(jù)產(chǎn)生產(chǎn)生類的對(duì)象,則可以采用重載構(gòu)造函數(shù)的方法。例如:Sphere(double x, double y, double z) xCenter = x; yCenter = y; zCenter = z; radi

16、us = 1.0; +count;5.6.1 多個(gè)構(gòu)造函數(shù)Sphere() xCenter = 0; yCenter = 0; zCenter = 0; radius = 1.0; +count;在一個(gè)構(gòu)造函數(shù)中調(diào)用構(gòu)造函數(shù): 類的構(gòu)造函數(shù)可以在其第一條可執(zhí)行語句中調(diào)用該類的另一個(gè)構(gòu)造函數(shù),可以省去大量的重復(fù)代碼。調(diào)用方法:可以使用this作為名稱,在其后面的括號(hào)中根據(jù)需要列出適當(dāng)?shù)膮?shù)。5.6.1 多個(gè)構(gòu)造函數(shù)Sphere() radius = 1.0; +count;Sphere(double x, double y, double z) this(); / 注意在第一句調(diào)用 xCente

17、r = x; yCenter = y; zCenter = z;5.6.1 多個(gè)構(gòu)造函數(shù) Sphere ball = new Sphere(10.0, 10,0, 0.0); Sphere newBall = ball;則newBall將引用與ball相同的對(duì)象,而沒有生成新對(duì)象,在修改這個(gè)對(duì)象時(shí),ball和newBall都發(fā)生變化??梢圆捎脧?fù)制構(gòu)造函數(shù)的方法,將原對(duì)象作為參數(shù),通過復(fù)制對(duì)象中的實(shí)例變量,來生成新的對(duì)象。5.6.2 使用構(gòu)造函數(shù)復(fù)制對(duì)象例如:Sphere(final Sphere oldSphere) radius = oldSphere.radius; xCenter= ol

18、dSphere.xCenter; yCenter = oldSphere.yCenter; zCenter = oldSphere.zCenter; +count; Sphere ball = new Sphere(10.0, 10,0, 0.0);Sphere newBall = new Sphere(ball);5.6.2 使用構(gòu)造函數(shù)復(fù)制對(duì)象本例作為上機(jī)練習(xí)題,讓學(xué)生自己調(diào)試5.7 對(duì)象的使用遞歸:一個(gè)方法調(diào)用自己的過程被稱為遞歸。遞歸分類:直接遞歸間接遞歸例題:編寫一個(gè)方法計(jì)算一個(gè)變量的整數(shù)冪。程序見:本例作為上機(jī)練習(xí)題,又學(xué)生自己調(diào)試5.8 遞歸import java.util.Sc

19、anner;public class Digui static long fac(int n) if(n=1) return 1; else return n*fac(n-1); public static void main(String args) int k; long f; Scanner sc=new Scanner(System.in); System.out.println(請(qǐng)輸入K的值:); k=sc.nextInt(); f=fac(k); System.out.println(f=+f); 遞歸級(jí)別 執(zhí)行操作 0 fac(5) 1 fac(4) 2 fac(3) 3 fac

20、(2) 4 fac(1) 4 返回1 fac(1) 3 返回2 fac(2) 2 返回6 fac(3) 1 返回24 fac(4) 0 返回120 fac(5)為了便于管理大型軟件系統(tǒng)中數(shù)目眾多的類,解決類命名沖突的問題,Java引入了包(package)。5.9 理解包javalangSystemioString包(package) :是有唯一命名的類的集合,應(yīng)著文件系統(tǒng)的目錄層次結(jié)構(gòu)包的作用:在一個(gè)包中使用的類名不會(huì)影響到另一個(gè)包中或編寫的程序中可能出現(xiàn)的類名。例如:在默認(rèn)包中的中使用的類String,全名是package語句必須是文件中的第一條語句。也就是說,在package語句之前,除

21、了空白和注釋之外不能有任何語句。如果不加package語句,則指定為缺省包或無名包。在package語句中,用“.”來指明包(目錄)的層次。5.9 理解包為在包Geometry中包含類Sphere,文件中應(yīng)包含如下內(nèi)容: package Geometry; / 包語句,需放在第一行 public class Sphere 其它類若想包含在Geometry中,也必須在類定義的開始處包含同一條語句,并且所有的類文件都存儲(chǔ)在與包名相同的目錄下。注意:若包中的類想被包外訪問,則類和類中的函數(shù)都應(yīng)定義為public。5.9.1 類的打包包和目錄結(jié)構(gòu):一個(gè)包中可以有多個(gè)分類,例如已經(jīng)開發(fā)了多組處理幾何問題

22、的類:(1)對(duì)文件:處理2D圖形的文件加入:package Geometry.Shapes2D;處理3D圖形的文件加入:package Geometry.Shapes3D;(2)對(duì)目錄:處理2D圖形的文件存放在:GeometryShapes2d目錄下處理3D圖形的文件存放在:GeometryShapes3d目錄下5.9.1 類的打包包的編譯命令: javac classpath “c:temp” 包路徑:是指包含該包目錄的上一級(jí)目錄的路徑,注意不包含該包目錄名本身。例如,包的源文件存儲(chǔ)在C:tempGeometry下,則包路徑為:C:temp。 5.9.1 類的打包包的訪問方法一:設(shè)置環(huán)境變量

23、CLASSPATH方法二:使用-classpath來指明包的位置例如:Javac classpath “c:myPackages” my5.9.1 類的打包使用擴(kuò)展包擴(kuò)展包是.java文件,存放在JDK的ext目錄下,在此目錄下的.jar文件,將自動(dòng)成為可訪問的文件,不需要設(shè)置CLASSPATH環(huán)境變量或-classpath選項(xiàng)。命令格式: jar cvf Geometry.jar Geometry*.class此命令將生成,并在其中加入位于Geometry目錄下的所有的.class文件,為使這個(gè)包對(duì)任何程序都可用,可將其復(fù)制到JDK的ext目錄下。5.9.1 類的打包導(dǎo)入語句import:把

24、一個(gè)包中的所有或任何類加入到程序代碼中,例如引入整個(gè)包: import Geometry.Shapes3d.*;例如引入包中的某個(gè)類: import Geometry.Shapes3d.Shape;5.9.2 將包中的類添加到程序中如前例,包中的類Sphere的全名是,這樣可以很好的避免了類的重名問題。 如果不使用導(dǎo)入語句,仍然可以使用某個(gè)類,例如: Geometry.Shapes3D.Sphere ball = Geometry.Shapes3D.Sphere(10.0, 1.0, 1.0, 1.0);5.9.3 程序中的包和名稱計(jì)算圓面積公式:*r*r; 這里的即為一靜態(tài)成員,可以通過從類

25、Math中導(dǎo)入PI成員名來刪除PI前綴Math,例如: import static java.lang.Math.PI;也可采用 import static java.lang.Math.* 來導(dǎo)入該類的所有靜態(tài)成員,此時(shí)即可直接使用sqrt(),random()等方法,但這樣也增加了名字沖突的概率。5.9.4 導(dǎo)入靜態(tài)類成員一個(gè)類的方法和變量根據(jù)其設(shè)定的訪問屬性,如果屬于同一個(gè)包,或其聲明為public,則可以被其它類訪問。5.10 控制對(duì)類成員的訪問5.10.1 使用訪問屬性屬性允許的訪問default(無訪問屬性)來自同一包中任何類的方法訪問public來自任何類的方法的訪問privat

26、e只允許來自該類內(nèi)部的方法訪問protected來自同一包中任何類以及該類的任何地方的任何子類的方法訪問5.10.2 指定訪問屬性指定類成員的訪問屬性,必須在聲明語句的開始部分加上相應(yīng)的關(guān)鍵字。例如:public class Point public Point(double xVal, double yVal)x=xVal; y=yVal; public double getX() return x; /訪問器方法 public double setX(double inputX) x=inputX; /增變方法 private double x, y;5.10.3 選擇訪問屬性一般,一個(gè)p

27、ublic類的變量應(yīng)該聲明為private,并將其外部調(diào)用的方法聲明為public。注意:1、如果類中一些成員被設(shè)置成final,其又被類外使用,可將其聲明為public。2、若成員僅供該類內(nèi)部使用,應(yīng)指定為private。3、若某些成員只是一種使用函數(shù)和標(biāo)準(zhǔn)數(shù)值的容器,可將其指定為public。例如Math中的函數(shù)。5.11 嵌套類嵌套類:在一個(gè)類中定義另外一個(gè)類,這個(gè)類就叫做嵌套類或內(nèi)部類或內(nèi)置類(inner class) 。內(nèi)部類可以將邏輯上相關(guān)的一組類組織起來,并由外部類(outer class)來控制內(nèi)部類的可見性。當(dāng)建立一個(gè)inner class時(shí),其對(duì)象就擁有了與外部類對(duì)象之間的

28、一種關(guān)系,這是通過一個(gè)特殊的this reference形成的,使得內(nèi)部類對(duì)象可以隨意的訪問外部類中所有的成員。頂層類:包含嵌套類,但本身不是嵌套類的類。5.11 嵌套類public class Outside public class Inside class Outer private int index = 100; void print() Inner i = new Inner(); i.print(); class Inner void print() System.out.println(index); class Test public static void main(String args) Outer o = new Outer(); o.print(); public class Outer private String myString = outer; private String outerString =outer outer!; void test() System.out.print(test ); System.out.println(myString); new Inner().testInner(); private void test2() System.out.pr

溫馨提示

  • 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)論