Java簡(jiǎn)明教程第三四版課件-上課版5_第1頁(yè)
Java簡(jiǎn)明教程第三四版課件-上課版5_第2頁(yè)
Java簡(jiǎn)明教程第三四版課件-上課版5_第3頁(yè)
Java簡(jiǎn)明教程第三四版課件-上課版5_第4頁(yè)
Java簡(jiǎn)明教程第三四版課件-上課版5_第5頁(yè)
已閱讀5頁(yè),還剩33頁(yè)未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

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

文檔簡(jiǎn)介

1、231第第5章章 接口和包接口和包 本章主要講述如下內(nèi)容本章主要講述如下內(nèi)容 : 接口的定義和使用;接口的定義和使用; 接口與抽象類的異同點(diǎn);接口與抽象類的異同點(diǎn); 包的定義和使用;包的定義和使用; 泛型和應(yīng)用。泛型和應(yīng)用。 2325.1 接口接口 引入接口的原因:引入接口的原因:在程序設(shè)計(jì)中經(jīng)常遇到這在程序設(shè)計(jì)中經(jīng)常遇到這樣一個(gè)問(wèn)題:有些類互不相關(guān),但卻具有相樣一個(gè)問(wèn)題:有些類互不相關(guān),但卻具有相似的方法。并且這些方法在各個(gè)類中的實(shí)現(xiàn)似的方法。并且這些方法在各個(gè)類中的實(shí)現(xiàn)互不相同。我們不能為這些類定義一個(gè)共同互不相同。我們不能為這些類定義一個(gè)共同的父類,但又希望在程序中體現(xiàn)出它們共同的父類,

2、但又希望在程序中體現(xiàn)出它們共同的接口。的接口。 2335.1.1 接口的定義和應(yīng)用接口的定義和應(yīng)用 接口是一系列常量和空方法的集合,它提供接口是一系列常量和空方法的集合,它提供了多個(gè)類共同的方法,但不限制每個(gè)類如何了多個(gè)類共同的方法,但不限制每個(gè)類如何實(shí)現(xiàn)這些方法。實(shí)現(xiàn)這些方法。 JavaJava允許一個(gè)類同時(shí)實(shí)現(xiàn)多個(gè)接口,相當(dāng)于允許一個(gè)類同時(shí)實(shí)現(xiàn)多個(gè)接口,相當(dāng)于實(shí)現(xiàn)多繼承的功能。實(shí)現(xiàn)多繼承的功能。 2345.1.1 接口的定義和應(yīng)用(續(xù))接口的定義和應(yīng)用(續(xù)) 聲明一個(gè)接口的語(yǔ)法格式:聲明一個(gè)接口的語(yǔ)法格式: public interface interfaceName extends su

3、per-interface-Listtype ConstantName=value;type MethodName( Parameter lists); 2355.1.1 接口的定義和應(yīng)用(續(xù))接口的定義和應(yīng)用(續(xù)) 接口中不能聲明任何變量和構(gòu)造函數(shù)。接口中不能聲明任何變量和構(gòu)造函數(shù)。 如果一個(gè)類實(shí)現(xiàn)多個(gè)接口,應(yīng)該在接口名之間如果一個(gè)類實(shí)現(xiàn)多個(gè)接口,應(yīng)該在接口名之間用逗號(hào)隔開(kāi)。用逗號(hào)隔開(kāi)。 當(dāng)一個(gè)類實(shí)現(xiàn)接口時(shí),必須實(shí)現(xiàn)接口中給出的當(dāng)一個(gè)類實(shí)現(xiàn)接口時(shí),必須實(shí)現(xiàn)接口中給出的空方法,若實(shí)現(xiàn)接口的類是一個(gè)抽象類,可以空方法,若實(shí)現(xiàn)接口的類是一個(gè)抽象類,可以把實(shí)現(xiàn)接口的任務(wù)交給子類去實(shí)現(xiàn)。例如:把實(shí)現(xiàn)接

4、口的任務(wù)交給子類去實(shí)現(xiàn)。例如:/ / 程序程序5-15-1interface Sortable/ 定義一個(gè)接口定義一個(gè)接口 int Compare(Sortable s); class Sort / 定義一個(gè)排序類,僅有一個(gè)靜態(tài)的方法定義一個(gè)排序類,僅有一個(gè)靜態(tài)的方法 public static void SelectSort(Sortable a )int i, j, k;Sortable temp;for(i=0;ia.length-1;i+) / 選擇排序選擇排序 k=i; for(j=i+1;ja.length;j+) if(ak.Compare(aj)0)k=j; temp=ai;

5、ai=ak; ak=temp; class Student implements Sortable / 定義一個(gè)學(xué)生類定義一個(gè)學(xué)生類private int score;Student(int x)score=x; / 實(shí)現(xiàn)接口實(shí)現(xiàn)接口Sortable中的方法中的方法public int Compare(Sortable s) Student st=(Student)s; / 類型強(qiáng)制轉(zhuǎn)換類型強(qiáng)制轉(zhuǎn)換return score-st.score; public String toString( ) return score=+score; class Rectangle implements So

6、rtable / 矩形類也實(shí)現(xiàn)了接口矩形類也實(shí)現(xiàn)了接口private int length,width; Rectangle(int x,int y) length=x; width=y; int area( )return length*width;public int Compare(Sortable s) / 實(shí)現(xiàn)接口實(shí)現(xiàn)接口Rectangle rec=(Rectangle)s; / 類型強(qiáng)制轉(zhuǎn)換類型強(qiáng)制轉(zhuǎn)換return area( )-rec.area( ); public String toString( ) return area=+area( ); public class in

7、terfaceTest public static void main(String args ) Student stud =new Student20;int i; for( i=0;istud.length;i+) studi=new Student(int)(Math.random( )*100);Sort.SelectSort(stud); / 排序排序for( i=0;istud.length;i+) System.out.println(studi.toString( );Rectangle R =new Rectangle10;for( i=0;iR.length;i+)Ri=

8、new Rectangle( (int)(Math.random( )*10), (int)(Math.random( )*10);Sort.SelectSort( R ); / 排序排序for( i=0;iR.length;i+)System.out.println(Ri.toString( ); 23125.1.1 接口的定義和應(yīng)用(續(xù))接口的定義和應(yīng)用(續(xù)) 接口中定義的變量實(shí)際上是常量,必須給出接口中定義的變量實(shí)際上是常量,必須給出它們的初始值,實(shí)現(xiàn)接口的類可以自由引用它們的初始值,實(shí)現(xiàn)接口的類可以自由引用這些常量。例如:這些常量。例如: / 程序程序5-2的部分的部分interfac

9、e constant int EXCELLENT=5;int GOOD=4;int PASS=3;int FAIL=2; 23135.1.1 接口的定義和應(yīng)用(續(xù))接口的定義和應(yīng)用(續(xù)) 在類中實(shí)現(xiàn)接口中方法時(shí),方法的特征必須在類中實(shí)現(xiàn)接口中方法時(shí),方法的特征必須和接口中聲明的方法特征保持一致;和接口中聲明的方法特征保持一致; 實(shí)現(xiàn)方法時(shí)必須在方法前加上實(shí)現(xiàn)方法時(shí)必須在方法前加上public; 若一個(gè)類沒(méi)有對(duì)接口中的方法具體實(shí)現(xiàn),那若一個(gè)類沒(méi)有對(duì)接口中的方法具體實(shí)現(xiàn),那么必須將該類聲明為么必須將該類聲明為abstract類。例如:類。例如: interface inter / 接口接口void

10、 methodA( ); abstract class Derived1 implements inter / 此處不需要寫(xiě)出此處不需要寫(xiě)出methodA( )的原型的原型 class Derived2 extends Derived1 public void methodA( ) / 實(shí)現(xiàn)方法實(shí)現(xiàn)方法System.out.println(Hi,methodA); 23155.1.2 接口和抽象類的異同點(diǎn)接口和抽象類的異同點(diǎn) 接口和抽象類的相同點(diǎn):接口和抽象類的相同點(diǎn): (1)都有空的方法,都必須在子類中實(shí)現(xiàn)這些方都有空的方法,都必須在子類中實(shí)現(xiàn)這些方法。法。 (2)都不能用都不能用new關(guān)鍵

11、字來(lái)創(chuàng)建這兩種類型的對(duì)關(guān)鍵字來(lái)創(chuàng)建這兩種類型的對(duì)象。象。 (3)都可以具有繼承關(guān)系。都可以具有繼承關(guān)系。 (4)接口和類一樣可以具有接口和類一樣可以具有public屬性。屬性。23165.1.2 接口和抽象類的異同點(diǎn)(續(xù))接口和抽象類的異同點(diǎn)(續(xù)) 接口和抽象類的不同點(diǎn):接口和抽象類的不同點(diǎn): (1)在抽象類中,空的方法必須加在抽象類中,空的方法必須加abstract關(guān)鍵字,關(guān)鍵字,而在接口中不需要。而在接口中不需要。 (2)在抽象類中,除空的方法外,可以定義實(shí)例在抽象類中,除空的方法外,可以定義實(shí)例變量和非空的方法,而在接口中,只能定義常量變量和非空的方法,而在接口中,只能定義常量和空的方法

12、。和空的方法。 (3) (3)接口允許多繼承,類僅支持單繼承。接口允許多繼承,類僅支持單繼承。 23175.2 包包 在在Java中可以將自己寫(xiě)的類,按一定的方法中可以將自己寫(xiě)的類,按一定的方法歸屬于不同的子目錄中(包)。歸屬于不同的子目錄中(包)。 在缺省情況下,在缺省情況下,Java將所有的類歸屬一個(gè)缺將所有的類歸屬一個(gè)缺省包中。在不同的包中可以有同名的類存在。省包中。在不同的包中可以有同名的類存在。 Java中的包與中的包與C+中的名字空間相似。中的名字空間相似。 23185.2.1 package語(yǔ)句語(yǔ)句 package語(yǔ)句告訴編譯器當(dāng)前類屬于哪個(gè)包。語(yǔ)句告訴編譯器當(dāng)前類屬于哪個(gè)包。如

13、果沒(méi)有如果沒(méi)有package語(yǔ)句,類就存放在無(wú)名的語(yǔ)句,類就存放在無(wú)名的缺省包中(即當(dāng)前目錄中)。缺省包中(即當(dāng)前目錄中)。 引進(jìn)包的概念主要是為了名字沖突。引進(jìn)包的概念主要是為了名字沖突。 格式格式: package pkglpkg2pkg3;23195.2.2 import語(yǔ)句語(yǔ)句 import語(yǔ)句位于語(yǔ)句位于package語(yǔ)句之后,類的定義語(yǔ)句之后,類的定義之前之前 ; 格式:格式:import package1. .package2. .(class-name | *); 采用采用*號(hào)不影響程序的運(yùn)行性能,但會(huì)影響編號(hào)不影響程序的運(yùn)行性能,但會(huì)影響編譯速度。指明具體類比引入整個(gè)包更為合

14、理。譯速度。指明具體類比引入整個(gè)包更為合理。 23205.2.3 包應(yīng)用舉例包應(yīng)用舉例 package Base; / 將該類存放在將該類存放在d:myjavaBase包中包中 public class Base int friend_data=1;/ 友元成員友元成員public int public_data=2;/ public成員成員private int private_data=3;/ private成員成員protected int protected_data=4; / protected成員成員 package Derived; / 將將Base類存放在類存放在Derived

15、包中包中import Base.*;/ 需要使用需要使用Base包中的類包中的類public class Derived extends Base Base a=new Base( ); public void dataUse( ) /System.out.println(data=+a.friend_data); System.out.println(data_pub=+a.public_data ); /System.out.println(“data_pri=”+a.private_data); /System.out.println(protected_data=+tecte

16、d_data); / testData.java文件的內(nèi)容如下:文件的內(nèi)容如下:import Derived.*; /需要使用需要使用Derived包中的類包中的類 / 該類位于工作目錄,不需要該類位于工作目錄,不需要package語(yǔ)句語(yǔ)句public class testData public static void main(String args ) Derived d=new Derived( );d.dataUse( ); 思考:思考: 在在dataUse( )方法中為什么不能輸出一個(gè)保護(hù)成方法中為什么不能輸出一個(gè)保護(hù)成員?是否與員?是否與4.16.4節(jié)講述的內(nèi)容相互矛盾?節(jié)講述的內(nèi)

17、容相互矛盾? 將將 System.out.println(protected_data=+tected_data); 修改為:修改為: System.out.println(protected_data=+tected_data); 23245.3 泛型泛型 泛型(泛型(Generics)是)是JDK5.0推出的特性。本推出的特性。本質(zhì)是類型參數(shù)化,可用在類、接口和方法的質(zhì)是類型參數(shù)化,可用在類、接口和方法的創(chuàng)建中,分別稱為泛型類、泛型接口和泛型創(chuàng)建中,分別稱為泛型類、泛型接口和泛型方法;方法; Java引入泛型的好處引入泛型的好處: 簡(jiǎn)單、安全;簡(jiǎn)單、安全; 主要目

18、的:建立具有類型安全的集合框架,主要目的:建立具有類型安全的集合框架,如鏈表、散列表等數(shù)據(jù)結(jié)構(gòu)。如鏈表、散列表等數(shù)據(jù)結(jié)構(gòu)。23255.3.1 泛型類的聲明泛型類的聲明 泛型類形式:類名泛型類形式:類名 。例。例5-3。public class over T over; public T getOver() return over; public void setOver(T over) this.over=over; public static void main(String args) / 生成一個(gè)生成一個(gè)Boolean類型的對(duì)象類型的對(duì)象 over obj1=new over( ); /

19、 生成一個(gè)生成一個(gè)Float類型的對(duì)象類型的對(duì)象 over obj2=new over( ); obj1.setOver(false); obj2.setOver(8.9f); Boolean b=obj1.getOver(); Float f=obj2.getOver(); System.out.println(b); System.out.println(f); 23275.3.2 泛型的一般應(yīng)用泛型的一般應(yīng)用 在定義泛型類時(shí),一般用在定義泛型類時(shí),一般用T來(lái)表達(dá)類型名,用來(lái)表達(dá)類型名,用E表表達(dá)容器的元素。達(dá)容器的元素。 定義泛型類時(shí)聲明多個(gè)類型定義泛型類時(shí)聲明多個(gè)類型 :public

20、class over2 其中其中T1,T2就是類型。應(yīng)用部分舉例:就是類型。應(yīng)用部分舉例:over2 = new over2 (); 定義泛型類時(shí)可以聲明數(shù)組。例定義泛型類時(shí)可以聲明數(shù)組。例5-4.public class arrayClass T array ; public void setArray(T array ) this.array=array; public T getArray( ) / 返回值是一個(gè)泛型類型的數(shù)組返回值是一個(gè)泛型類型的數(shù)組 return array; public static void main(String args) arrayClass a = ne

21、w arrayClass ( ); String names = You,Me,Him; a.setArray(names); for(int i=0;ia.getArray( ).length;i+) System.out.printf(%6s,a.getArray( )i); 23295.3.3 鏈表鏈表 java.util包提供的包提供的LinkedList 泛型類,創(chuàng)建泛型類,創(chuàng)建的對(duì)象是以鏈表的形式存儲(chǔ)數(shù)據(jù)。使用時(shí)必須指的對(duì)象是以鏈表的形式存儲(chǔ)數(shù)據(jù)。使用時(shí)必須指定定的具體類型。的具體類型。 創(chuàng)建一個(gè)元素類型為創(chuàng)建一個(gè)元素類型為String類型的空鏈表:類型的空鏈表:LinkedLis

22、t mylist = new LinkedList ( ) ; 例:例:5-5【例例5-5】采用迭代器遍歷鏈表和使用采用迭代器遍歷鏈表和使用List中的中的get方法對(duì)比。方法對(duì)比。import java.util.*;public class compareTime public static void main( String args) / 采用采用LinkedList泛型類定義一個(gè)泛型類定義一個(gè)list,節(jié)點(diǎn)為,節(jié)點(diǎn)為Integer類型類型 LinkedList list=new LinkedList( ); for(int i=0;i=50000;i+) / 向鏈表中增加向鏈表中增加

23、50000個(gè)數(shù)據(jù)個(gè)數(shù)據(jù) list.add(i); Iterator iter=list.iterator(); / 獲得鏈表的迭代器獲得鏈表的迭代器 long startTime=System.currentTimeMillis(); / 獲取遍歷開(kāi)始時(shí)間獲取遍歷開(kāi)始時(shí)間 while(iter.hasNext( ) / 采用迭代器遍歷鏈表采用迭代器遍歷鏈表Integer intNumber=iter.next(); / 獲取鏈表中的數(shù)據(jù)獲取鏈表中的數(shù)據(jù) long endTime = System.currentTimeMillis(); / 獲取遍歷結(jié)束時(shí)間獲取遍歷結(jié)束時(shí)間 long time

24、Consuming = endTime - startTime; System.out.println(迭代器遍歷鏈表的時(shí)間:迭代器遍歷鏈表的時(shí)間:+timeConsuming+ ms); startTime=System.currentTimeMillis(); for(int i=0;ilist.size();i+) / 采用采用get( )方法遍歷集合方法遍歷集合Integer intNumber=list.get(i); endTime=System.currentTimeMillis(); timeConsuming=endTime-startTime; System.out.pri

25、ntln(采用采用get方法遍歷鏈表的時(shí)間:方法遍歷鏈表的時(shí)間:+timeConsuming+ ms); 23325.3.4 棧棧 棧是一種先進(jìn)后出的數(shù)據(jù)結(jié)構(gòu),只能在一端進(jìn)行棧是一種先進(jìn)后出的數(shù)據(jù)結(jié)構(gòu),只能在一端進(jìn)行輸入或輸出。向棧中輸入稱為入棧,從棧中輸出輸入或輸出。向棧中輸入稱為入棧,從棧中輸出稱作出棧。稱作出棧。 可采用可采用java.util包中的包中的stack泛型類創(chuàng)建一個(gè)棧泛型類創(chuàng)建一個(gè)棧對(duì)象。對(duì)象。 例:例:5-6【例例5-6】采用棧計(jì)算采用棧計(jì)算Fibonacci序列的前序列的前5項(xiàng)項(xiàng) 。import java.util.*;public class stackTest pu

26、blic static void main(String args) / 定義一個(gè)空的棧對(duì)象定義一個(gè)空的棧對(duì)象s Stack s=new Stack(); s.push(0); / 第第1項(xiàng)是數(shù)據(jù)項(xiàng)是數(shù)據(jù)0,入棧,入棧 s.push(1); / 第第2項(xiàng)是數(shù)據(jù)項(xiàng)是數(shù)據(jù)1,入棧,入棧 for(int k=0; k5; k+) int f2 = s.pop() ; / 棧頂出棧棧頂出棧 int f1 = s.pop() ; / 下下1項(xiàng)出棧項(xiàng)出棧 int temp = f1 + f2; / 根據(jù)前根據(jù)前2項(xiàng)計(jì)算后一項(xiàng)項(xiàng)計(jì)算后一項(xiàng) s.push(f1); / 再入棧再入棧 f1 s.push(f2)

27、; / 再入棧再入棧 f2 s.push(temp); / 新值入棧新值入棧 while(!s.empty( ) / 如果棧不為空如果棧不為空 System.out.println(s); / 顯示棧中的數(shù)據(jù)顯示棧中的數(shù)據(jù) s.pop( ); / 將棧頂數(shù)據(jù)出棧將棧頂數(shù)據(jù)出棧 23355.3.5 散列映射散列映射 散列映射散列映射HashMap 泛型類對(duì)象采用散列表存儲(chǔ)數(shù)泛型類對(duì)象采用散列表存儲(chǔ)數(shù)據(jù)。散列映射存儲(chǔ)據(jù)。散列映射存儲(chǔ)“鍵鍵/值值”對(duì),允許將任意數(shù)量的對(duì),允許將任意數(shù)量的“鍵鍵/值值”對(duì)存儲(chǔ)在一起。鍵不能出現(xiàn)沖突,即不能有兩個(gè)數(shù)據(jù)項(xiàng)使對(duì)存儲(chǔ)在一起。鍵不能出現(xiàn)沖突,即不能有兩個(gè)數(shù)據(jù)項(xiàng)使用相同的鍵。如果出現(xiàn)兩個(gè)數(shù)據(jù)項(xiàng)使用相同的鍵,那么前用相同的鍵。如果出現(xiàn)兩個(gè)數(shù)據(jù)項(xiàng)使用相同的鍵,那么前一個(gè)鍵一個(gè)鍵/值值”對(duì)將被替換。對(duì)將被替換。 例:例:5-7 設(shè)計(jì)一個(gè)英語(yǔ)單詞查詢的簡(jiǎn)單程序,用戶輸入英文設(shè)計(jì)一個(gè)英語(yǔ)單詞查

溫馨提示

  • 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒(méi)有圖紙預(yù)覽就沒(méi)有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫(kù)網(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)論