Java課程講義(No.8)_2009.ppt_第1頁
Java課程講義(No.8)_2009.ppt_第2頁
Java課程講義(No.8)_2009.ppt_第3頁
Java課程講義(No.8)_2009.ppt_第4頁
Java課程講義(No.8)_2009.ppt_第5頁
已閱讀5頁,還剩50頁未讀 繼續(xù)免費(fèi)閱讀

下載本文檔

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

文檔簡介

1、Java面向?qū)ο蟪绦蛟O(shè)計(jì),主講教師:鄭大慶 上海財(cái)經(jīng)大學(xué) 信息管理與工程學(xué)院,第八講 Java高級特征,2,上海財(cái)經(jīng)大學(xué) 信息管理與工程學(xué)院,靜態(tài)變量、方法與初始化程序塊 final 關(guān)鍵字 抽象類 接口Interface package 訪問控制 內(nèi)部類 其它,Java 高級語言特征,3,上海財(cái)經(jīng)大學(xué) 信息管理與工程學(xué)院,static 關(guān)鍵字,用static關(guān)鍵字修飾的成員,叫類成員(靜態(tài)成員)。 類(靜態(tài))變量 實(shí)例變量 類(靜態(tài))方法 實(shí)例方法,4,上海財(cái)經(jīng)大學(xué) 信息管理與工程學(xué)院,類變量(靜態(tài)變量),類變量為類的各實(shí)例共享的變量。 static 靜態(tài)變量名 ; 位于類的內(nèi)存區(qū)域中,被該

2、類的各個(gè)對象共享.在加載該類時(shí),只分配一次空間,并初始化。 無此限定符的變量是實(shí)例變量。 class A int i ; static int j ; static final int k=10 ; - 為節(jié)省空間, final 常量可同時(shí) 定義為static,類A j k=10,對象1 i= 3,對象2 i= 5,5,上海財(cái)經(jīng)大學(xué) 信息管理與工程學(xué)院,類變量(靜態(tài)變量),可實(shí)現(xiàn)各實(shí)例之間的通訊。 例如:跟蹤創(chuàng)建的實(shí)例數(shù) public class Count private int serial ; /實(shí)例變量 private static int counter = 0 ; /類變量 pub

3、lic Count() /構(gòu)造方法 counter+; serial = counter ; 靜態(tài)變量類似于某些語言中的全局變量。,6,上海財(cái)經(jīng)大學(xué) 信息管理與工程學(xué)院,類變量(靜態(tài)變量),非private 的靜態(tài)變量無須創(chuàng)建實(shí)例就可以從類的外部訪問。 public class MyClass public static int x ; class test public void m() int m = MyClass.x ; /通過類名直接訪問 ,7,上海財(cái)經(jīng)大學(xué) 信息管理與工程學(xué)院,類方法( 靜態(tài)方法),類方法: static 方法名() 使用類方法不用創(chuàng)建類的對象。調(diào)用這個(gè)方法時(shí),可使

4、用類名做前綴。 public class MyClass public static int addUp(int x, int y) return x+y ; public class UseIt public void method() int c = MyClass.addUp(9,10); ,8,上海財(cái)經(jīng)大學(xué) 信息管理與工程學(xué)院,類方法( 靜態(tài)方法),類方法中不能訪問實(shí)例變量,而只能訪問類變量、方法參數(shù)和局部變量。 類方法中不能直接使用本類中的實(shí)例方法,只能訪問其他的static方法。 類方法中不能訪問this引用。 注意:非static的方法是實(shí)例方法(或稱對象方法),9,上海財(cái)經(jīng)大學(xué)

5、 信息管理與工程學(xué)院,main方法:一種常見的類方法,作為主程序的入口。 main方法是靜態(tài)方法:這是為了使系統(tǒng)在沒有任何實(shí)例化對象之前可以運(yùn)行一個(gè)應(yīng)用程序。 如果main方法要調(diào)用本類的其它方法: 將這些方法設(shè)計(jì)成靜態(tài)方法; 創(chuàng)建對象,通過對象來使用實(shí)例方法。,10,上海財(cái)經(jīng)大學(xué) 信息管理與工程學(xué)院,類方法( 靜態(tài)方法),public class A public static void main(String args) System.out.println(Math.round(3.54); String s = to_string(2.718); / 調(diào)用本類的其它static方法 S

6、ystem.out.println(“e=” + s ); static String to_string(double x) return Double.toString(x); ,11,上海財(cái)經(jīng)大學(xué) 信息管理與工程學(xué)院,main方法的參數(shù),程序案例 public class MainInput public static void main(String args) int a=Integer.parseInt(args0); /將字符串轉(zhuǎn)換為整數(shù) int b=Integer.parseInt(args1); int c=a+b; System.out.println(The result

7、 is: + c); ,字符串?dāng)?shù)組型的參數(shù),來自用戶的輸入,java MainInput 1 2 ,運(yùn)行時(shí):,args0,args1,The result is 3,12,上海財(cái)經(jīng)大學(xué) 信息管理與工程學(xué)院,靜態(tài)初始化程序,由關(guān)鍵字static引導(dǎo)的一對大括號括起的語句組。用來完成類的初始化工作; 不存在于任何方法體中的靜態(tài)語句塊。在加載該類時(shí)執(zhí)行,且只執(zhí)行一次。 class StaticInitDemo static int i=5; static System.out.println(“Static code: i=”+ i+); public class Test public stati

8、c void main(String args) System.out.println(“ Main code: i=”+ StaticInitDemo.i); ,Static code: i=5 Main code: i=6,運(yùn)行結(jié)果:,13,上海財(cái)經(jīng)大學(xué) 信息管理與工程學(xué)院,被定義成final的類不能有子類。 例: final class Employee class Manager extends Employee 被定義成final 的成員方法不能被重寫。 被定義成final的成員變量不能改變。該變量實(shí)際上 是常量,一般大寫,并賦值。 final int NUMBER = 100;,F

9、inal 關(guān)鍵字,14,上海財(cái)經(jīng)大學(xué) 信息管理與工程學(xué)院,一個(gè)方法如果只聲明方法而沒有方法的實(shí)現(xiàn)(方法體),則稱為抽象方法。 抽象類必須在類聲明中增加 abstract 關(guān)鍵字,在無方法體的方法(抽象方法)前也要加上abstract。 Public abstract class Drawing /抽象類 public abstract void drawDot( int x, int y);/抽象方法 public void drawLine(int x1, int y1, int x2, int y2) /非抽象方法 ,抽象類,一個(gè)abstract 類可以包含有非抽象方法和變量,但至少包含一

10、個(gè)抽象方法。,15,上海財(cái)經(jīng)大學(xué) 信息管理與工程學(xué)院,抽象類不能直接用來生成實(shí)例。一般通過定義子類進(jìn)行實(shí)例化。 可以生成抽象類的變量,該變量可以指向一個(gè)子類的實(shí)例。,abstract class Employee abstract void raiseSalary(int i) ; class Manager extends Employee /抽象類的子類 void raiseSalary(int i ) ./實(shí)現(xiàn)抽象方法 ,Employee e = new Manager( ) ;/指向子類實(shí)例,抽象類,16,上海財(cái)經(jīng)大學(xué) 信息管理與工程學(xué)院,interface 是在抽象類概念的基礎(chǔ)上演變

11、而來的。 一個(gè)interface所有成員方法都是抽象的,并且只能 定義 static final 成員變量(常量)。,接口 interface,17,上海財(cái)經(jīng)大學(xué) 信息管理與工程學(xué)院,接口的含義,interface 不屬于類層次結(jié)構(gòu)。不相關(guān)的類可以實(shí)現(xiàn)相同的接口。 接口:可看作一種“特殊的類”,是作為一個(gè)整體聲明的抽象方法和常量的集合; 方法:隱含為abstract 和public的 常量:隱含為final和static的 創(chuàng)建接口 public interface 接口名 extends 接口列表 方法名(); /注意:沒有方法體 常 量 名=. . . ; . . . . . .,18,上

12、海財(cái)經(jīng)大學(xué) 信息管理與工程學(xué)院,Interface Flyer takeOff( ) land( ) fly( ),Class Airplane brake( ) takeOff( ) land( ) fly( ),Class Bird eat( ) layEggs( ) takeOff( ) land( ) fly( ),Class Superman eat( ) stopBullet( ) takeOff( ) land( ) fly( ),interface 示例:接口與繼承,Class Animal eat( ),Class Vehicle brake( ),19,上海財(cái)經(jīng)大學(xué) 信息管

13、理與工程學(xué)院,接口 interface,使用接口 當(dāng)一個(gè)類聲明 implements 某一 interface 時(shí),必須具體實(shí)現(xiàn)該 interface 中定義的抽象方法,并把此方法定義為public的。 用implements代替extends聲明子類,該子類中必須實(shí)現(xiàn)接口及該接口超類中的所有方法。 利用接口可實(shí)現(xiàn)多重繼承 便于設(shè)計(jì)更合理的類層次,代碼更靈活,20,上海財(cái)經(jīng)大學(xué) 信息管理與工程學(xué)院,interface 程序示例,例:樂器族譜Music.java,21,上海財(cái)經(jīng)大學(xué) 信息管理與工程學(xué)院,interface 程序示例,interface Instrument int A=5 ; /

14、 常量定義,默認(rèn)為static ” 的區(qū)別 ,22,上海財(cái)經(jīng)大學(xué) 信息管理與工程學(xué)院,interface的使用,interface可以作為一種數(shù)據(jù)類型使用。 如:,public interface flyer public class myClass public void myMethod(flyer f, double d) . ,23,上海財(cái)經(jīng)大學(xué) 信息管理與工程學(xué)院,interface 中要注意的問題,不能向interface定義中隨意增加方法。 public interface shape void draw( ); void erase( ); double area( ); /直

15、接在接口中增加方法,會(huì)帶來所有該接口的子類的維護(hù)問題。 ,提倡,public interface ShapeWithArea extends Shape /通過子接口來新增方法 double area( ); ,24,上海財(cái)經(jīng)大學(xué) 信息管理與工程學(xué)院,可以通過實(shí)現(xiàn)接口來實(shí)現(xiàn)多重繼承:一個(gè)類可只繼承一個(gè)父類,并實(shí)現(xiàn)多個(gè)接口。 例如: interface I1 ; interface I2 ; class Father . ; class Son extends Father implements I1,I2 ,接口 interface,25,上海財(cái)經(jīng)大學(xué) 信息管理與工程學(xué)院,interface

16、Flyer,Vehicle,interface Sailer,dock ( ) cruise ( ),Airplane,takeoff ( ) land ( ) fly ( ),RiverBarge,dock ( ) cruise ( ),takeoff ( ) land ( ) fly ( ),SeaPlane,dock ( ) cruise ( ) takeoff ( ) land ( ) fly ( ),Helicopter takeoff ( ) land ( ) fly ( ),實(shí)現(xiàn)多個(gè)接口,完成多重繼承,一個(gè)類實(shí)現(xiàn)多個(gè)接口,26,上海財(cái)經(jīng)大學(xué) 信息管理與工程學(xué)院,interface

17、:多態(tài)性,interface 可作為類來使用,實(shí)現(xiàn)多態(tài)。 interface SpeakingAbilityvoid speak( ); class Chinese implements SpeakingAbility public void speak( ) class Japanese implements SpeakingAbility public void speak( ) Human h1 = new Chinese( ); Human h2 = new Japanese( ); h1.speak( ); /訪問Chinese類實(shí)現(xiàn)的speak( ) h2.speak( ); /訪

18、問Japanese類實(shí)現(xiàn)的speak( ),27,上海財(cái)經(jīng)大學(xué) 信息管理與工程學(xué)院,類分組語句:package,包(package)是相關(guān)類與接口的一個(gè)集合,它提供訪問控制與命名空間管理。 Java平臺中的類與接口都是根據(jù)功能以包組織的。 包機(jī)制的好處: 組織相關(guān)的源代碼文件:程序員容易確定包中的類是相關(guān)的,并且容易根據(jù)所需的功能找到相應(yīng)的類。 防止類名稱發(fā)生沖突:每個(gè)包都創(chuàng)建一個(gè)新的命名空間,因此不同包中的類名不會(huì)沖突。 提供包級別的封裝和訪問控制:同一個(gè)包中的類之間有比較寬松的訪問控制。,28,上海財(cái)經(jīng)大學(xué) 信息管理與工程學(xué)院,創(chuàng)建包,創(chuàng)建 package 每一個(gè)class 在編譯的時(shí)候被

19、指定屬于某一特定package ,用關(guān)鍵字package 說明: package srd.math ; /命名要注意唯一性,可使用WWW域名 public class ComplexNumber 包名用“.” 分隔。 包定義語句在每個(gè)源程序中只能有一條,即一個(gè)類只能屬于一個(gè)包。 如果package 未指定,則該程序的所有 class 都被組合到一個(gè)未命名的缺省package 中,不能被其他包中的類引用 包定義語句必須在程序的第一行(之前可有空格及注釋)。,29,上海財(cái)經(jīng)大學(xué) 信息管理與工程學(xué)院,使用包,使用包:使用其他包中的class,可以: 在引用類之前冠以包名做前綴 java.io.fil

20、estream 用import 語句將此包中的某些或所有class加載入當(dāng)前程序: import srd. math. ComplexNumber; import srd. math. *;,30,上海財(cái)經(jīng)大學(xué) 信息管理與工程學(xué)院,將包引入源程序,格式: import 包名.*; import 包名. 類名; import 語句必須在源程序之前,在package 聲明之后。 package . /缺省是當(dāng)前路徑,即package . import . /缺省是import java.lang.* 類聲明 .,使用包:import 語句,31,上海財(cái)經(jīng)大學(xué) 信息管理與工程學(xué)院,包名與包中類的存儲

21、位置,包與文件系統(tǒng) 每個(gè)包對應(yīng)一個(gè)同名的路徑,此包中所有class編譯生成的.class文件都在此目錄中;此目錄系統(tǒng)不會(huì)自動(dòng)生成,必須手工創(chuàng)建 包分隔符相當(dāng)于目錄分隔符,包存儲的路徑由包根路徑加上包名指明的路徑組成。 包的根路徑由CLASSPATH環(huán)境變量指出。 package .shufe %CLASSPATH%cnedushufe,32,上海財(cái)經(jīng)大學(xué) 信息管理與工程學(xué)院,包名與包中類的存儲位置(續(xù)),CLASSPATH環(huán)境變量,一般為當(dāng)前路徑 . 和jdklibclasses.zip;也可使用set命令修改: set classpath=.;jdklibclasses.zip;

22、c:javamyclasses,33,上海財(cái)經(jīng)大學(xué) 信息管理與工程學(xué)院,包的使用:例,import tools.MyTool class UseMyTool ,%CLASSPATH%toolsMyTool.class,package tools class MyTool ,MyTool.java,UseMyTool.java,自動(dòng),自動(dòng),34,上海財(cái)經(jīng)大學(xué) 信息管理與工程學(xué)院,說明:,設(shè): MyTool.java定義了package tools; 而UseMyTool.java中使用 import tools.MyTool; 則: 編譯UseMyTool.java時(shí), 系統(tǒng)會(huì)自動(dòng)到%CLASS

23、PATH%tools 去尋找和加載MyTool.class 因此: MyTools.class一定要放在相應(yīng)的%CLASSPATH% tools子目錄下,35,上海財(cái)經(jīng)大學(xué) 信息管理與工程學(xué)院,源文件應(yīng)該按照包名對應(yīng)的路徑放置。如,類文件也應(yīng)該放在包名對應(yīng)的一系列目錄下。,源文件(.java)與類文件(.class)的管理,36,上海財(cái)經(jīng)大學(xué) 信息管理與工程學(xué)院,一般將源文件與類文件分別存放,可采用如下方式:,源文件(.java)與類文件(.class)的管理,例: 類文件目錄 源文件目錄,37,上海財(cái)經(jīng)大學(xué) 信息管理與工程學(xué)院,java提供的常用包,程序包java.io 輸入/輸出 程序包j

24、ava.lang 基本類 程序包java.math 數(shù)學(xué)運(yùn)算 程序包 網(wǎng)絡(luò)操作 程序包java.rmi 遠(yuǎn)程方法 程序包java.util 實(shí)用程序 程序包java.text 處理文本及消息類 程序包javax.swing GUI,用于取代AWT,38,上海財(cái)經(jīng)大學(xué) 信息管理與工程學(xué)院,成員變量和方法有4種訪問級別: public, protected, default(package), private ; 類有兩種訪問級別:public 或default。 修飾符的作用范圍: 修飾符 同一個(gè)類 同一個(gè)包 子類 其它類 public Yes YesYes Yes protected Yes

25、YesYes default Yes Yes private Yes,高級訪問控制,39,上海財(cái)經(jīng)大學(xué) 信息管理與工程學(xué)院,程序包的訪問控制,private,default,protected,public,40,上海財(cái)經(jīng)大學(xué) 信息管理與工程學(xué)院,class Alpha private int iamprivate; private void privateMethod( ) System.out.println(privateMethod); class Beta void accessMethod() Alpha a = new Alpha( ); a.iamprivate = 10; a

26、.privateMethod( ); ,高級訪問控制private,/ X, Beta類不能訪問Alpha類的private成員,/ X,41,上海財(cái)經(jīng)大學(xué) 信息管理與工程學(xué)院,class Alpha private int iamprivate; boolean isEqualTo(Alpha anotherAlpha) if (this.iamprivate = anotherAlpha.iamprivate) / anotherAlpha是本類的另一個(gè)對象,可以訪問本類的private成員 return true; else return false; ,高級訪問控制private,注意

27、:訪問控制應(yīng)用于class層次,而不是對象層次。,42,上海財(cái)經(jīng)大學(xué) 信息管理與工程學(xué)院,package Greek; class Alpha int iampackage; void packageMethod() System.out.println(packageMethod); package Greek; /同一個(gè)包中 class Beta void accessMethod() Alpha a = new Alpha(); a.iampackage = 10; a.packageMethod(); ,高級訪問控制package(default),,同一個(gè)包,43,上海財(cái)經(jīng)大學(xué) 信息

28、管理與工程學(xué)院,允許類本身、它的子類、以及同一個(gè)包中其余的類訪問這些成員。 package Greek; public class Alpha protected int iamprotected; protected void protectedMethod() System.out.println(protectedMethod); package Greek; /同一個(gè)包 class Gamma void accessMethod( ) Alpha a = new Alpha( ); a.iamprotected = 10; tectedMethod( ); ,高級訪問控制pr

29、otected,/ legal,/ legal,44,上海財(cái)經(jīng)大學(xué) 信息管理與工程學(xué)院,package Latin; import Greek.*; class Delta extends Alpha void accessMethod(Alpha a, Delta d) a.iamprotected = 10; d.iamprotected = 10; tectedMethod(); tectedMethod(); ,高級訪問控制protected, 通過子類對象訪問,不在同一包中,無法直接訪問,位于Greek包中,位于Latin包中,45,上海財(cái)經(jīng)大學(xué) 信息管理與工程學(xué)

30、院,內(nèi)部類:在一個(gè)類的聲明里聲明的類。 Class A /外包類 class B /內(nèi)部類 內(nèi)部類可作為類的一個(gè)成員使用。一般只在外包類中 調(diào)用。 內(nèi)部類可以訪問外包類的所有成員。 在其他類中訪問內(nèi)部類: 外包類名.內(nèi)部類名,內(nèi)部類,46,上海財(cái)經(jīng)大學(xué) 信息管理與工程學(xué)院,內(nèi)部類:例5-8,public class Outer private int size; /* 定義內(nèi)部類Inner */ public class Inner public void doStuff() size+; /訪問外包類的成員變量size /內(nèi)部類定義結(jié)束 Inner i=new Inner(); /成員變量i

31、為Inner類的對象 public void increaseSize() i.doStuff(); /在外包類Outer的方法體中,調(diào)用內(nèi)部類Inner的方法 public static void main(String a) Outer o=new Outer(); for (int i = 0; i4; i+) o.increaseSize(); /在main方法中調(diào)用本類的其他方法,應(yīng)注意什么? System.out.println(The value of size : +o.size); ,The value of size: 1 The value of size: 2 The

32、value of size: 3 The value of size: 4,運(yùn)行結(jié)果:,47,上海財(cái)經(jīng)大學(xué) 信息管理與工程學(xué)院,內(nèi)部類:與外包類的關(guān)系,內(nèi)部類對象中保存了一個(gè)對外包類對象的引用 外包類名.this 內(nèi)部類變量對外包類同名變量進(jìn)行隱藏 public class Outer private int size; /* 定義內(nèi)部類Inner */ public class Inner private int size; public void doStuff(int size) /內(nèi)部類的方法 size+; /訪問內(nèi)部類方法的局部變量 this.size+; /訪問內(nèi)部類的成員變量 O

33、uter.this.size+; /訪問其外包類Outer的成員變量 System.out.println(size in Inner.doStuff(): +size); System.out.println(size of the Inner class: +this.size); System.out.println(size of the Outer class: +Outer.this.size); .,48,上海財(cái)經(jīng)大學(xué) 信息管理與工程學(xué)院,從執(zhí)行效率考慮, Java不把基本數(shù)據(jù)類型作為類來處理。 同時(shí),java提供Wrapper類(位于java.lang包中), 可將基本類型表示

34、成類。 每個(gè)wrapper類對象都封裝了基本類型的一個(gè)值。 Primitive Data Type Wrapper Class booleanBoolean byteByte charCharacter shortShort int Integer longLong floatFloat doubleDouble,Wrapper類,49,上海財(cái)經(jīng)大學(xué) 信息管理與工程學(xué)院,Wrapper類,Wrapper類中包含了很多有用的方法和常量。 如數(shù)值型Wrapper類中(Integer,Double,etc.)的MIN_VALUE 和 MAX_VALUE 常量,定義了該類型的最大值與最小值。byteValue(), shortValue()方法進(jìn)行數(shù)值轉(zhuǎn)換,valueOf() 和 toString() 實(shí)現(xiàn)字符串與數(shù)值之間的轉(zhuǎn)換。 Float.toString(3.14); /3.14 “3.14” Integer.parseInt(“1”); / “1” 1 Wrapper類對象的創(chuàng)建, 用構(gòu)造方法實(shí)現(xiàn): int a = 50; Integer b = new Integer(a); Double amount = new Double(345987.246);,50,上海財(cái)經(jīng)大學(xué) 信息管理與工程學(xué)院,相同:equals( ) 和 = = 都可以比較兩個(gè)引用是否指向相同的對象。

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會(huì)有圖紙預(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)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論