Java简明教程第三四版课件-上课版5_第1页
Java简明教程第三四版课件-上课版5_第2页
Java简明教程第三四版课件-上课版5_第3页
Java简明教程第三四版课件-上课版5_第4页
Java简明教程第三四版课件-上课版5_第5页
已阅读5页,还剩33页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、231第第5章章 接口和包接口和包 本章主要讲述如下内容本章主要讲述如下内容 : 接口的定义和使用;接口的定义和使用; 接口与抽象类的异同点;接口与抽象类的异同点; 包的定义和使用;包的定义和使用; 泛型和应用。泛型和应用。 2325.1 接口接口 引入接口的原因:引入接口的原因:在程序设计中经常遇到这在程序设计中经常遇到这样一个问题:有些类互不相关,但却具有相样一个问题:有些类互不相关,但却具有相似的方法。并且这些方法在各个类中的实现似的方法。并且这些方法在各个类中的实现互不相同。我们不能为这些类定义一个共同互不相同。我们不能为这些类定义一个共同的父类,但又希望在程序中体现出它们共同的父类,

2、但又希望在程序中体现出它们共同的接口。的接口。 2335.1.1 接口的定义和应用接口的定义和应用 接口是一系列常量和空方法的集合,它提供接口是一系列常量和空方法的集合,它提供了多个类共同的方法,但不限制每个类如何了多个类共同的方法,但不限制每个类如何实现这些方法。实现这些方法。 JavaJava允许一个类同时实现多个接口,相当于允许一个类同时实现多个接口,相当于实现多继承的功能。实现多继承的功能。 2345.1.1 接口的定义和应用(续)接口的定义和应用(续) 声明一个接口的语法格式:声明一个接口的语法格式: public interface interfaceName extends su

3、per-interface-Listtype ConstantName=value;type MethodName( Parameter lists); 2355.1.1 接口的定义和应用(续)接口的定义和应用(续) 接口中不能声明任何变量和构造函数。接口中不能声明任何变量和构造函数。 如果一个类实现多个接口,应该在接口名之间如果一个类实现多个接口,应该在接口名之间用逗号隔开。用逗号隔开。 当一个类实现接口时,必须实现接口中给出的当一个类实现接口时,必须实现接口中给出的空方法,若实现接口的类是一个抽象类,可以空方法,若实现接口的类是一个抽象类,可以把实现接口的任务交给子类去实现。例如:把实现接

4、口的任务交给子类去实现。例如:/ / 程序程序5-15-1interface Sortable/ 定义一个接口定义一个接口 int Compare(Sortable s); class Sort / 定义一个排序类,仅有一个静态的方法定义一个排序类,仅有一个静态的方法 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 / 定义一个学生类定义一个学生类private int score;Student(int x)score=x; / 实现接口实现接口Sortable中的方法中的方法public int Compare(Sortable s) Student st=(Student)s; / 类型强制转换类型强制转换return score-st.score; public String toString( ) return score=+score; class Rectangle implements So

6、rtable / 矩形类也实现了接口矩形类也实现了接口private int length,width; Rectangle(int x,int y) length=x; width=y; int area( )return length*width;public int Compare(Sortable s) / 实现接口实现接口Rectangle rec=(Rectangle)s; / 类型强制转换类型强制转换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 接口的定义和应用(续)接口的定义和应用(续) 接口中定义的变量实际上是常量,必须给出接口中定义的变量实际上是常量,必须给出它们的初始值,实现接口的类可以自由引用它们的初始值,实现接口的类可以自由引用这些常量。例如:这些常量。例如: / 程序程序5-2的部分的部分interfac

9、e constant int EXCELLENT=5;int GOOD=4;int PASS=3;int FAIL=2; 23135.1.1 接口的定义和应用(续)接口的定义和应用(续) 在类中实现接口中方法时,方法的特征必须在类中实现接口中方法时,方法的特征必须和接口中声明的方法特征保持一致;和接口中声明的方法特征保持一致; 实现方法时必须在方法前加上实现方法时必须在方法前加上public; 若一个类没有对接口中的方法具体实现,那若一个类没有对接口中的方法具体实现,那么必须将该类声明为么必须将该类声明为abstract类。例如:类。例如: interface inter / 接口接口void

10、 methodA( ); abstract class Derived1 implements inter / 此处不需要写出此处不需要写出methodA( )的原型的原型 class Derived2 extends Derived1 public void methodA( ) / 实现方法实现方法System.out.println(Hi,methodA); 23155.1.2 接口和抽象类的异同点接口和抽象类的异同点 接口和抽象类的相同点:接口和抽象类的相同点: (1)都有空的方法,都必须在子类中实现这些方都有空的方法,都必须在子类中实现这些方法。法。 (2)都不能用都不能用new关键

11、字来创建这两种类型的对关键字来创建这两种类型的对象。象。 (3)都可以具有继承关系。都可以具有继承关系。 (4)接口和类一样可以具有接口和类一样可以具有public属性。属性。23165.1.2 接口和抽象类的异同点(续)接口和抽象类的异同点(续) 接口和抽象类的不同点:接口和抽象类的不同点: (1)在抽象类中,空的方法必须加在抽象类中,空的方法必须加abstract关键字,关键字,而在接口中不需要。而在接口中不需要。 (2)在抽象类中,除空的方法外,可以定义实例在抽象类中,除空的方法外,可以定义实例变量和非空的方法,而在接口中,只能定义常量变量和非空的方法,而在接口中,只能定义常量和空的方法

12、。和空的方法。 (3) (3)接口允许多继承,类仅支持单继承。接口允许多继承,类仅支持单继承。 23175.2 包包 在在Java中可以将自己写的类,按一定的方法中可以将自己写的类,按一定的方法归属于不同的子目录中(包)。归属于不同的子目录中(包)。 在缺省情况下,在缺省情况下,Java将所有的类归属一个缺将所有的类归属一个缺省包中。在不同的包中可以有同名的类存在。省包中。在不同的包中可以有同名的类存在。 Java中的包与中的包与C+中的名字空间相似。中的名字空间相似。 23185.2.1 package语句语句 package语句告诉编译器当前类属于哪个包。语句告诉编译器当前类属于哪个包。如

13、果没有如果没有package语句,类就存放在无名的语句,类就存放在无名的缺省包中(即当前目录中)。缺省包中(即当前目录中)。 引进包的概念主要是为了名字冲突。引进包的概念主要是为了名字冲突。 格式格式: package pkglpkg2pkg3;23195.2.2 import语句语句 import语句位于语句位于package语句之后,类的定义语句之后,类的定义之前之前 ; 格式:格式:import package1. .package2. .(class-name | *); 采用采用*号不影响程序的运行性能,但会影响编号不影响程序的运行性能,但会影响编译速度。指明具体类比引入整个包更为合

14、理。译速度。指明具体类比引入整个包更为合理。 23205.2.3 包应用举例包应用举例 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文件的内容如下:文件的内容如下:import Derived.*; /需要使用需要使用Derived包中的类包中的类 / 该类位于工作目录,不需要该类位于工作目录,不需要package语句语句public class testData public static void main(String args ) Derived d=new Derived( );d.dataUse( ); 思考:思考: 在在dataUse( )方法中为什么不能输出一个保护成方法中为什么不能输出一个保护成员?是否与员?是否与4.16.4节讲述的内容相互矛盾?节讲述的内

17、容相互矛盾? 将将 System.out.println(protected_data=+tected_data); 修改为:修改为: System.out.println(protected_data=+tected_data); 23245.3 泛型泛型 泛型(泛型(Generics)是)是JDK5.0推出的特性。本推出的特性。本质是类型参数化,可用在类、接口和方法的质是类型参数化,可用在类、接口和方法的创建中,分别称为泛型类、泛型接口和泛型创建中,分别称为泛型类、泛型接口和泛型方法;方法; Java引入泛型的好处引入泛型的好处: 简单、安全;简单、安全; 主要目

18、的:建立具有类型安全的集合框架,主要目的:建立具有类型安全的集合框架,如链表、散列表等数据结构。如链表、散列表等数据结构。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) / 生成一个生成一个Boolean类型的对象类型的对象 over obj1=new over( ); /

19、 生成一个生成一个Float类型的对象类型的对象 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 泛型的一般应用泛型的一般应用 在定义泛型类时,一般用在定义泛型类时,一般用T来表达类型名,用来表达类型名,用E表表达容器的元素。达容器的元素。 定义泛型类时声明多个类型定义泛型类时声明多个类型 :public

20、class over2 其中其中T1,T2就是类型。应用部分举例:就是类型。应用部分举例:over2 = new over2 (); 定义泛型类时可以声明数组。例定义泛型类时可以声明数组。例5-4.public class arrayClass T array ; public void setArray(T array ) this.array=array; public T getArray( ) / 返回值是一个泛型类型的数组返回值是一个泛型类型的数组 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 泛型类,创建泛型类,创建的对象是以链表的形式存储数据。使用时必须指的对象是以链表的形式存储数据。使用时必须指定定的具体类型。的具体类型。 创建一个元素类型为创建一个元素类型为String类型的空链表:类型的空链表:LinkedLis

22、t mylist = new LinkedList ( ) ; 例:例:5-5【例例5-5】采用迭代器遍历链表和使用采用迭代器遍历链表和使用List中的中的get方法对比。方法对比。import java.util.*;public class compareTime public static void main( String args) / 采用采用LinkedList泛型类定义一个泛型类定义一个list,节点为,节点为Integer类型类型 LinkedList list=new LinkedList( ); for(int i=0;i=50000;i+) / 向链表中增加向链表中增加

23、50000个数据个数据 list.add(i); Iterator iter=list.iterator(); / 获得链表的迭代器获得链表的迭代器 long startTime=System.currentTimeMillis(); / 获取遍历开始时间获取遍历开始时间 while(iter.hasNext( ) / 采用迭代器遍历链表采用迭代器遍历链表Integer intNumber=iter.next(); / 获取链表中的数据获取链表中的数据 long endTime = System.currentTimeMillis(); / 获取遍历结束时间获取遍历结束时间 long time

24、Consuming = endTime - startTime; System.out.println(迭代器遍历链表的时间:迭代器遍历链表的时间:+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方法遍历链表的时间:方法遍历链表的时间:+timeConsuming+ ms); 23325.3.4 栈栈 栈是一种先进后出的数据结构,只能在一端进行栈是一种先进后出的数据结构,只能在一端进行输入或输出。向栈中输入称为入栈,从栈中输出输入或输出。向栈中输入称为入栈,从栈中输出称作出栈。称作出栈。 可采用可采用java.util包中的包中的stack泛型类创建一个栈泛型类创建一个栈对象。对象。 例:例:5-6【例例5-6】采用栈计算采用栈计算Fibonacci序列的前序列的前5项项 。import java.util.*;public class stackTest pu

26、blic static void main(String args) / 定义一个空的栈对象定义一个空的栈对象s Stack s=new Stack(); s.push(0); / 第第1项是数据项是数据0,入栈,入栈 s.push(1); / 第第2项是数据项是数据1,入栈,入栈 for(int k=0; k5; k+) int f2 = s.pop() ; / 栈顶出栈栈顶出栈 int f1 = s.pop() ; / 下下1项出栈项出栈 int temp = f1 + f2; / 根据前根据前2项计算后一项项计算后一项 s.push(f1); / 再入栈再入栈 f1 s.push(f2)

27、; / 再入栈再入栈 f2 s.push(temp); / 新值入栈新值入栈 while(!s.empty( ) / 如果栈不为空如果栈不为空 System.out.println(s); / 显示栈中的数据显示栈中的数据 s.pop( ); / 将栈顶数据出栈将栈顶数据出栈 23355.3.5 散列映射散列映射 散列映射散列映射HashMap 泛型类对象采用散列表存储数泛型类对象采用散列表存储数据。散列映射存储据。散列映射存储“键键/值值”对,允许将任意数量的对,允许将任意数量的“键键/值值”对存储在一起。键不能出现冲突,即不能有两个数据项使对存储在一起。键不能出现冲突,即不能有两个数据项使用相同的键。如果出现两个数据项使用相同的键,那么前用相同的键。如果出现两个数据项使用相同的键,那么前一个键一个键/值值”对将被替换。对将被替换。 例:例:5-7 设计一个英语单词查询的简单程序,用户输入英文设计一个英语单词查

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论