Java類和對象的高級特征_第1頁
Java類和對象的高級特征_第2頁
Java類和對象的高級特征_第3頁
Java類和對象的高級特征_第4頁
Java類和對象的高級特征_第5頁
已閱讀5頁,還剩16頁未讀, 繼續(xù)免費閱讀

下載本文檔

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

文檔簡介

1、第4章 Java類和對象的高級特征14.1 接口14.1.1 定義接口24.1.2 實現(xiàn)接口24.2 內(nèi)部類54.2.1 內(nèi)部類特性54.2.2 靜態(tài)內(nèi)部類104.3 包114.3.1 Java的常用包介紹114.3.2 引用Java定義的包144.3.3 自定義包17【例4.1】 聲明接口。2【例4.2】 實現(xiàn)接口的類。3【例4.3】 一個類實現(xiàn)多個接口。3【例4.4】 內(nèi)部類的定義。5【例4.5】 嵌套的兩個類之間的訪問規(guī)則。5【例4.6】 內(nèi)部類與外部類的成員同名問題。6【例4.7】 抽象內(nèi)部類。8【例4.8】 內(nèi)部接口。9【例4.9】 靜態(tài)公用內(nèi)部類。10【例4.10】 引用Java實

2、用包中的日期類。14【例4.11】 自定義包。17表4.1 一個班級的學(xué)生成績表11圖4.1 繼承機制3圖4.2 Java的包12第4章 Java類和對象的高級特征作為一種典型的面向?qū)ο笳Z言,Java實現(xiàn)了大部分的面向?qū)ο髾C制。由于面向?qū)ο罄碚撋婕胺秶軓V泛,所以除了前一章介紹的內(nèi)容外,本章討論Java面向?qū)ο髮崿F(xiàn)機制,包括接口、內(nèi)部類和包。4.1 接口由于Java沒有提供像C+一樣的多重繼承機制,即讓一個類繼承多個類,從而避免了C+中因多重繼承而引起的難以預(yù)測的沖突。但在實際應(yīng)用中可能用多重繼承實現(xiàn)會更方便合理些,如正方形應(yīng)該是繼承了菱形和長方形的特征,這時Java提供了接口用于實現(xiàn)多重繼承

3、。這樣,既實現(xiàn)了多重繼承的功能,同時又避免了C+中因多重繼承而存在的隱患。Java不支持多重繼承,即一個類只能有一個超類。單繼承性使得Java簡單,易于管理。為了克服單繼承的缺點,Java使用了接口,一個類可以實現(xiàn)多個接口。4.1.1 定義接口接口(interface)是沒有實現(xiàn)的方法和變量的集合。接口的定義與類的定義相似,格式為:<修飾符> interface <接口名>方法1; 方法2;其中,<修飾符>可以是public,也可以缺省。缺省時,接口使用缺省訪問控制,即接口只能被與它處在同一包中的成員訪問;當(dāng)聲明為public時,接口能被任何類成員訪問。&l

4、t;接口名>是接口的名字,可以是任何有效的標(biāo)識符。例如:interface MyInterFace1void method1();聲明了一個接口MyInterFace1。在接口中的方法method1只有定義沒有實現(xiàn),即接口中的方法都是抽象方法,所以實際上接口就是一種特殊的抽象類,這意味著在定義接口時不必管怎樣實現(xiàn)接口。定義在接口中的變量全部隱含為final和static型。這意味著它們不能被實現(xiàn)接口方法的類改變,這些變量還必須設(shè)置初值。如果接口聲明為public型,則接口中的方法和變量全部為public型。【例4.1】 聲明接口。本例聲明了接口Student_info表示學(xué)生情況,其中有

5、一個成員變量year和二個成員方法age、output。成員變量year隱含為final和static型,必須設(shè)置初值。源程序文件名必須與接口名相同。程序如下:interface Student_info /學(xué)生情況接口 int year = 2002; int age(); void output();4.1.2 實現(xiàn)接口一旦定義了一個接口,一個或更多的類就能實現(xiàn)這個接口。為了實現(xiàn)接口,類必須實現(xiàn)定義在接口中的方法,每個類能自由地決定方法具體實現(xiàn)的細(xì)節(jié)。Java提倡充分地利用多態(tài)性中的“一個接口,多個方法”的特性。接口的實現(xiàn)類似于繼承,只是不用extends,而是用關(guān)鍵字implements

6、聲明一個類將實現(xiàn)一個接口,類聲明的格式是:<修飾符> class <類名> extends <超類名> implements <接口名1>,<接口名2>,其中,<修飾符>可以是public,也可以缺省。如果一個類實現(xiàn)一個接口,則必須實現(xiàn)接口中的所有方法,且方法必須聲明為public。如果一個類實現(xiàn)多個接口,則用逗號分隔接口列表。【例4.2】 實現(xiàn)接口的類。本例聲明的類Stu1實現(xiàn)接口Student_info,Stu1類中有自己的二個成員變量name和birth_year,實現(xiàn)接口方法age時使用了接口中的變量year的值。

7、程序如下:public class Stu1 implements Student_info /實現(xiàn)學(xué)生情況接口 String name; int birth_year; /類自己的成員變量 public Stu1(String n1,int y) name = n1; birth_year = y; public int age() /實現(xiàn)接口的方法 return year - birth_year; public void output() /實現(xiàn)接口的方法 System.out.println( +" "+ this.age()+"歲&qu

8、ot;); public static void main (String args) Stu1 s1 = new Stu1("李明",1980); s1.output(); 程序運行結(jié)果:李明 22歲由本例可見,一個類實現(xiàn)一個接口,必須給出接口中所有方法的實現(xiàn)。如果不能實現(xiàn)某方法,也必須寫出一個空方法。Java允許多個類實現(xiàn)同一個接口,這些類之間可以是毫無聯(lián)系的,每個類各有自己實現(xiàn)方法的細(xì)節(jié)。這一點與繼承機制不同。同時一個類也能實現(xiàn)多個接口,這就解決了多重繼承的問題。如圖4.1所示。圖4.3 繼承機制【例4.3】 一個類實現(xiàn)多個接口。本例聲明一個接口Student_sco

9、ure表示學(xué)生成績,其中有二個成員方法total、erface Student_scoure /學(xué)生成績接口 float total(); void output();本例聲明的類Stu2實現(xiàn)兩個接口Student_info和Student_scoure,此時必須寫出兩個接口中的所有方法。程序如下:public class Stu2 implements Student_info, Student_scoure /實現(xiàn)學(xué)生情況接口、學(xué)生成績接口 String name; int birth_year; float math,english,computer; public

10、Stu2(String n1,int y,float a,float b,float c) name = n1; birth_year = y; math = a; english = b; computer = c; public int age() return year - birth_year; public float total() return math + english + computer; public void output() /實現(xiàn)接口的方法 System.out.print( +" "+ this.age()+"歲

11、"); System.out.println(math+" "+english+" "+computer+" "+total(); public static void main (String args) Stu2 s2 = new Stu2("李明",1980,90,80,70); s2.output(); 程序運行結(jié)果:李明 22歲 90.0 80.0 70.0 240.0本例的兩個接口中都聲明了同一方法output,那么其中的任一接口都能使用這一方法。在Java的實際應(yīng)用中,需要使用Java提供的

12、接口。最典型的應(yīng)用就是事件處理,例如Java定義了MouseListener和MouseMotionListener兩個接口,里面定義了所有處理鼠標(biāo)事件的方法,當(dāng)一個類實現(xiàn)這兩個接口后,就可以處理這些鼠標(biāo)事件了。有關(guān)Java事件處理的機制將在第六章中詳細(xì)說明。4.2 內(nèi)部類一個類被嵌套定義于另一個類中,稱為內(nèi)部類(inner class),也稱為嵌套類。包含內(nèi)部類的類稱為外部類。與一般的類相同,內(nèi)部類可以具有成員變量和成員方法。通過建立內(nèi)部類的對象,可以存取其成員變量和調(diào)用其成員方法?!纠?.4】 內(nèi)部類的定義。本例聲明的Group1類中包含有Student類,相對而言,Group1類稱為外部

13、類,類Student稱為內(nèi)部類,內(nèi)部類Student中也可以聲明成員變量和成員方法。程序如下:public class Group1 int count; /外部類的成員變量 public class Student /聲明內(nèi)部類 String name; /內(nèi)部類的成員變量 public void output() /內(nèi)部類的成員方法 System.out.println( +" "); 4.2.1 內(nèi)部類特性在外部類中聲明了內(nèi)部類之后,外部類與內(nèi)部類之間構(gòu)成嵌套結(jié)構(gòu),那么兩者之間的訪問規(guī)則是怎樣的?外部類中怎樣訪問內(nèi)部類,內(nèi)部類中可以訪問外部類的成員嗎

14、?這些問題可由以下所述的內(nèi)部類的特性來解決。內(nèi)部類具有以下一些特性:1. 內(nèi)部類的類名只能用在外部類或語句塊之內(nèi)。在外部引用它時必須給出完整的名稱,且內(nèi)部類的類名不能與外部類名相同。對于例4.4,外部類Group1聲明內(nèi)部類Student,在外部類Group1的方法中可以使用內(nèi)部類名Student創(chuàng)建內(nèi)部類的對象,而在外部類的main方法或其他類中,則必須使用完整的內(nèi)部類標(biāo)識Group1.Student,參見例4.5、例4.6。2. 內(nèi)部類作為外部類的成員。Java將內(nèi)部類作為外部類的一個成員,就如同成員變量和成員方法。因此訪問內(nèi)部類成員的規(guī)則是,在外部類中,通過一個內(nèi)部類的對象可以引用內(nèi)部類

15、中的成員。同時,Java提供一種機制,允許內(nèi)部類引用它的外部類的成員,包括靜態(tài)成員、實例成員及私有成員?!纠?.5】 嵌套的兩個類之間的訪問規(guī)則。本例的類Group2中聲明了成員變量count、內(nèi)部類Student、實例方法output和main方法,在內(nèi)部類Student中聲明了構(gòu)造方法和output方法,構(gòu)造方法存取了外部類Group2的成員變量count。本例演示嵌套的兩個類之間的訪問規(guī)則,即在外部類Group2中,通過一個內(nèi)部類Student的對象s1可以引用內(nèi)部類中的成員;反之,在內(nèi)部類Student中可以直接引用它的外部類的成員,如count。程序如下:public class G

16、roup2 private int count; /外部類的私有成員變量 public class Student /聲明內(nèi)部類 String name; public Student(String n1) name = n1; count+; /存取其外部類的成員變量 public void output() System.out.print( +" "); public void output() /外部類的實例成員方法 Student s1 = new Student("李明"); /建立內(nèi)部類對象s1 s1.output();

17、/通過s1調(diào)用內(nèi)部類的成員方法 System.out.println(" count = "+this.count); public static void main (String args) Group2 g2 = new Group2(); g2.output(); 程序運行結(jié)果:李明 count = 1本例的外部類Group2中有實例方法output(),內(nèi)部類Student中也有實例方法output(),兩者同名,有效。使用時,外部類Group2的對象調(diào)用Group2的output,如g2.output(),內(nèi)部類Student的對象調(diào)用Student的outpu

18、t,如s1.output()。3. 外部類與內(nèi)部類各有自己的成員。Java允許外部類與內(nèi)部類各有自己的成員,而且不同類的成員可以同名?!纠?.6】 內(nèi)部類與外部類的成員同名問題。本例的類Group3中聲明了成員變量count、name、內(nèi)部類Student、實例方法aStu和main方法,在內(nèi)部類Student中聲明了成員變量count、name和output方法。在非靜態(tài)的內(nèi)部類中不能聲明靜態(tài)變量,所以Student中的count只能是實例變量。在內(nèi)部類Student的output方法中,訪問了三個不同含義的count:外部類的靜態(tài)變量、內(nèi)部類的靜態(tài)變量以及方法的參數(shù),這時必須在count前

19、加上不同的修飾符,編譯系統(tǒng)才能區(qū)分。在外部類的main方法中,可以使用完整的內(nèi)部類標(biāo)識Group3.Student創(chuàng)建內(nèi)部類的對象s1。程序如下:public class Group3 private static int count; /靜態(tài)變量Group3.count統(tǒng)計班級數(shù)量 private String name; /實例變量G 表示班級名稱 public class Student private int count; /實例變量Student.count表示學(xué)號 private String name; /實例變量S表示學(xué)生姓名 publ

20、ic void output(int count) count+; /存取方法的參數(shù),局部變量 this.count+; /通過對象存取Student.count Group3.count+; /通過類名存取Group3.count System.out.println(count+" "+this.count+" "+Group3.count); public Student aStu() /返回內(nèi)部類Student的一個對象 return new Student(); public static void main (String args) Gro

21、up3 g3 = new Group3(); g3.count=10; /Group3.count Group3.Student s1 = g3.aStu(); /在外部創(chuàng)建內(nèi)部類的對象 /完整的內(nèi)部類標(biāo)識Group3.Student s1.output(5); 程序運行結(jié)果:6 1 11由本例可見,外部類與內(nèi)部類的成員可以同名,通過不同類的對象訪問不同的成員。本例欲在main方法中使用Group3.Student s1 = new Group3.Student();聲明并創(chuàng)建內(nèi)部類的對象s1,編譯時出錯。這是因為Student不是靜態(tài)成員,其構(gòu)造方法不是靜態(tài)方法,所以不能在靜態(tài)方法main中

22、使用非靜態(tài)方法。此種方法將在例4.10中介紹。此時,只能首先使用Group3.Student s1聲明內(nèi)部類的對象s1,再通過調(diào)用外部類的方法g3.aStu()獲得內(nèi)部類的一個實例。同理,對于同名的name與count的操作方式類似。4. 內(nèi)部類可以定義為抽象類型,但需要被其他的內(nèi)部類繼承或?qū)崿F(xiàn)?!纠?.7】 抽象內(nèi)部類。本例的類Group4中聲明二個內(nèi)部類,一個是抽象內(nèi)部類Student_abstract,另一個是內(nèi)部類Student繼承抽象內(nèi)部類Student_abstract并實現(xiàn)抽象類中的output方法。在外部類Group4的構(gòu)造方法中,創(chuàng)建了兩個內(nèi)部類的對象s1和s2。程序如下:p

23、ublic class Group4 public abstract class Student_abstract /抽象內(nèi)部類 int count; String name; public abstract void output(); /抽象方法 public class Student extends Student_abstract /繼承抽象內(nèi)部類 public Student(String n1) name = n1; count+; /Student.count public void output() /實現(xiàn)抽象方法 System.out.println( +

24、" count="+this.count); public Group4() Student s1 = new Student("A"); s1.output(); Student s2 = new Student("B"); s2.output(); public static void main (String args) Group4 g4 = new Group4(); 程序運行結(jié)果:A count=1B count=1由運行結(jié)果可知,兩個不同對象s1、s2的name值不同,但count均為1。而我們希望count表示學(xué)生的序

25、號,程序運行時能夠自動編號。實現(xiàn)這項功能需要將count設(shè)計成靜態(tài)變量,但規(guī)則是,非靜態(tài)的內(nèi)部類中不能聲明靜態(tài)變量。所以Student類從抽象內(nèi)部類中繼承的count仍是實例變量,對于Student對象s1,s1.count的初值均為0,執(zhí)行count+之后,得到的s1.count均為1。5. 內(nèi)部類可以是一個接口,這個接口必須由另一個內(nèi)部類來實現(xiàn)?!纠?.8】 內(nèi)部接口。本例的類Group5中聲明一個內(nèi)部接口Student_info,一個內(nèi)部類Student實現(xiàn)內(nèi)部接口。在外部類Group5的構(gòu)造方法中,根據(jù)參數(shù)中的數(shù)組元素個數(shù),創(chuàng)建了若干個內(nèi)部類的對象s1。程序如下:public clas

26、s Group5 public interface Student_info /內(nèi)部接口 public void output(); public class Student implements Student_info /內(nèi)部類實現(xiàn)內(nèi)部接口 int count; String name; public Student(String n1) name = n1; count+; public void output() /實現(xiàn)接口方法 System.out.println( +" count="+this.count); public Group5(St

27、ring name1) Student s1; int i=0; while (i<name1.length) s1 = new Student(name1i); s1.output(); i+; public static void main (String args) Group5 g5; if (args.length>0) g5 = new Group5(args); 運行命令:d:myjava>java Group5 A B C后的程序結(jié)果為:A count=1B count=1C count=14.2.2 靜態(tài)內(nèi)部類定義為static型的內(nèi)部類稱為靜態(tài)內(nèi)部類。靜態(tài)

28、內(nèi)部類將自動轉(zhuǎn)化為頂層類,即它沒有超類,而且不能引用外部類成員或其它內(nèi)部類中的成員。當(dāng)一個內(nèi)部類不需要引用外部類成員,只需隱藏在另一個類中時,或者需要在一個內(nèi)部類中聲明靜態(tài)時,可以將該內(nèi)部類聲明為靜態(tài)的。例如,設(shè)計一個大型應(yīng)用程序時,程序員們自定義的類名可能會重復(fù),產(chǎn)生沖突。如果將一些內(nèi)部類聲明為靜態(tài)的公用內(nèi)部類,則其他類能夠通過完整的類標(biāo)識(如Outer.Inner)來使用這些靜態(tài)的公用內(nèi)部類,從而減少類名重復(fù)的機會?!纠?.9】 靜態(tài)公用內(nèi)部類。本例的類Group6中聲明的一個內(nèi)部類Student是靜態(tài)、公用的,其中可以聲明靜態(tài)變量count。在構(gòu)造方法中,實例變量numer得到靜態(tài)變量c

29、ount的值,實現(xiàn)了自動編號功能。靜態(tài)內(nèi)部類Student中不能訪問外部類成員。程序如下:public class Group6 public static class Student /定義靜態(tài)公用內(nèi)部類 static int count; String name; int number; public Student(String n1) /靜態(tài)內(nèi)部類的構(gòu)造方法 name = n1; count+; number = count; public void output() System.out.println( +" number="+this.num

30、ber); public static void main (String args) Group6.Student s1 = new Group6.Student("A"); s1.output(); Group6.Student s2 = new Group6.Student("B"); s2.output(); 程序運行結(jié)果:A number=1B number=2思考題:按表4.1的格式統(tǒng)計一個班級的學(xué)生成績。要求將其中一個學(xué)生的情況設(shè)計成一個內(nèi)部類Student,并以一維數(shù)組形式實現(xiàn)這張表。表4.10 一個班級的學(xué)生成績表Numbernamea

31、gescoure1234.3 包我們知道Windows對文件的組織方式是以文件夾為單位分別存放的,同一文件夾中的文件不能同名,不同文件夾中的文件可以同名。如果沒有文件夾,將文件全部放在一起,則必須使用唯一的名字,否則會發(fā)生名字沖突,而且顯得文件沒有層次,雜亂無章。如果將相關(guān)文件按文件夾分門別類存放,則顯得井井有條,便于查找,而且文件夾中還右。Java對類的組織方式與此同理。Java要求文件名與類名相同。我們將多個類放在一起時,要保證類名不能重復(fù)。當(dāng)聲明的類很多時,類名沖突的可能性增大,這時需要一種機制來管理類名,這就是包。包(package)是Java提供的一種區(qū)別類名字空間的機制,是類的組織

32、方式,包對應(yīng)一個文件夾,包中還可以再有包,稱為包等級。我們在源程序中可以聲明類所在的包,就像保存文件時,要說明文件保存在哪個文件夾中一樣。同一包中的類名不能重復(fù),不同包中的類名可以相同。當(dāng)源程序中沒有聲明類所在的包時,Java將類放在缺省包中,這意味著每個類必須使用唯一的名字,否則會發(fā)生名字沖突。就象在一個文件夾中的文件名不同相同一樣。Java類庫是以包的形式實現(xiàn)的,每個包里都含有多組相關(guān)的類,除類之外還包含接口、異常等。本節(jié)首先來看Java定義了哪些常用包,再介紹如何引用Java定義的包,最后說明如何定義自己的包。4.3.1 Java的常用包介紹Java提供了豐富的類庫,分別放在不同的包中。

33、打開Java的幫助文檔,進入Java 2 Platform API Specification,可以看到所有的包及其中的類和方法,如圖4.2所示。圖4.10 Java的包圖4.2所示的是java.lang包中的Math類,其中定義許多方法實現(xiàn)數(shù)學(xué)函數(shù)的功能。Java的常用包有:java.lang語言包java.util實用包java.awt抽象窗口工具包java.io輸入輸出流java.appletApplet應(yīng)用程序網(wǎng)絡(luò)功能1. 語言包Java語言包java.lang所提供的類構(gòu)成了Java語言的核心。語言包中的類是Java類庫中最低級的類。語言包中最主要的類有:(1) Object類Obj

34、ect類是Java類的根,所有其他的類都是由Object類派生出來的,在Object類中定義的方法,在其他類中都可以使用。Object類中有復(fù)制對象方法clone,比較兩個對象是否相等的equals方法,獲得對象的類getClass方法等。(2) 數(shù)據(jù)類型包裝類(The Data Type Wrapper)簡單數(shù)據(jù)類型的類包裝,有Integer、Float、Boolean等多個類。例如,int i;Integer j = new Integer(“123”);/以字符串構(gòu)造Integer類的一個對象ji = Value();/intValue方法將j轉(zhuǎn)化為int值在例3.11中,我們

35、使用該方法將以命令行參數(shù)輸入的字符串,轉(zhuǎn)化為int值。(3) 數(shù)學(xué)類Math數(shù)學(xué)類Math提供一組常量和數(shù)學(xué)函數(shù)。包括E和PI常數(shù),求一個數(shù)絕對值的abs方法,計算三角函數(shù)的sin、cos方法,求最小值、最大值的min、max方法,求隨機數(shù)的random方法等。數(shù)學(xué)類中所有的變量和方法都是靜態(tài)(static)的,且數(shù)學(xué)類是最終類(final),所以不能從數(shù)學(xué)類中派生其他的新類。(4) 字符串類與C/C不同,Java將字符串作為類來實現(xiàn),而不強制使用字符數(shù)組。字符串有兩個類:String和StringBuffer。String類中字符串對象的值和長度都沒有變化。常用方法有:求子串substrin

36、g,替換replace等。StringBuffer類中字符串對象的值和長度都可以變化。(5) 系統(tǒng)和運行時類System、Runtime System類和Runtime類提供訪問系統(tǒng)和運行時環(huán)境資源。System類提供一個獨立于具體計算機系統(tǒng)資源的編程界面,包括標(biāo)準(zhǔn)輸入System.in和標(biāo)準(zhǔn)輸出System.out,分別表示鍵盤和顯示器。例如System.out.print()方法用于顯示輸出。System類中的變量和方法都是最終的(final)和靜態(tài)(static)的。Runtime類可直接訪問運行時資源,例如,運行該類的freeMemory方法,返回系統(tǒng)自由內(nèi)存空間的大小。(6) 類操作

37、類ClassJava提供兩個用于類操作的類:Class和ClassLoader。Class為類提供運行時信息,如名字、類型以及父類。例如,System.exit(0);/ Terminates the currently running Java Virtual Machine.再如,在第3章的例中,我們多次用下面的形式輸出當(dāng)前對象所在類的名稱:System.out.print(this.getClass().getName()+" ");在Object類中的getClass方法返回當(dāng)前對象所在的類,返回值是Class。在Class類中的getName方法返回一個類的名稱,

38、返回值是String。由于所有類都是Object類的子類,根據(jù)繼承的“即是”原則,所有類的對象即是Object類的對象。所以通過當(dāng)前對象this調(diào)用Object類中的getClass方法,得到當(dāng)前對象所在的類(Class),再調(diào)用Class中的getName方法得到this的類名字符串。ClassLoader類提供把類裝入運行時環(huán)境的方法。(7) 線程類ThreadJava是一個多線程環(huán)境,提供各種用于線程管理和操作的類。與程序一起使用的多線程類和接口有:Thread、ThreadDeath、ThreadGroup、Runnable。Thread類在程序中建立一個可執(zhí)行的線程,ThreadDe

39、ath類在一個線程執(zhí)行完成后進行清理工作,ThreadGroup類用來組織一組線程,接口Runnable是建立線程的交互工具。(8) 錯誤和異常處理類Throwable、Exception、Error運行時錯誤處理在任何一個程序設(shè)計環(huán)境中都很重要。Java提供用于運行時錯誤處理的類有:Throwable、Exception、Error。Throwable類處理低級錯誤,Exception類處理異常錯誤,Error類處理硬件錯誤。Exception類和Error類都是由Throwable派生的。(9) 過程類ProcessProcess類支持系統(tǒng)過程,當(dāng)使用類Runtime執(zhí)行系統(tǒng)命令時,就建立

40、了處理系統(tǒng)過程的Process類。2. 實用包Java實用包java.util提供了實現(xiàn)各種不同實用功能的類,包括日期類、數(shù)據(jù)結(jié)構(gòu)類等。(1) 日期類包括Data、Calendar、GregorianCalendar類。Data類中有日期和時間值,提供獲得和修改當(dāng)前日期和時間的方法。Calendar和GregorianCalendar是日歷類,聲明了對日期值的許多操作。在JDK 1.1之后的版本中,Date類中的許多方法被Calendar類中的方法所替代,例如Date類中的getYear、setYear方法被Calendar類中的get、set取代。(2) 數(shù)據(jù)結(jié)構(gòu)類包括鏈表類LinkedLi

41、st、向量類Vector、棧類Stack、散列表類Hashtable等。(3) 隨機數(shù)類Random4.3.2 引用Java定義的包1. 導(dǎo)入包如果要使用Java包中的類,必須在源程序中用import語句導(dǎo)入。import語句的格式為:import <包名1>. <包名1>. <包名1>. <類名1>*;其中import是關(guān)鍵字,多個包名及類名之間用圓點分隔,“*”表示包中的所有類。如,import java.applet.Applet;/導(dǎo)入java.applet包中的Applet類import java.awt.*;/導(dǎo)入java.awt包中

42、的所有類java.lang包是系統(tǒng)自動隱含地導(dǎo)入的,用戶無需用import語句引入,就可使用其中的類。2. Java包的路徑要引用Java的包,僅在源程序中增加import語句是不夠的,還必須告訴Windows系統(tǒng),程序運行時到哪兒才能找到Java的包。這個功能由環(huán)境變量classpath來完成。由于Java使用文件系統(tǒng)來存儲包和類,類名就是文件名,包名就是文件夾名。所以在Windows98系統(tǒng)的c:autoexec.bat中設(shè)置classspath的語句為:set classpath = .;d: jdk1.3.0_02lib其中d:jdk1.3.0_02是JDK1.3系統(tǒng)安裝的路徑。若在W

43、indows2000系統(tǒng)中,要在“我的電腦”“屬性”“高級”“環(huán)境變量”中,新建“系統(tǒng)變量”classspath,語句為:classpath = .;d: jdk1.3.0_02lib【例4.10】 引用Java實用包中的日期類。本例聲明了外部類People1,成員變量是name、birth分別記載一個人的姓名和出生日期,還有用出生日期計算人年齡的age方法。其中為日期聲明了一個內(nèi)部類Date1,成員有表示年月日的三個整型。本例引用Java的java.util包中Calendar、GregorianCalendar類,用來獲得系統(tǒng)當(dāng)前日期值。在外部類People1的age方法中,定義了一個Gr

44、egorianCalendar類的對象today,創(chuàng)建時today獲得系統(tǒng)當(dāng)前日期值,Calendar.YEAR是表示年份的常量,通過對象的get方法today.get(Calendar.YEAR)獲得today的今年的年份,從而可計算出一個人今年的年齡。程序如下:import java.util.*; /引用java.util包public class People1 /外部類聲明 private String name; private Date1 birth; public class Date1 /內(nèi)部類聲明 private int year,month,day; /成員變量,表示年、

45、月、日 public Date1(int y,int m,int d) /內(nèi)部類的構(gòu)造方法 year = y; month = m; day = d; public Date1() this(0,0,0); public Date1 getToday() /內(nèi)部類的成員方法 GregorianCalendar c_today = new GregorianCalendar(); return new Date1(c_today.get(Calendar.YEAR), c_today.get(Calendar.MONTH)+1,c_today.get(Calendar.DATE); public

46、 int getYear() return year; public int getMonth() return month; public int getDay() return day; public String toString() return year+"-"+month+"-"+day; public People1(String n1,int y,int m,int d) /外部類的構(gòu)造方法 name = n1; birth = new Date1(y,m,d); public People1() name = ""

47、birth = new Date1(); public int age() /外部類的成員方法,計算年齡 Date1 today = (new Date1().getToday(); /today獲得當(dāng)前日期值 return today.getYear() - birth.getYear(); /獲得today的年份 public void output() System.out.println("name : "+name); System.out.println("birth: "+birth.toString(); System.out.print

48、ln("age : "+age(); public static void main(String args) People1.Date1 today = (new People1().new Date1().getToday(); System.out.println("today: " + today.toString(); People1 a = new People1("Wangli",1981,2,14); a.output(); 程序運行結(jié)果:today: 2002-10-25name : Wanglibirth: 1981-2-14age : 21在內(nèi)部類Date1中聲明了getToda

溫馨提示

  • 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)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論