1、1/,第13讲 包和接口(三),上讲回顾,接口的定义和实现Collection接口抽象类及其应用类File 、String、 StringBuffer中常用方法掌握System类的常用方法会使用Math类的常用方法会使用Random类的常用方法,本讲教学目标,理解Vector类及其常用方法理解接口5、6、7章习题,Vector类,Vector类是Java语言提供的一种高级数据结构,可用于保存一系列对象。实际上,Java并不支持动态数组,Vector类提供了一种与动态数组相近的功能。如果不能事先确定要保存的对象的数目,或是需要方便获得某个对象的存放位置时,可以选择Vector类。,Vector
2、有3个 构 造方法:public Vector();public Vector(int initialCapacity);public Vector(int initialCapacity,int capacityIncrement); 第一个构造方法既不指定初始的存储容量,也不规定增长的增量,只是创建一个空的向量。 第二个构造方法创建一个具有initialCapacity个元素空间的向量,但没有指定增长的增量。 第三个构造方法在创建Vector对象时指定了初始的存储容量initialCapacity的向量,并且当向量需要增长以向里面追加元素时,一次性增加capacityIncrement个元
3、素。,Vector类的构造方法,public boolean add(Object obj)将对象obj添加到向量的末尾。public void add(int index,Object obj)将对象obj插入到向量的指定位置。public final synchronized void addElement(Object obj)将对象obj插入向量的尾部。对同一个向量对象,可在其中插入不同类的对象。注意插入的应是对象而不是数值,所以插入数值时要注意将数值转换成相应的对象。 setElementAt(Object obj, int index)将index处的对象替换成obj,原来的对象将
4、被覆盖。public void set(int index,Object obj)把指定位置处的元素用对象obj替换掉。,Vector类的常用方法,removeElement(Object obj)从向量中删除obj对象。若有存在多个obj对象,则删除第一个obj对象,同时将后面所有对象前移一位。removeAllElements()删除向量中所有的对象。public final synchronized void removeElementlAt(int index)删除index所指的对象,并将后面的所有对象前移一位。public final int indexOf(Object obj)
5、从向量头开始搜索obj ,返回所遇到的第一个obj对应的下标,若不存在此obj,返回-1。,Vector类的常用方法(续),public final int indexOf(Object obj,int index) 从指定位置查找对象obj在此向量中首次出现的位置。public final int lastIndexOf(Object obj)从向量尾部开始逆向搜索obj,返回对象obj最后一次出现的下标,若不存在此obj,返回-1。public int lastIndexOf(Object obj,int index)对象obj在位置index之前最后一次出现的位置。public Obje
6、ct firstElement()获取此向量的第一个元素。,Vector类的常用方法(续),public Object lastElement()获取此向量的最后一个元素。public Object get(int index)获取此向量指定位置处的元素。public Object remove(int index)从此向量中删除指定位置处的元素,并返回这个元素。public final int size()获取向量所含有的元素的个数。public int setSize(int size) 重新设置向量的大小,若原向量的大小比size大,则放弃后面的元素。public final synch
7、ronized Enumeration elements()获取一个枚举对象。,Vector类的常用方法(续),import java.util.Vector;import java.util.Enumeration;public class Ex7_12 public static void main(String args) Vector vector=new Vector(); Integer integer1=new Integer(1); vector.addElement(one);/加入的为字符串对象 vector.addElement(integer1); vector.add
8、Element(integer1);/加入的为Integer的对象 vector.addElement(two); vector.addElement(new Integer(2); vector.addElement(integer1); vector.addElement(integer1); System.out.println(The first vector is: +vector); vector.insertElementAt(three,2); vector.insertElementAt(new Float(3.14),3);,Vector类举例,在指定位置插入新对象,指定位
9、置后的对象依次往后顺延,System.out.println(The second vector is: +vector); vector.setElementAt(four,2); System.out.println(The third vector is: +vector); vector.removeElement(integer1); Enumeration enum=vector.elements();/枚举接口 System.out.print(The four vector is:); while(enum.hasMoreElements() System.out.print(
10、enum.nextElement()+ ); System.out.println(); System.out.println(The first position of object1:+vector.indexOf(integer1); System.out.println(The last position of object 1:+vector.lastIndexOf(integer1); vector.setSize(4); System.out.println(The new vectoris:+vector); ,Vector类举例(续),实例,接口可以象类一样实现多继承,请分析
11、下面的程序。,public class Ex7_13 public static void t(CanFight x) x.fight(); public static void u(CanSwim x) x.swim(); public static void v(CanFly x) x.fly(); public static void w(ActionCharacter x)x.fight();public static void main(String args) Hero h=new Hero(); t(h); u(h); v(h); w(h); ,package no12.ex7;
12、interface CanFight void fight();interface CanSwim void swim();interface CanFly void fly();class ActionCharacter public void fight() System.out.println(can fight!); class Hero extends ActionCharacter implements CanFight,CanSwim,CanFly public void swim() System.out.println(can swim); public void fly()
13、 System.out.println(can fly); ,理解接口,接口的语法规则很容易记住,但真正理解接口更重要。那为什么要用接口呢? 假如轿车、卡车、拖拉机、摩托车、客车都是机动车的子类,其中机动车是一个抽象类。如果机动车中有一个抽象方法 “收取费用”,那么所有的子类都要实现这个方法,即给出方法体,产生各自的收费行为。这显然不符合人们的思维方法,因为拖拉机可能不需要有”收取费用”的功能,而其他的一些类,比如飞机、轮船等可能也需要具体实现”收取费用”。,理解接口,接口可以增加很多类都需要实现的功能,不同的类可以使用相同的接口,同一个类也可以实现多个接口。接口只关心功能,并不关心功能的具体
14、实现,比如”客车类”实现一个接口,该接口中有一个”收取费用”的方法,那么这个”客车类”必须具体给出怎样收取费用的操作,即给出方法的方法体,不同车类都可以实现”收取费用”,但”收取费用”的手段可能不相同。接口的思想在于它可以增加很多类都需要实现的功能,使用相同的接口类不一定有继承关系,就象各式各样的商品,它们可能隶属不同的公司,工商部门要求都必须具有显示商标的功能。实现同一接口 ,但商标的具体制作由各个公司自己去实现。,再比如,你是一个项目主管,你需要管理许多部门,这些部门要开发一些软件所需要的类,你可能要求某个类实现一个接口,也就是说你对一些类是否具有这个功能非常关心,但不关心功能的具体体现,
15、比如这个功能是speakLove ,但你不关心是用汉语实现功能speakLove 或用英语实现speakLove。在某些时候,你也许打一个电话就可以了,告诉远方的一个开发部门实现你所规定的接口,并建议他们用汉语来实现speakLove。如果没有这个接口,你可能要化很多的口舌来让你的部门找到那个表达爱的方法,也许他们给表达爱的那个方法起的名字是完全不同的名字。,理解接口,接口使用,接口(interface)就是方法定义和常量值的集合。从本质上讲,接口是一种特殊的抽象类,这种抽象类中只包含常量和方法的定义,而没有方法的实现。 通过接口可以实现不相关类的相同行为,而不需要考虑这些类之间的层次关系。
16、通过接口可以指明多个类需要实现的方法。 通过接口可以了解对象的交互界面,而不需了解对象所对应的类。,接口实例 interface 收费 public void 收取费用(); class 公共汽车 implements 收费 public void 收取费用() System.out.println(公共汽车:一元/张,不计算公里数); class 出租车 implements 收费 public void 收取费用() System.out.println(出租车:1.60元/公里,起价3公里); ,class 电影院 implements 收费 public void 收取费用() Sys
17、tem.out.println(电影院:门票,十元/张); class Example4 public static void main(String args) 公共汽车 七路=new 公共汽车(); 出租车 天宇=new 出租车(); 电影院 红星=new 电影院(); 七路.收取费用();天宇.收取费用(); 红星.收取费用(); ,注:接口声明时,如果关键字interface 前面加上public 关键字,就称这样的接口是一个public 接口,public 接口可以被任何一个类使用。如果一个接口不加public 修饰,就称做友好接口类,友好接口可以被同一包中的类使用。接口回调是指可以
18、把实现某一接口的类创建的对象的引用赋给该接口声明的接口变量中。那么该接口变量就可以调用被类实现的接口中的方法。实际上,当接口变量调用被类实现的接口中的方法时,就是通知相应的对象调用接口的方法。,接口回调,接口回调示例,interface ShowMessage void 显示商标(String s); class TV implements ShowMessage public void 显示商标(String s) System.out.println(s); class PC implements ShowMessage public void 显示商标(String s) System.
19、out.println(s); ,接口回调示例,public class Example5 public static void main(String args) ShowMessage sm; sm=new TV(); sm.显示商标(长城牌电视机); sm=new PC(); sm.显示商标(联想奔月5008PC机); ,第7章小结,包是类和接口的集合,包可以嵌套。类用一个package语句定义所属的包。Import语句使包中定义的类和接口可以直接按名引用。包又分为用户自定义包和系统包。用户自定义包是由用户自己定义的,相当于文件系统中的文件夹,用来存放用户定义的类。接口是常量和抽象方法的
20、集合。接口是Java对多重继承的解决方法。类实现接口的方法是把该接口加入implements语句,并且实现接口及其父接口中的所有抽象方法。Java系统包中大量的类,如:File类、System类、以及Math类和Vector类。,第5章复习,以下程序的功能是,统计数组56,90,89,23,45,61,60,59中元素值小于60的个数,并输出。请将程序补充完整。注意:请勿改动程序已有内容,仅在?处填入适当的语句。public class Java1public static void main(String args) int score=56,90,89,23,45,61,60,59;int
21、 num=0;int len=score.?;int i=0;while(i?)if(?60)num+;?;System.out.println(60:+num);,第6章复习,仔细阅读程序,完成类Java1的定义,并将程序补充完整。注意:请勿改动程序已有内容,仅在?处填入适当的语句。public class Java1int num1;double num2; public Java1(?)num1=a;num2=b;public static void main(String args)int a=23;double b=4.5;Java1 ex=new Java1(a,b);System
22、.out.println(num1=+?);System.out.println(num2=+?);,第7章复习,1. 已知有一个接口A,如下:interface A int method1(int i); int method2(int j); 下列哪个类实现了接口A,并且该类不是抽象类?A、class B implement A int method1( ) int method2( ) B、class B int method1( int i) int method2( ) int j C、class B implement A int method1( int i) int method2( int j) D、class B extends A int method1( int i) int method2(int j ) ,2.下列有关接口的描述不正确的是_。A、接口是一种引用类型B、接口支持多继承C、接口中的方法都没有方法体D、一个接口可以继承其他接口的变量3.下列有关抽象类的描述不正确的是_。A、抽象类用abstract修饰词修饰B、抽象类中至少有一个抽象成员方法C、如果一个成员方法是抽象的则该类必须声明为抽象的D、抽象类都有构造方法,