(24)--7.1 接口面向对象程序设计.ppt
让IT教学更简单,让IT学习更有效让IT教学更简单,让IT学习更有效第七章 接口接口多态让IT教学更简单,让IT学习更有效 目录7.17.1接口7.27.2多态多态让IT教学更简单,让IT学习更有效概述本质上本质上接口接口是一种设计模式,它和继承还有着是一种设计模式,它和继承还有着一定的区别,在开发中它的使用更加频繁。作一定的区别,在开发中它的使用更加频繁。作为本章的另外一个重要内容,类型的转换机制为本章的另外一个重要内容,类型的转换机制也是需要认真领会的。也是需要认真领会的。让IT教学更简单,让IT学习更有效 7.1 接口接口接口接口在在Java语言中就是一组没有具体实现的方法的集合。任语言中就是一组没有具体实现的方法的集合。任何一个类都可以实现一个或多个接口所定义的方法。通过何一个类都可以实现一个或多个接口所定义的方法。通过使用接口,可以将功能说明从实现中分离出来,从而向访使用接口,可以将功能说明从实现中分离出来,从而向访问者隐蔽了类或子系统的具体实现。问者隐蔽了类或子系统的具体实现。下面是声明接口的语法:下面是声明接口的语法:public interface InterfaceName extends SuperInterface1,常量声明;type methodName1();type methodName2();让IT教学更简单,让IT学习更有效public interface Comparable int compareTo(T o);public interface BankService/为一个账户提供取款服务,返回最后取款额int withdraw(Account account,int amount);/为一个账户提供取款服务,返回最后存款额int deposit(Account account,int amount);/根据账户id,查询账户余额int findBalance(String id);让IT教学更简单,让IT学习更有效7.1.1实现接口实现接口注意一个类可以实现多个接口。由于接口中的方法都是抽象的,因此,除非实现接口的类本身是抽象的,否则接口中定义的抽象方法在非抽象类中都必须以一一具体实现,那怕某些方法该类并不需要。可以使用实现的接口类型作为该类实例的类型。public class ClassName extends SuperClass implements Interfaces 让IT教学更简单,让IT学习更有效一个实现接口的类/程序7-4:一个实现了Comparable接口的Account类import java.util.Arrays;public class Account implements Comparable /compareTo方法覆盖了来自接口的方法 Override public int compareTo(Object o)int result=0;/这里忽略了o的类型不是Account的情况 Account t=(Account)o;/利用字符串对象自身的compareTo()方法作为账户大小的比较 return pareTo(t.getId();让IT教学更简单,让IT学习更有效一个接口,声明它的访问范围为public,意味着可以被任何类所实现,如果采用缺省方式,则只有和接口同在一个包内的类所实现。每个类只可以有一个超类,但是一个接口却可以有多个父接口(用逗号分割),当然也可以没有。一个接口内部可以包括多个常量,供实现接口的类使用,常量的类型默认总是public static final,因此无须再显式定义。由于是常量,所以需要在定义的时候直接进行初始化。接口中的方法不能包含具体实现代码,那怕是空方法体,因此,接口中的方法声明没有,而且方法的默认访问属性就是public abstract。让IT教学更简单,让IT学习更有效7.1.2 用接口定义变量用接口定义变量虽然不能创建接口的实例,但是可以用接口作为变量的类型声明。如果一个对象用接口来声明类型的话,那么,通过对象名只能看到该对象类实现的对应接口的所有方法,其它属于自身的成员变量和方法都不可能被访问。当一个变量的类型是接口类型时,其引用的对象类型只要是实现了这个接口的类的对象都是允许的List accounts=null;accounts=new ArrayList();accounts=new LinkedList();让IT教学更简单,让IT学习更有效7.1.3 抽象类和接口抽象类和接口 简单来看,抽象类和接口都可以允许定义子类必须实现的方法。但实际上两者在语义和用途上有着很大的差别。从语法规定来看它们的区别很明显。Java支持一个类只能继承一个超类,但支持一个类实现多个接口;另外,接口中的方法仅是抽象方法的声明,而抽象类中可以包含方法的具体实现;最重要的,抽象类本身是一类型系统中的超类,而接口仅是抽象方法的集合。因此抽象类更多的用在描述问题的类的层次结构中,而接口更多的用在描述系统(或组件)所提供的公共服务中。让IT教学更简单,让IT学习更有效课堂练习按照要求完成以下作业:第一个类是图形类(Shape),含有一个成员变量color(字符串类型),一个没有参数的构造方法,以及一个有一个字符串类型参数的构造方法来初始化颜色变量,还有一个返回颜色变量值的成员方法show,以及一个没有具体实现的方法getArea,返回值为double;第二个类是圆形类(Circle)继承了图形类,自己又含有一个变量半径r,有一个有两个参数的构造方法,来初始化颜色和半径,成员方法show返回值格式为”r:?,color:?”;第三个类是矩形类(Rectangle)继承了图形类,自己又含有两个double变量长a和宽b,有一个有三个参数的构造方法,来初始化颜色、长和宽,成员方法show返回格式为”width:?,height:?,color:?”;第四个类是测试类(TestShape),分别定义圆形类和矩形类的实例对象,并用show方法来测试自己的定义。让IT教学更简单,让IT学习更有效课堂练习如果有两个类A、B(注意不是接口,两个类之间没有关系),你想同时使用这两个类的功能,那么你会如何编写这个C类呢?让IT教学更简单,让IT学习更有效课堂练习public class A public void a1()public void a2()public class B public void b1()public void b2()public class C private A a=new A();private B b=new B();public void a1()a.b1();public void a2()a.b2();public void b1()b.b1();public void b2()b.b2();让IT教学更简单,让IT学习更有效课堂练习问题:程序运行后的输出是什么?如果学号相同,则两个Student对象认为是同一个学生(即equal方法返回true),则Student类如何修改class Student String sid;public Student(String sid)this.sid=sid;public static void main(String args)Object o1=(Object)new Student(“200701”);Object o2=new Student(“200701”);Object o3=new Object();boolean r=(o1.equals(o2)?true:false);System.out.println(o1.equals(o2)+r);r=(o1=o2?true:false);System.out.println(o1=o2+r);r=(o1=o3?true:false);System.out.println(o1=o3+r);r=(o1.equals(o3)?true:false);System.out.println(o1.equals(o3)+r);让IT教学更简单,让IT学习更有效课堂练习分析程序的运行结果class C1 static int j=0;public void method(int a)j+;class Test extends C1 public int method()return j+;public void result()method(j);System.out.println(j+method();public static void main(String args)new Test().result();让IT教学更简单,让IT学习更有效课堂练习下面程序编译运行的结果是什么interface Action int i=10;void doAction()System.out.println(“do anything!”)class Happy implements Action public static void main(String args)Happy h=new Happy();int j;j=Action.i;j=Happy.i;j=h.i;