《java接口的基本概念.ppt》由会员分享,可在线阅读,更多相关《java接口的基本概念.ppt(85页珍藏版)》请在taowenge.com淘文阁网|工程机械CAD图纸|机械工程制图|CAD装配图下载|SolidWorks_CaTia_CAD_UG_PROE_设计图分享下载上搜索。
1、第6章:面向对象(高级)接口的基本概念软件学院教学研发部软件学院教学研发部本章目标o掌握接口的定义格式及使用o掌握接口与抽象类的关系接口o接口是java中最重要的概念,接口可以理解为一种特殊的类,里面全部是由全局常量和公共的抽象方法所组成。接口的定义格式 interface 接口名称全局常量;抽象方法;接口的定义o完整格式:o简化格式:interface AString AUTHOR=“张三;/等价于:public static final String AUTHOR=李兴华;void print();/等价于:public abstract void print();String getIn
2、fo();/等价于:public abstract String getInfo();interface Apublic static final String AUTHOR=“张三;/定义全局常量public abstract void print();/定义抽象方法public abstract String getInfo();/定义抽象方法接口图形表示 o接口的图形可以按照类图的形式表示,也可以使用一个“”表示A实现接口 o与抽象类一样,接口要使用也必须通过子类,子类通过implements关键字实现接口。o实现格式:nclass 子类 implements 接口A,接口B,.实现接口
3、 interface A/定义接口Apublic String AUTHOR=李华;/定义全局常量public void print();/定义抽象方法public String getInfo();/定义抽象方法interface B/定义接口Bpublic void say();/定义抽象方法class X implements A,B/子类同时实现两个接口public void say()/覆写B接口中的抽象方法System.out.println(Hello World!);public String getInfo()/覆写A接口中的抽象方法return HELLO;public v
4、oid print()/覆写A接口中的抽象方法System.out.println(作者:+AUTHOR);接口的实现 o以上的程序中,一个子类同时实现了两个接口,这样在子类中就必须同时覆写完两个接口中的全部抽象方法 继承抽象类实现接口 o一个子类可以同时继承抽象类和实现接口。o格式如下:nclass 子类 extends 抽象类 implements 接口A,接口B,.子类同时继承抽象类和实现接口 interface A/定义接口Apublic String AUTHOR=李兴华;/定义全局常量public void print();/定义抽象方法public String getInfo(
5、);/定义抽象方法abstract class B/定义抽象类 Bpublic abstract void say();class X extends B implements A/子类同时实现接口public void say()/覆写抽象类B中的抽象方法System.out.println(Hello World!);public String getInfo()/覆写接口A中的抽象方法return HELLO;public void print()/覆写接口A中的抽象方法System.out.println(作者:+AUTHOR);接口和抽象类的使用限制o在java中允许一个抽象类实现多
6、个接口的 interface A/定义接口Apublic String AUTHOR=李兴华;/定义全局常量public void print();/定义抽象方法public String getInfo();/定义抽象方法abstract class B implements A/定义抽象类,实现接口public abstract void say();/此时抽象类中存在三个抽象方法class X extends B/子类继承抽象类public void say()/覆写抽象类B中的抽象方法System.out.println(Hello World!);public String getI
7、nfo()/覆写抽象类B中的抽象方法return HELLO;public void print()/覆写抽象类B中的抽象方法System.out.println(作者:+AUTHOR);接口的继承 o一个接口不能继承一个抽象类,但是却可以通过extends关键字同时继承多个接口,实现接口的多继承。o格式:ninterface 子接口 extends 父接口A,父接口B,.接口的多继承 interface A/定义接口Apublic String AUTHOR=李兴华;/定义全局常量public void printA();/定义抽象方法interface B/定义接口Bpublic void
8、 printB();/定义抽象方法interface C extends A,B/定义接口C,同时继承接口A、Bpublic void printC();/定义抽象方法class X implements C/子类实现接口Cpublic void printA()/覆写接口A中的printA()方法System.out.println(A、Hello World);public void printB()/覆写接口B中的printB()方法System.out.println(B、Hello MLDN);public void printC()/覆写接口C中的printC()方法System.
9、out.println(C、Hello LXH);下一章内容对象的多象的多态性性第6章:面向对象(高级)对象的多态性软件学院教学研发部软件学院教学研发部本章目标o掌握对象的向上转型及向下转型的使用o掌握对象转型的限制多态性o多态性在面向对象中中是一个最重要的概念,在java中面向对象主要有以下两种主要体现:n方法的重载与覆写 n对象的多态性 对象的多态性 o对象的多态性主要分为以下两种类型:n向上转型:子类对象 父类对象 o对于向上转型,程序会自动完成,格式:n对象向上转型:对象向上转型:父类 父类对象=子类实例;n向下转型:父类对象 子类对象o对于向下转型时,必须明确的指明要转型的子类类型,
10、格式:n对象向下转型:对象向下转型:子类 子类对象=(子类)父类实例;对象的向上转型 class A/定义类Apublic void fun1()/定义fun1()方法System.out.println(A-public void fun1();public void fun2()/定义fun2()方法this.fun1();class B extends A/子类通过extends继承父类public void fun1()/覆写父类中的fun1()方法System.out.println(B-public void fun1();public void fun3()/子类自己定义的方法S
11、ystem.out.println(B-public void fun3();public class PolDemo01 public static void main(String args)B b=new B();/定义子类实例化对象A a=b;/发生了向上转型的关系,子类-父类a.fun1();/此方法被子类覆写过对象的向下转型 class A/定义类Apublic void fun1()/定义fun1()方法System.out.println(A-public void fun1();public void fun2()/定义fun2()方法this.fun1();class B
12、extends A/子类通过extends继承父类public void fun1()/覆写父类中的fun1()方法System.out.println(B-public void fun1();public void fun3()/子类自己定义的方法System.out.println(B-public void fun3();public class PolDemo02 public static void main(String args)A a=new B();/发生了向上转型的关系,子类-父类B b=(B)a;/此时发生了向下转型关系b.fun1();/调用方法被覆写的方法 b.fu
13、n2();/调用父类的方法b.fun3();/调用子类自己定义的方法注意:对象向下转型的要求 o在以上的程序中读者已经了解了对象的向上和向下转型的基本概念,但是必须提醒读者的是,在进行对象的向下转型之前,必须首先发生对象向上转型才可以,否则将出现对象转换异常 错误的转型 class A/定义类Apublic void fun1()/定义fun1()方法System.out.println(A-public void fun1();public void fun2()/定义fun2()方法this.fun1();class B extends A/子类通过extends继承父类public vo
14、id fun1()/覆写父类中的fun1()方法System.out.println(B-public void fun1();public void fun3()/子类自己定义的方法System.out.println(B-public void fun3();public class PolDemo03 public static void main(String args)A a=new A();/此时声明的是父类对象B b=(B)a;/此时发生了向下转型关系b.fun1();/调用方法被覆写的方法 b.fun2();/调用父类的方法b.fun3();/调用子类自己定义的方法对象多态性的
15、作用o现在有以下要求:n设计一个方法,要求此方法可以接收A类的任意子类对象,并调用方法 下一章内容instanceof 关关键字字第6章:面向对象(高级)抽象类与接口的应用软件学院教学研发部软件学院教学研发部本章目标o掌握抽象类及接口的实例化操作o掌握模板设计的作用o掌握工厂设计模式的作用o掌握代理设计模式的作用o掌握适配器设计模式的作用o掌握抽象类与接口的使用区别为抽象类与接口实例化 o在Java中可以通过对象的多态性,为抽象类和接口实例化,这样再使用抽象类和接口的时候就可以调用本子类中所覆写过的方法了。为抽象类实例化 abstract class A/定义抽象类Apublic abstra
16、ct void print();/定义抽象方法print();class B extends A/子类通过继承抽象类public void print()System.out.println(Hello World!);public class AbstractCaseDemo01 public static void main(String args)A a=new B();/通过子类为抽象类实例化a.print();/调用的方法是被子类覆写过的方法为接口实例化 interface Apublic abstract void print();class B implements A/子类实现
17、接口public void print()System.out.println(Hello World!);public class InterfaceCaseDemo01 public static void main(String args)A a=new B();/通过子类为接口实例化a.print();/调用的方法是被子类覆写过的方法为什么抽象类和接口不能实例化?o因为,抽象类和接口内部有抽象方法,抽象方法是没有实现的方法。无法调用。o通过对象的多态性可以发现,子类发生了向上转型之后,所有的全部的方法都是被复写过的方法。抽象类的实际应用 模板设计 o来看下面的这样一种场景:“假设人分为
18、学生和工人,学生和工人都可以说话,但是学生和工人说话的内容是不一样的,也就是说说话这个功能应该是一个具体功能,而说话的内容就要由学生或工人来决定了”,所以此时就可以使用抽象类实现这种场景 代码实现 Personabstract class Person/定义抽象类Personprivate String name;/定义name属性private int age;/定义age属性public Person(String name,int age)/为属性初始化this.name=name;/为name属性赋值this.age=age;/为age属性赋值public String getName
19、()/取得name属性内容return name;public int getAge()/取得age属性内容return age;public void say()/说话是具体功能,要定义成普通方法System.out.println(this.getContent();public abstract String getContent();/说话的内容由子类决定代码实现 Studentclass Student extends Person/定义Student类继承Person类private float score;public Student(String name,int age,fl
20、oat score)super(name,age);/调用父类的构造方法this.score=score;public String getContent()/覆写父类中的抽象方法return 学生信息-姓名:+super.getName()+;年龄:+super.getAge()+;成绩:+this.score;代码实现 Workerclass Worker extends Person/定义Worker类继承Person类private float salary;public Worker(String name,int age,float salary)super(name,age);/
21、调用父类的构造方法this.salary=salary;public String getContent()/覆写父类中的抽象方法return 工人信息-姓名:+super.getName()+;年龄:+super.getAge()+;工资:+this.salary;提示:现实生活中的模板 o对于以上的操作代码,如果读者不是很理解的话,那么可以看一下以下的说明,小的时候有些读者因为淘气可能会填写过如下的登记表:违纪违纪卡卡姓名:姓名:班班级级:日期:日期:事由:事由:违纪违纪卡卡姓名:姓名:李兴华班班级级:MLDN JAVA学习班日期:日期:2011年11月11日 星期二事由:事由:上课睡觉接
22、口的实际应用 制定标准 o接口在实际中更多的作用是用来制订标准的。比如说:“U盘和打印机都可以插在电脑上使用,这是因为它们都实现了USB的接口,对于电脑来说,只要是符合了USB接口标准的设备就都可以插进来 制订USB标准 interface USB/定义USB接口public void start();/USB设备开始工作public void stop();/USB设备结束工作class Computerpublic static void plugin(USB usb)/只要是USB的设备就都可以向此地方插入usb.start();/让USB设备开始工作System.out.println
23、(=USB 设备工作=);usb.stop();/让USB设备停止工作;class Flash implements USB/U盘public void start()/覆写start()方法System.out.println(U盘开始工作。);public void stop()/覆写stop()方法System.out.println(U盘停止工作。);class Print implements USB/打印机public void start()/覆写start()方法System.out.println(打印机开始工作。);public void stop()/覆写stop()方法
24、System.out.println(打印机停止工作。);设计模式 工厂设计 o工厂设计,是Java开发中使用的最多的一种设计模式,那么什么叫工厂设计,以及工厂设计有那些作用呢?在说明问题前,请读者先观察以下的程序。观察程序中的问题 interface Fruit/定义一个水果的接口public void eat();/吃水果的方法class Apple implements Fruit/定义子类 Applepublic void eat()System.out.println(*吃苹果。);class Orange implements Fruit/定义子类 Orangepublic voi
25、d eat()/覆写eat()方法System.out.println(*吃橘子。);public class InterfaceCaseDemo03 public static void main(String args)Fruit f=new Apple();/实例化接口f.eat();/调用方法问题的解决工厂设计模式 class Factory/定义工厂类public static Fruit getInstance(String className)Fruit f=null;/定义接口对象if(apple.equals(className)/判断是那个子类的标记f=new Apple(
26、);/通过Apple类实例化接口if(orange.equals(className)/判断是那个子类的标记f=new Orange();/通过Orange类实例化接口return f;工厂类的操作流程 设计模式 代理设计 o代理设计也是在java开发中使用较多的一种设计模式,所谓的代理设计就是指一个代理主题来操作真实主题,真实主题执行具体的业务操作,而代理主题负责其他相关业务的处理,就好比在生活中经常使用到的代理上网那样,客户通过网络代理连接网络,由代理服务器完成用户权限,访问限制等与上网操作相关的操作。分析结果o不管是代理操作也好,真实的操作也好,其共同的目的就是一个上网,所以用户关心的只
27、是如何上网,至于里面是如何操作的用户并不关心 代理操作 interface Network/定义Network接口public void browse();/定义浏览的抽象方法class Real implements Network/真实的上网操作public void browse()/覆写抽象方法System.out.println(上网浏览信息);class Proxy implements Network/代理上网private Network network;public Proxy(Network network)/设置代理的真实操作work=network;/设置代理的子类pu
28、blic void check()/与具体上网相关的操作System.out.println(检查用户是否合法);public void browse()this.check();/可以同时调用多个与具体业务相关的操作work.browse();/调用真实上网操作代理操作流程设计模式 适配器设计 o对于Java程序来说,如果一个类要实现一个接口,则肯定要覆写此接口中的全部抽象方法,那么如果,此时一个接口中定义的抽象方法过多,但是在子类中又用不到这么多抽象方法的话,则肯定很麻烦,所以此时就需要一个中间的过渡,但是此过渡类又不希望被直接使用,所以将此过渡类定义成抽象类最合适,即一个接口首先被一个抽
29、象类(此抽象类通常称为适配器类),并在此抽象类中实现若干方法(方法体为空),则以后的子类直接继承此抽象类,就可以有选择的覆写所需要的方法。适配器设计实现 interface Window/定义window接口,表示窗口操作public void open();/窗口打开public void close();/窗口关闭public void activated();/窗口活动public void iconified();/窗口最小化public void deiconified();/窗口恢复大小/定义抽象类实现接口,在此类中覆写方法,但是所有的方法体为空abstract class Win
30、dowAdapter implements Window public void activated()/覆写activated()方法,方法体为空public void close()/覆写close()方法,方法体为空public void deiconified()/覆写deiconified()方法,方法体为空public void iconified()/覆写iconified()方法,方法体为空public void open()/覆写open()方法,方法体为空/子类直接继承WindowAdapter类,有选择的实现需要的方法class WindowImpl extends Wi
31、ndowAdapterpublic void open()/真正实现open()方法System.out.println(窗口打开。);public void close()/真正实现close()方法System.out.println(窗口关闭。);内部类的扩展 o在之前面向对象的基础部分,曾经为读者讲解过内部类的概念,实际上在一个抽象类中也可以定义多个接口或抽象类,在一个接口中也可以定义多个抽象类或接口。在一个抽象类中包含接口 abstract class A/定义接口Apublic abstract void printA();/定义抽象方法interface B/定义内部接口publ
32、ic void printB();/定义抽象方法;class X extends A/继承抽象类public void printA()/实现抽象方法System.out.println(HELLO-A);class Y implements B/定义内部类实现内部接口public void printB()/实现内部接口的抽象方法System.out.println(HELLO-B);public class InnerExtDemo01 public static void main(String args)A.B b=new X().new Y();/实例化内部接口对象b.printB(
33、);/调用内部接口的抽象方法在一个接口中包含抽象类 interface A/定义接口public abstract void printA();/定义抽象方法abstract class B/定义内部抽象类public abstract void printB();/定义抽象方法;class X implements Apublic void printA()/实现接口的抽象方法System.out.println(HELLO-A);class Y extends B/在接口实现类中定义内部类public void printB()/实现内部抽象类的抽象方法System.out.println
34、(HELLO-B);public class InnerExtDemo02 public static void main(String args)A.B b=new X().new Y();/实例化内部接口对象b.printB();/调用内部抽象类的方法抽象类与接口之间的关系 No.区区别别点点抽象抽象类类接口接口1定义包含一个抽象方法的类抽象方法和全局常量的集合2组成构造方法、抽象方法、普通方法、常量、变量常量、抽象方法3使用子类继承抽象类(extends)子类实现接口(implements)4关系抽象类可以实现多个接口接口不能继承抽象类,但允许继承多个接口5常见设计模式模板设计工厂设计、
35、代理设计6对象都通过对象的多态性产生实例化对象7局限抽象类有单继承的局限接口没有此局限8实际作为一个模板是作为一个标准或是表示一种能力9选择如果抽象类和接口都可以使用的话,优先使用接口,因为避免单继承的局限10特殊一个抽象类中可以包含多个接口,一个接口中可以包含多个抽象类下一章内容实例分析:例分析:宠物商店物商店第6章:面向对象(高级)实例分析:宠物商店软件学院教学研发部软件学院教学研发部实例要求o实现一个宠物商店,在宠物商店中可以有多种(由用户决定数量)宠物,试表示出此种关系,并要求可以根据宠物的关键字查找到相应的宠物信息。所需要的宠物信息自行设计。分析o1、本要求中提示宠物的信息可以自行设
36、计,所以此时简单设计出三个属性:名字、颜色、年龄。o2、宠物的类别很多,例如:猫、狗等都属于宠物,所以宠物应该是一个标准。o3、在宠物商店中,只要是符合了此宠物标准的就都应该可以放进宠物商店之中。o4、宠物商店中要保存多种宠物,则肯定应该是一个宠物的对象数组,宠物的个数由用户决定的话,则应该在创建宠物商店的时候,就已经分配好宠物的个数。类图宠物接口 Pet.java interface Pet public String getName();/得到宠物的名字public String getColor();/得到宠物的颜色public int getAge();/得到宠物的年龄宠物猫 Cat.
37、java class Cat implements Pet private String name;/宠物名字private String color;/宠物颜色private int age;/宠物年龄public Cat(String name,String color,int age)/通过构造设置属性this.setName(name);this.setColor(color);this.setAge(age);/setter、getter;宠物狗 Dog.java class Dog implements Pet private String name;/宠物名字private St
38、ring color;/宠物颜色private int age;/宠物年龄public Dog(String name,String color,int age)/通过构造设置属性this.name=name;this.color=color;this.age=age;/setter、getter;宠物商店 PetShop.java(增加宠物)class PetShop private Pet pets;/保存多个属性private int foot;/数据的保存位置public PetShop(int len)/构造方法开辟宠物数组的大小if(len0)/判断长度是否大于0this.pets
39、=new Petlen;/为对象数组开辟空间elsethis.pets=new Petlen;/至少开辟一个空间public boolean add(Pet pet)/增加宠物if(foot this.pets.length)/判断宠物商店里的宠物是否已经满了this.petsfoot=pet;/增加宠物foot+;/修改保存位置return true;/增加成功 else return false;/增加失败;宠物商店 PetShop.java(查询)class PetShop public Pet search(String keyWord)/关键字查找Pet p=null;/此为查找之后
40、的结果,此处的大小不是固定的int count=0;/记录下多少个宠物符合查询结果/确认开辟的空间大小,看有多少个宠物符合查询条件for(int i=0;i this.pets.length;i+)if(this.petsi!=null)/判断对象数组中的内容是否为空if(this.petsi.getName().indexOf(keyWord)!=-1|this.petsi.getColor().indexOf(keyWord)!=-1)count+;/统计符合条件的宠物个数p=new Petcount;/根据已经确定的记录数,开辟对象数组int f=0;/设置增加的位置标记for(int
41、i=0;i this.pets.length;i+)if(this.petsi!=null)if(this.petsi.getName().indexOf(keyWord)!=-1|this.petsi.getColor().indexOf(keyWord)!=-1)pf=this.petsi;/将符合查询条件的宠物信息保存f+;return p;测试宠物商店 PetShopDemo.java public class PetShopDemo public static void main(String args)PetShop ps=new PetShop(5);/五个宠物ps.add(ne
42、w Cat(白猫,白色的,2);/增加宠物,成功ps.add(new Cat(黑猫,黑色的,3);/增加宠物,成功ps.add(new Cat(花猫,花色的,3);/增加宠物,成功ps.add(new Dog(拉布拉多,黄色的,3);/增加宠物,成功ps.add(new Dog(“金毛”,“金色的,3);/增加宠物,成功ps.add(new Dog(黄狗,黑色的,3);/增加宠物,失败print(ps.search(黑);public static void print(Pet p)/输出操作for(int i=0;i p.length;i+)/循环输出if(pi!=null)System.o
43、ut.println(pi.getName()+,+pi.getColor()+,+pi.getAge();下一章内容Object类第6章:面向对象(高级)包装类软件教学研发部软件教学研发部本章目标o掌握包装类的作用o掌握包装类的自动装箱及自动拆箱的操作o掌握包装类的转换操作包装类介绍 o在Java的设计中提倡一种思想:“一切皆对象”,那么这样一来就出现了一个矛盾,从数据类型的划分中可以知道JAVA中的数据类型分为基本数据类型和引用数据类型,但是基本数据类型怎么能够称为对象呢?此时,就需要将基本数据类型进行包装,将八种基本类型变为一个类的形式,那么这也就是包装类的作用。包装类 No.基本数据基
44、本数据类类型型包装包装类类1intInteger2charCharacter3shortShort4longLong5floatFloat6doubleDouble7booleanBoolean8byteByte包装类的说明o在以上所列的类中,除了Integer和Character定义的名称与基本类型定义的名称相差较大,其他的六种类型的名称都是很好掌握的。而且读者可以从JDK文档中发现包装类中的继承关系:n Integer、Byte、Float、Double、Short、Long都属于Number类的子类,Number类本身提供了一系列的返回以上六种基本数据类型的操作。nCharacter属于
45、Object的直接子类。nBoolean属于Object的直接子类。Number类的定义o那么Number类是一个抽象类,主要是将数字包装类中内容变为基本数据类型,主要操作方法如下。No.方法方法类类型型描述描述1public byte byteValue()普通以byte形式返回指定的数值。2public abstract double doubleValue()普通以 double形式返回指定的数值3public abstract float floatValue()普通以float形式返回指定的数值。4public abstract int intValue()普通以int形式返回指定的
46、数值。5public abstract long longValue()普通以long形式返回指定的数值。6public short shortValue()普通以short形式返回指定的数值。装箱与拆箱(Integer、Float为例)o装箱:n将一个基本数据类型变为包装类,这样的过程称为装箱操作 o拆箱:n将一个包装类变为基本数据类型这样的过程称为拆箱操作 装箱及拆箱操作 public class WrapperDemo01 public static void main(String args)int x=30;/声明一个基本数据类型Integer i=new Integer(x);/装
47、箱:将基本数据类型变为包装类int temp=i.intValue();/拆箱:将一个包装类变为基本数据类型public class WrapperDemo02 public static void main(String args)float f=30.3f;/声明一个基本数据类型Float x=new Float(f);/装箱:将基本数据类型变为包装类float y=x.floatValue();/拆箱:将一个包装类变为基本数据类型自动装箱及拆箱操作 o在JDK 1.5之后提供了自动的装箱及拆箱操作 public class WrapperDemo03 public static void
48、 main(String args)Integer i=30;/自动装箱成IntegerFloat f=30.3f;/自动装箱成Floatint x=i;/自动拆箱为intfloat y=f;/自动拆箱为float包装类应用(Integer、Float为例)o包装类在实际中用得最多的还在于字符串变为基本数据类型的操作上,例如:将一个全由数字组成的字符串变为一个int或float类型的数据。在Integer和Float类中分别提供了以下的两种方法:nA、Integer类(字符串转int型)opublic static int parseInt(String s)throws NumberForm
49、atExceptionnB、Float类(字符串转float型)opublic static float parseFloat(String s)throws NumberFormatException字符串变为基本数据类型 public class WrapperDemo04 public static void main(String args)String str1=30;/由数字组成的字符串String str2=30.3;/由数字组成的字符串int x=Integer.parseInt(str1);/将字符串变为int型float f=Float.parseFloat(str2);/
50、将字符串变为float型System.out.println(整数乘方:+x+*+x+=+(x*x);System.out.println(小数乘方:+f+*+f+=+(f*f);下一章内容匿名内部匿名内部类第6章:面向对象(高级)匿名内部类软件教学研发部软件教学研发部本章目标o掌握匿名内部类的作用o掌握匿名内部类的定义格式一个简单的操作 interface A/定义接口Apublic void printInfo();/定义抽象方法class B implements A/定义接口实现类public void printInfo()/覆写抽象方法System.out.println(Hell