版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認(rèn)領(lǐng)
文檔簡介
1、第章面向?qū)ο蟪绦蛟O(shè)計,4.1 類 4.2 static 關(guān)鍵字 4.3 對象 4.4 this 關(guān)鍵字 4.5 變量的作用域 4.6 包 4.7 訪問權(quán)限 4.8 類的繼承 4.9 向上轉(zhuǎn)型,4.10 多態(tài)性 4.11 abstract 類和abstract方法 4.12 接口 4.13 內(nèi)部類 4.14 匿名類 4.15 異常 4.16 Class類 4.17 基本類型的類包裝,4.1 類,類是組成Java程序的基本要素。類封裝了一類對象的屬性和方法。類是用來定義對象的模板。,4.1.1 類的定義,publicabstract|final class People “class People
2、”叫做類聲明;“People” 是類名。 注意:不可以用protected、private修飾類。 類聲明之后的一對大括號“”,“”以及它們之間的內(nèi)容稱做類體,大括號之間的內(nèi)容稱做類體的內(nèi)容。 類體的內(nèi)容由兩部分構(gòu):一部分是成員變量的定義,用來刻畫屬性;另一部分是方法的定義,用來刻畫功能。,類聲明,類體,class Triangle float width,height; /成員變量定義部分 double area () /方法定義 return width * height * 0.5; void setHeight(float h) /方法定義 height=h; void setWidt
3、h(float w) /方法定義 width=w; ,4.1.1 類的定義(續(xù)),4.1.2 類的成員變量,成員變量完整的聲明格式如下:public|protected|private static final transient volatile 注意: (1)static聲明的變量稱為類變量。其他可稱為實例變量。 (2)final用來聲明一個常量。 (3)transient用來聲明一個臨時變量。 (4)volatile用于并發(fā)線程。,4.1.3 方法,方法一般格式: public|protected|privatestaticfinal|abstract nativesynchronize
4、d ()throws 注意: (1)static聲明的方法稱為類方法,其他的可稱為實例方法。 (2)final聲明方法不能被子類重寫。 (3)native聲明的方法可用其他語言實現(xiàn)。 (4)synchronized用來控多個并發(fā)線程對共享數(shù)據(jù)的訪問.,4.1.4 方法重載,含義:在同一個類中一個方法名被用來定義多個 方法。 classScreen public void print( int i) public void print( float i) public void print( double d ) 重載必須遵守原則: 參數(shù)表必須不同,以此區(qū)分不同方法體。 返回類型、修飾符可相同或
5、不相同。,4.1.5 構(gòu)造方法,構(gòu)造方法是一種特殊方法,它的名字必須與它所在的類的名字完全相同,而且沒有類型,構(gòu)造方法也可以重載。,class Triangle float width,height; Triangle() width=60; height=100; Triangle(float x,int y) width=x; height=y; ,4.1.5 構(gòu)造方法,4.2 static 關(guān)鍵字,用static修飾的成員變量稱為類變量(靜態(tài)成員變量)。 用static修飾的方法稱為類方法(靜態(tài)方法)。 用static修飾的語句塊稱為靜態(tài)初始化語句塊。,4.2.1 類變量,在該類所有實例
6、之間是共享的。在加載該類時,只分配一次空間,并初始化。 加載類的可能情況: (1)創(chuàng)建類的對象。 (2)調(diào)用類變量或者類方法。 (3)調(diào)用Class.forName()方法 調(diào)用方式: (1)對象調(diào)用 (2)類名調(diào)用,4.2.2 類方法,調(diào)用方式: (1)對象調(diào)用 (2)類名調(diào)用 注意: (1) 類方法不能直接訪問所屬類的非靜態(tài)變量和方法。 (2) 子類不能重寫父類的靜態(tài)方法,但可以通過定義與父類相同的方法,從而隱藏父類中的靜態(tài)方法。 (3) 子類不能把父類的非靜態(tài)方法重寫為靜態(tài)方法。,4.2.3 靜態(tài)初始化語句塊,靜態(tài)初始化語句塊:沒有存在于任何方法體中的被static修飾的語句塊。在加載該
7、類時執(zhí)行且只執(zhí)行一次。 其格式為: static 語句 ,例子1,class Triangle static float width = 1,height = 1; static double area () return width * height * 0.5; static System.out.println(第一次加載 + Triangle的顯示信息。 + width + height); ,public class Example4_1 public static void main(String args) System.out.println(Triangle.area();
8、Triangle tri = new Triangle(); tri.width = 1; tri.height = 2; System.out.println(tri.area(); Triangle.width = 2; Triangle.height = 3; System.out.println(tri.area(); ,4.3 對象,類是創(chuàng)建對象的模板。當(dāng)使用一個類創(chuàng)建了一個對象時,我們也說我們給出了這個類的一個實例。,4.3.1 創(chuàng)建對象,創(chuàng)建一個完整的對象包括對象的聲明和為對象分配內(nèi)存兩個步驟。 (1)對象的聲明。 一般格式為: 類的名字 對象名字; 如: Triangle tr
9、i;,(2)為聲明的對象分配內(nèi)存 使用new運算符和類的構(gòu)造方法為聲明的對象分配內(nèi)存,如果類中沒有構(gòu)造方法,系統(tǒng)會調(diào)用默認(rèn)的構(gòu)造方法(默認(rèn)的構(gòu)造方法是無參數(shù)的,一定記得構(gòu)造方法的名字必須和類名相同這一規(guī)定)。如: tri = new Triangle();,4.3.1 創(chuàng)建對象(續(xù)),(3)對象實例化過程 1) 開辟內(nèi)存空間(變量、方法體代碼)及類成員變 量的初始化: 數(shù)值型:0; 布爾型:false; 字符型: u0000; 引用型:null; 字符串型:null; 2) 顯式初始化:順序執(zhí)行類成員變量聲明時帶有的簡 單賦值表達(dá)式。 3) 執(zhí)行構(gòu)造方法。 4) 返回對象的引用。,4.3.1
10、創(chuàng)建對象(續(xù)),4.3.2 Java虛擬機運行時數(shù)據(jù)區(qū),Java虛擬機中最重要的數(shù)據(jù)區(qū)分別是堆區(qū)和棧區(qū)、方法區(qū)。 堆區(qū): 主要存放實際的對象。 棧區(qū): 主要用來存放對象的引用,一些局部變量,參數(shù),中間結(jié)果值,返回值等。 方法區(qū):主要存放類的相關(guān)信息,如類的信息(名字、類型和修飾符)、類變量(靜態(tài)變量)的信息(數(shù)據(jù)類型、名字和修飾符)、方法的信息(名字、參數(shù)的個數(shù)和類型、返回值和修飾符)。,4.3.2 Java虛擬機運行時數(shù)據(jù)區(qū)(續(xù)),運行 Java Example4_1 的步驟: (1)啟動虛擬機進程,從classpath中找到Example4_1.class文件,讀取該文件中的二進制數(shù)據(jù),把
11、Example4_1類的類型信息存放到虛擬機進程的方法區(qū)中,這成為類的加載。 (2) 對Example4_1類進行驗證及初始化。 (3) 找到該類的main()方法的字節(jié)碼,執(zhí)行其指令。 (4) 執(zhí)行結(jié)束后,虛擬機進程關(guān)閉。,4.3.2 Java虛擬機運行時數(shù)據(jù)區(qū)(續(xù)),運行 main()方法中的第一條代碼System.out.println(Triangle.area(); 的步驟: (1) 搜索方法區(qū),查找Triangle類的類型信息,未查找到該類的信息,故而加載Trangle類的信息到方法區(qū)。 (2) 驗證并初始化Triangle類。其中初始化該類時,對類變量width和height初始
12、化為0,并執(zhí)行靜態(tài)初始化語句。,4.3.2 Java虛擬機運行時數(shù)據(jù)區(qū),運行 main()方法中的第二條代碼 Triangle tri = new Triangle(); 的步驟: (1) 搜索方法區(qū),查找Triangle類的類型信息,查找到該類的信息,故而不加載Trangle類的信息到方法區(qū)。 (2) 在堆區(qū)為一個新的Triangle類的實例分配內(nèi)存,該實例持有指向方法區(qū)的Triangle類的引用。 (3) tri變量在main()方法中定義,為局部變量,被添加到main()方法的棧中,該變量持有新創(chuàng)建的Triangle類的實例的引用。,4.3.2 Java虛擬機運行時數(shù)據(jù)區(qū),4.3.3 參
13、數(shù)傳值,在Java中,方法的所有參數(shù)都是“傳值”的。 對于基本數(shù)據(jù)類型的參數(shù),向該參數(shù)傳遞的值的精度不可以高于該參數(shù)的精度。比如,不可以向int型參數(shù)傳遞一個float值,但可以向double型參數(shù)傳遞一個float值。 當(dāng)參數(shù)是引用類型時,“傳值”傳遞的是變量的引用而不是變量所引用的對象。,例子2,class Triangle float width,height; double area () return width * height * 0.5; public class Example4_2 static int val = 11; static Triangle tri = new
14、 Triangle(); public void changeInt(int value)value = 55; public void changeTriangle1(Triangle triangle) triangle.height = 1; triangle.width = 2; ,public void changeTriangle2(Triangle triangle) triangle = new Triangle(); triangle.height = 2; triangle.width = 1; public static void main(String args ) E
15、xample4_2 pt = new Example4_2(); pt.changeInt(val); pt.changeTriangle1(tri); pt.changeTriangle2(tri); ,4.4 this 關(guān)鍵字,this是Java的一個關(guān)鍵字,是所在類的某個對象的引用。 this可以出現(xiàn)在實例方法中,但不可以出現(xiàn)在類方法中。 this關(guān)鍵字出現(xiàn)在類的構(gòu)造方法中時,代表使用該構(gòu)造方法所創(chuàng)建的對象。 this關(guān)鍵字出現(xiàn)在類的實例方法中時,代表正在調(diào)用該方法的當(dāng)前對象。,class Triangle float width,height; Triangle() this(60,8
16、0); Triangle(float x,int y) width=x; height=y; ,/必須為第一行代碼,4.4.1 this 用法:調(diào)用構(gòu)造方法,class Triangle float width,height; Triangle() this(60,80); Triangle(float width,int height) this.width=width; this.height=height; ,如果某一方法中的局部變量與成員變量同名,this修飾的變量為成員變量,沒有this修飾的為局部變量。,4.4.2 this 用法:區(qū)別成員變量和局部變量,4.5 變量作用域,變量的
17、作用域是指它存在的范圍,只有在這個范圍內(nèi),程序代碼才能訪問它。其次,作用域決定了變量的生命周期。 變量的生命周期是指一個變量被創(chuàng)建并分配內(nèi)存空間開始,到這個變量被銷毀并清除其所占用的內(nèi)存空間的過程。當(dāng)一個變量被定義時,它的作用域就被確定了。 根據(jù)作用域的不同,變量可分為以下類型。,4.5 變量作用域(續(xù)),成員變量: 在類中聲明,它的作用域是整個類。 局部變量: 在一個方法的內(nèi)部或方法的一個代碼塊的內(nèi)部聲明。如果在一個方法內(nèi)部聲明,它的作用域是整個方法。如果是在一個方法的某個代碼塊的內(nèi)部聲明,則作用域是這個代碼塊。 方法參數(shù): 方法的形參,它的作用域是整個方法。 異常處理參數(shù): catch(E
18、xception e)語句中的參數(shù)e,它的作用域是緊跟著catch(Exception e)語句后的代碼塊。,4.5 變量作用域(續(xù)),class Smaple int var1 = 0; void method1(int var2) int var3 = 0; if (var3=0) int var4 = 0; var1+; var2+; var1+; var2+; var3+; var4+; ,void method2() var1+; var2+; var3+; var4+; ,4.5 變量作用域(續(xù)),將局部變量的作用域最小化 假設(shè)在一下method()方法中有一個局部變量var,盡管
19、僅僅在一個if代碼塊中才用到它,但是這個變量在method()方法的開頭就定了。 void method() int var = 0; if () /使用var變量 ,4.5 變量作用域(續(xù)),如果method()方法的代碼冗長,過早的定義var變量,會造成一下負(fù)面影響: (1) 程序的可讀性差和可維護性差。 (2) 增加出錯的可能性。 將局部變量的作用域最小化,應(yīng)該遵循如下規(guī)則: (1) 在需要使用某局部變量的時候,才定義它。 (2) 使方法小而集中。如果一個方法包含多種操作,盡可能把這個方法分解為多個小方法,每個小方法負(fù)責(zé)一項操作。方法小了,局部變量的作用域自然也就變小了。,4.6 包,包
20、(package)是相關(guān)類與接口的一個集合,它提供訪問控制與命名空間管理。 Java平臺中的類與接口都是根據(jù)功能以包組織的。 包機制的好處: 程序員容易確定包中的類是相關(guān)的,并且容易根據(jù)所需的功能找到相應(yīng)的類。 每個包都創(chuàng)建一個新的命名空間,因此不同包中的類名不會沖突。 同一個包中的類之間有比較寬松的訪問控制。,4.6.1 創(chuàng)建包,通過關(guān)鍵字package聲明包語句。package 語句作為Java源文件的第一條語句,指明該源文件定義的類所在的包。package語句的一般格式為: package 包名; 如果源程序中省略了package語句,源文件中你定義命名的類被隱含地認(rèn)為是無名包的一部分,
21、即源文件中定義命名的類在同一個包中,但該包沒有名字。 包名可以是一個合法的標(biāo)識符,也可以是若干個標(biāo)識符加“.”分割而成 。,4.6.2 包名與包中類的存儲位置,包分隔符相當(dāng)于目錄分隔符,包存儲的路徑由包根路徑加上包名指明的路徑組成。 包的根路徑由CLASSPATH環(huán)境變量指出。 %CLASSPATH%包名 類名.class,4.6.3 import 語句,使用import 語句可以引入包中的類。其格式為: import 包名.*; import 包名. 類名;,4.6.4 Java自動引入的包,當(dāng)前包。 java.lang包。,例子 3,/ Triangle.java package Shap
22、e.Pology; public class Triangle float width,height; public double area() return width * height* 0.5; public Triangle(float w,float h) width = w; height = h; ,/ Circle.java package Shape.Pology; public class Circle float r; public double area() return r * r * 3.14159; public Circle(float r) this.r =
23、r; ,/Rectangle.java package Shape.Pology; public class Rectangle float width = 1,height = 1; public double area() return width * height; public Rectangle(float w,float h) width = w; height = h; ,/ Example4_3.java import Shape.Pology.*; public class Example4_3 public static void main(String args) Tri
24、angle tri = new Triangle(1,1); System.out.println(tri.area(); Circle cir = new Circle(1); System.out.println(cir.area(); Rectangle rec = new Rectangle(1,1); System.out.println(rec.area(); ,4.7訪問權(quán)限,訪問限制修飾符有private、protected和public,都是Java的關(guān)鍵字,用來修飾成員變量或方法。 訪問控制應(yīng)用于class層次,而不是對象層次。,4.7.1 私有變量和私有方法,privat
25、e修飾的成員變量和方法稱為私有變量和私有方法。私有變量和私有方法只能被當(dāng)前類訪問。,4.7.1 私有變量和私有方法(續(xù)),class Alpha private int iamprivate; private void privateMethod() System.out.println(privateMethod); class Beta void accessMethod() Alpha a = new Alpha(); a.iamprivate = 10; a.privateMethod(); ,4.7.1 私有變量和私有方法(續(xù)),class Alpha private int iam
26、private; private void privateMethod() System.out.println(privateMethod); void accessMethod() Alpha a = new Alpha(); a.iamprivate = 10; a.privateMethod(); ,4.7.2 公有變量和公有方法,public修飾的成員變量和方法稱為公有變量和公有方法。公有變量和公有方法可以被所有類訪問。,4.7.2 公有變量和公有方法(續(xù)),class Alpha public int iampublic; public void publicMethod() Sy
27、stem.out.println(privateMethod); class Beta void accessMethod() Alpha a = new Alpha(); a. iampublic = 10; a. publicMethod(); ,4.7.3 包變量和包方法,不用private、public 、protected修飾符的成員變量和方法被稱為友好變量和友好方法。友好變量和友好方法可以被所在包中其他的類訪問。,4.7.3 包變量和包方法(續(xù)),class Alpha int iampackage; void packageMethod() System.out.println(
28、privateMethod); class Beta void accessMethod() Alpha a = new Alpha(); a. iampackage = 10; a. packageMethod(); ,4.7.4 保護變量和方法,protected修飾的成員變量和方法稱為保護變量和保護。保護變量和保護方法可以被類本身、它的子類、以及同一個包中其余的類訪問。,4.7.4 保護變量和保護方法(續(xù)),class Alpha protected int iamprotected; protected void protectedMethod() System.out.println
29、(privateMethod); class Beta void accessMethod() Alpha a = new Alpha(); a. iamprotected = 10; a. protectedMethod(); ,4.7.5 public類和友好類,public類:public關(guān)鍵字修飾的類,可以再任何其他類中,創(chuàng)建public類的對象。 友好類:沒有public關(guān)鍵字修飾的類,可以再同一個包的其他類中,創(chuàng)建友好類的對象。,4.8 類的繼承,繼承是一種由已有的類創(chuàng)建新類的機制。 利用繼承,我們可以先創(chuàng)建一個共有屬性的一般類,根據(jù)該一般類再創(chuàng)建具有特殊屬性的新類,新類繼承一般類
30、的狀態(tài)和行為,并根據(jù)需要增加它自己的新的狀態(tài)和行為。 由繼承而得到的類稱為子類,被繼承的類稱為父類(超類)。Java不支持多重繼承(子類只能有一個父類)。,4.8.1 子類,在類的聲明中,通過使用關(guān)鍵字extends來創(chuàng)建一個類的子類,格式如下: class 子類名 extends 父類名 例如: class Students extends People 如果省略了extends關(guān)鍵字,則所定義的類為java.lang.Object的子類。,4.8.2 子類的繼承性,類有可以有兩種重要的成員:成員變量和方法。子類的成員中有一部分是子類自己聲明定義的,另一部分是從它的父類繼承的。 所謂子類繼承
31、父類的成員變量作為自己的一個成員變量,就好象它們是在子類中直接聲明一樣,可以被子類中自己聲明的任何實例方法操作。 所謂子類繼承父類的方法作為子類中的一個方法,就象它們是在子類中直接聲明一樣,可以被子類中自己聲明的任何實例方法調(diào)用。,4.8.3 成員變量的隱藏和方法的重寫,子類隱藏父類的成員變量。子類中定義的成員變量和父類中的成員變量同名時,子類就隱藏了繼承的成員變量。 子類通過方法的重寫可以隱藏繼承的方法 ,方法重寫是指:子類中定義一個方法,該方法的名字、返回類型、參數(shù)個數(shù)均與父類的方法完全相同,并且子類的方法不能縮小訪問權(quán)限,不能拋出新的異常。 對于子類創(chuàng)建的一個對象,如果子類重寫了父類的方
32、法,則運行時系統(tǒng)調(diào)用子類重寫的方法,如果子類未重寫父類的方法, 那么子類調(diào)用父類的方法。,4.8.4 final關(guān)鍵字,final關(guān)鍵字可以修飾類、成員變量、方法和方法的參數(shù)。 final類不能被繼承,即不能有子類。 如果一個成員變量被修飾為final的,就是常量,常量必須賦給初值,而且不能再發(fā)生變化。 如果一個方法被修飾為final方法,則這個方法不能被重寫。 如果方法的參數(shù)被修飾為final的,該參數(shù)的值不能被改變。,4.8.5 super關(guān)鍵字,super表示該關(guān)鍵字所在類的父類的對象的引用。 子類不繼承父類的構(gòu)造方法,因此,子類如果想使用父類的構(gòu)造方法,必須在子類的構(gòu)造方法中使用,并且
33、必須使用關(guān)鍵字super來表示,而且super必須是子類構(gòu)造方法中的頭一條語句。 如果我們在子類中想使用被子類隱藏了的父類的成員變量或方法就可以使用關(guān)鍵字super。比如:super.x、super.play(),就是被子類隱藏的父類的成員變量x和方法play()。,4.8.6 再論對象實例化過程,對象初始化時,分四步: (1) 分配空間,并初始化實例變量為0。 (2) 按繼承關(guān)系,自頂向下顯式初始化成員變量。 (3) 按繼承關(guān)系,自頂向下執(zhí)行構(gòu)造方法。 (4) 返回對象的引用。 說明:當(dāng)前類的各級父類直到類體系的根類(Object類),按照繼承關(guān)系,自頂向下依次循環(huán)執(zhí)行上述第(2)、(3)步
34、驟,直到當(dāng)前類構(gòu)造方法執(zhí)行結(jié)束。,class Object public Object() class Point private int x = 2; private int y = 2; public Point(int x,int y) this.x = x; this.y = y; ,class Triangle extends Point private int width = 1; private int height = 1; public Triangle (int x,int y,int width,int height) super(x,y); this.width = w
35、idth; this.height = height; 語句:Triangle tri = new Triangle(1,1,2,3);,4.9 向上轉(zhuǎn)型(Upcast),假設(shè)Dog、Cat類是Animal類子類或間接子類,當(dāng)我們用子類Dog(或Cat)創(chuàng)建一個對象,并把這個對象的引用賦給Animal類的變量,如 Animal a1 = new Dog(); Animal a2 = new Cat(); 則稱該過程為向上轉(zhuǎn)型。 Dog dog = (Dog) a1; Cat cat = (Cat) a2; 則稱該過程向下轉(zhuǎn)型。,4.10 多態(tài)性,多態(tài)性就是指父類的某個方法被其子類重寫時,可以各
36、自產(chǎn)生自己的功能行為。,例子 4,class Shape public double area()return 0.0; class Triangle extends Shape float width,height; public double area() return width * height* 0.5; public Triangle(float w,float h) width = w; height = h; ,class Circle extends Shape float r; public double area() return r * r * 3.14159; pub
37、lic Circle(float r) this.r = r; ,class Rectangle extends Shape float width = 1,height = 1; public double area() return width * height; public Rectangle(float w,float h) width = w; height = h; ,public class Example4_4 static double getArea(Shape s) return s.area(); public static void main(String args
38、) Shape shape = new Shape3; shape0 = new Triangle(1,1); shape1 = new Circle(1); shape2 = new Rectangle(1,1); for(int i=0;i3;i+) System.out.println(getArea(shapei); ,4.11 abstract 類和abstract方法,用關(guān)鍵字abstract修飾的類稱為abstract類(抽象類)。 abstract class A ,和普通的類相比,abstract類可以有abstract方法。 abstract方法是只有聲明沒有實現(xiàn)的方法,而
39、且不允許使用final修飾abstract方法。 abstract class A abstract int min(int x,int y); int max(int x,int y) return xy?x:y; ,4.11 abstract 類和abstract方法(續(xù)),abstract類不能用new運算創(chuàng)建對象。 對于abstract類,我們不能使用new運算符創(chuàng)建該類的對象,需產(chǎn)生其子類,由子類創(chuàng)建對象。 一個abstract類只關(guān)心它的子類是否具有某種功能,并不關(guān)心功能的具體行為,功能的具體行為由子類負(fù)責(zé)實現(xiàn),抽象類中的抽象方法可以強制子類必須給出這些方法的具體實現(xiàn)。,4.11
40、abstract 類和abstract方法(續(xù)),例子 5,abstract class Shape public abstract double area(); class Triangle extends Shape float width,height; public double area() return width * height* 0.5; public Triangle(float w,float h) width = w; height = h; ,class Circle extends Shape float r; public double area() return
41、 r * r * 3.14159; public Circle(float r) this.r = r; ,class Rectangle extends Shape float width = 1,height = 1; public double area() return width * height; public Rectangle(float w,float h) width = w; height = h; ,public class Example4_5 static double getArea(Shape s) return s.area(); public static
42、void main(String args) Shape shape = new Shape3; shape0 = new Triangle(1,1); shape1 = new Circle(1); shape2 = new Rectangle(1,1); for(int i=0;i3;i+) System.out.println(getArea(shapei); ,例子6,abstract class A abstract int min(int x,int y); int max(int x,int y) return xy?x:y; class B extends A int min(
43、int x,int y) return xy?x:y; ,public class Example4_6 public static void main(String args) A a; B b=new B(); int max=b.max(12,34); int min=b.min(12,34); System.out.println(max=+max+ min=+min); a=b; max=a.max(12,34); System.out.println(max=+max); ,4.12 接口,Java不支持多繼承性,為了完成多繼承的功能,Java使用了接口,一個類可以實現(xiàn)多個接口。
44、Interface 是在抽象類概念的基礎(chǔ)上演變而來的。 一個interface所有方法都是抽象的(默認(rèn)具有public和abstract屬性),并且只能定義 static、 final、public 成員變量(默認(rèn)是public和final)。,4.12.1 接口的定義,使用關(guān)鍵字interface來定義一個接口。接口的定義和類的定義很相似,分為接口的聲明和接口體。 接口體中包含常量定義和方法聲明兩部分。interface Printable final int MAX=100; void add(); float sum(float x ,float y); ,4.12.2 接口的實現(xiàn),一個
45、類通過使用關(guān)鍵字implements 聲明自己實現(xiàn)一個或多個接口。如果實現(xiàn)多個接口,接口與接口之間用逗號分隔。如: class A implements Printable,Addable 一般情況下,如果一個類實現(xiàn)了某個接口,則需實現(xiàn)該接口的所有方法,即為接口中的抽象方法提供方法體,給出其定義 . 如果實現(xiàn)該接口的類沒有全部給出該接口中所聲明的方法的定義,則該類只能是抽象類。,例子 7,interface Computable int MAX = 100; int f(int x); class Japan implements Computable int number; public i
46、nt f(int x) return 44 + x; ,class China implements Computable int number; public int f(int x) / 不要忘記public關(guān)鍵字 int sum = 0; for (int i = 1; i = x; i+) sum = sum + i; return sum; ,public class Example4_7 public static void main(String args) China zhangsan = new China(); Japan lisi = new Japan(); zhang
47、san.number = 991898 + Computable.MAX; lisi.number = 941448 + Computable.MAX; System.out.println(number: + zhangsan.number + 求和 + zhangsan.f(100); System.out.println(number: + lisi.number + 求和 + lisi.f(100); ,4.12.3 理解接口,interface 不屬于類層次結(jié)構(gòu)。 接口定義了一組功能(行為)的協(xié)議。接口只關(guān)心功能,并不關(guān)心功能的具體實現(xiàn),接口中也沒有功能的實現(xiàn)。 接口的思想在于它可以
48、增加很多類都需要實現(xiàn)的功能,使用相同的接口類不一定有繼承關(guān)系。 同一個類也可以實現(xiàn)多個接口。,4.12.4 接口回調(diào),接口回調(diào)是指:可以把實現(xiàn)某一接口的類創(chuàng)建的對象的引用賦給該接口聲明的接口變量中。那么該接口變量就可以調(diào)用被類實現(xiàn)的接口中的方法。實際上,當(dāng)接口變量調(diào)用被類實現(xiàn)的接口中的方法時,就是通知相應(yīng)的對象調(diào)用接口的方法。 一個方法的參數(shù)是接口類型,就可以將任何實現(xiàn)該接口的類的實例的引用傳遞給該接口參數(shù),接口參數(shù)就可以回調(diào)類實現(xiàn)的接口方法。,例子 8,interface Shape double area(); class Triangle implements Shape float w
49、idth,height; public double area() return width * height* 0.5; public Triangle(float w,float h) width = w; height = h; ,class Circle implements Shape float r; public double area() return r * r * 3.14159; public Circle(float r) this.r = r; ,class Rectangle implements Shape float width = 1,height = 1;
50、public double area() return width * height; public Rectangle(float w,float h) width = w; height = h; ,public class Example4_8 static double getArea(Shape s) return s.area(); public static void main(String args) Shape shape = new Shape3; shape0 = new Triangle(1,1); shape1 = new Circle(1); shape2 = ne
51、w Rectangle(1,1); for(int i=0;i3;i+) System.out.println(getArea(shapei); ,4.13 內(nèi)部類,Java支持在一個類中聲明另一個類,這樣的類稱作內(nèi)部類,而包含內(nèi)部類的類稱為外部類的外嵌類。 內(nèi)部類的類體中不可以聲明類變量和類方法。外部類的類體中可以用內(nèi)部類聲明對象,作為外部類的成員。,class Outer private int size; class Inner int innerSize; public class TestInner public static void main(String args) Outer
52、 out=new Outer(); Outer.Inner in= out. new Inner(); ,4.14 匿名類,和類有關(guān)的匿名類 當(dāng)使用類創(chuàng)建對象時,程序允許我們把類體與對象的創(chuàng)建組合在一起,此類體被認(rèn)為是該類的一個子類去掉類聲明后的類體,稱作匿名類。如: new People() ,4.14 匿名類,和接口有關(guān)的匿名類 Java允許直接用接口名和一個類體創(chuàng)建一個匿名對象,此類體被認(rèn)為是實現(xiàn)了接口的類去掉類聲明后的類體,稱作匿名類。 new Computable() ,4.14 匿名類,匿名類一定是內(nèi)部類,因此可以訪問外部類的成員變量和方法。 匿名類中不能聲明類變量和類方法。 匿名
53、類可以重寫父類(定義接口)的方法或者隱藏父類的成員變量。,例子9,class Cubic double getCubic(int n) return 0; abstract class Sqrt public abstract double getSqrt(int x); class A void f(Cubic cubic) double result=cubic.getCubic(3); System.out.println(result); ,public class Example4_9 public static void main(String args) A a=new A();
54、 a.f(new Cubic() double getCubic(int n) return n*n*n; ); Sqrt ss=new Sqrt () public double getSqrt(int x) return Math.sqrt(x); ; double m=ss.getSqrt(4); System.out.println(m); ,例子10,interface Cubic double getCubic(int n); interface Sqrt double getSqrt(int x); class A void f(Cubic cubic) double resul
55、t=cubic.getCubic(3); System.out.println(result); ,public class Example4_10 public static void main(String args) A a=new A(); a.f(new Cubic() public double getCubic(int n) return n*n*n; ); Sqrt ss=new Sqrt () public double getSqrt(int x) return Math.sqrt(x); ; double m=ss.getSqrt(4); System.out.print
56、ln(m); ,4.15 異常,異常(Exception) 是在程序運行時打斷正常程序流程的 不正常的情況。比如: 試圖打開的文件不存在 網(wǎng)絡(luò)鏈接中斷 操作符越界 要加載類文件不存在,Java中定義了各種異常。Java.lang.Throwable 是這些類的父類。,Throwable,Error,Exception,VirtualMachineError ,AWTError,RuntimeException,IOException,EOFException ,FileNotFoundException,ArithmeticException,NullPointerException ,Ind
57、exOutOfBoundsException,4.15.1 Java中定義的異常,String getMessage():用于獲取異常的詳細(xì)信息。 void printStackTrace():打印異常調(diào)用棧軌跡。,4.15.2 異常類的常用方法,4.15.3 捕獲處理異常,try 可能會出現(xiàn)異常的代碼段 catch(異常類 參數(shù)) 異常處理代碼 finally 語句 try語句后必須跟隨至少一個catch或finally語句塊。 try語句塊中的某個語句發(fā)生異常后,try語句塊將立刻結(jié)束執(zhí)行,而轉(zhuǎn)向執(zhí)行相應(yīng)的catch語句塊。,4.15.3 捕獲處理異常,catch語句可以有多個,一條catch語句處理一條拋出的特定類型的異常。 catch捕獲異常是按順序的,如果前一個異常類型被捕獲,后面的異常類型不再捕獲。因此,一般先用catch捕獲細(xì)化的異常類,在用catch捕獲其父類異常。 catch捕獲到異常后,異常的引用被傳給catch語句中指定的參數(shù)。 finally語句放于try語句或catch語句后面,主要作一些清理工作,該語句塊無論有無異常發(fā)生都要執(zhí)行。,例子11,public class Example4_11 public static void main(String args) int n
溫馨提示
- 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)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 2026年個人理財顧問專業(yè)測試財務(wù)規(guī)劃與投資組合配置題
- 網(wǎng)絡(luò)安全漏洞掃描技術(shù)詳解
- 2026年加拿大交通規(guī)則知識考試題庫及答案
- CCAA - 管理體系認(rèn)證基礎(chǔ)摸底考試三答案及解析 - 詳解版(48題)
- 雨課堂學(xué)堂在線學(xué)堂云《動物遺傳原理與育種方法(揚州)》單元測試考核答案
- 2025年貴州財經(jīng)職業(yè)學(xué)院馬克思主義基本原理概論期末考試模擬題及答案解析(必刷)
- 2025年云南水利水電職業(yè)學(xué)院馬克思主義基本原理概論期末考試模擬題附答案解析(奪冠)
- 2025年洛陽文化旅游職業(yè)學(xué)院馬克思主義基本原理概論期末考試模擬題帶答案解析(必刷)
- 2024年紅原縣幼兒園教師招教考試備考題庫帶答案解析
- 2025年哈爾濱劍橋?qū)W院馬克思主義基本原理概論期末考試模擬題帶答案解析(奪冠)
- 白內(nèi)障疾病教學(xué)案例分析
- 2026中國電信四川公用信息產(chǎn)業(yè)有限責(zé)任公司社會成熟人才招聘備考題庫完整參考答案詳解
- 2026年黃委會事業(yè)單位考試真題
- 供水管網(wǎng)及配套設(shè)施改造工程可行性研究報告
- 2026年及未來5年中國高帶寬存儲器(HBM)行業(yè)市場調(diào)查研究及投資前景展望報告
- 英語試卷浙江杭州市學(xué)軍中學(xué)2026年1月首考適應(yīng)性考試(12.29-12.30)
- 生產(chǎn)車間停線制度
- 關(guān)于生產(chǎn)部管理制度
- CMA質(zhì)量手冊(2025版)-符合27025、評審準(zhǔn)則
- (一模)2026年沈陽市高三年級教學(xué)質(zhì)量監(jiān)測(一)生物試卷(含答案)
- 2025年和田地區(qū)公務(wù)員錄用考試《公安專業(yè)科目》真題
評論
0/150
提交評論