CH_4_Java面向对象的程序设计3_第1页
CH_4_Java面向对象的程序设计3_第2页
CH_4_Java面向对象的程序设计3_第3页
CH_4_Java面向对象的程序设计3_第4页
CH_4_Java面向对象的程序设计3_第5页
已阅读5页,还剩28页未读 继续免费阅读

下载本文档

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

文档简介

1、public class public class 第第0 x040 x04讲讲 extends extends Java 语言与网络编程语言与网络编程 4.7 接口接口 4.7.1 接口的概念接口的概念 4.7.2 接口的说明接口的说明 4.7.3 接口的使用接口的使用 4.7.4 对接口的引用对接口的引用 4.7.5 使用接口实现多重继承使用接口实现多重继承 4.7.6 抽象类和接口的选择抽象类和接口的选择 4.7.7 多态多态 2021-7-11 中国矿业大学计算机科学与技术学院 2 4.7.1 接口的概念接口的概念 接口接口定义了一些定义了一些没有实现的方法没有实现的方法和和静态常量集

2、静态常量集,在,在Java中中 起起着着重要重要的的作用作用: 1. 使程序设计和实现相互分离使程序设计和实现相互分离 单单继承的继承树中,继承的继承树中,设计和实现设计和实现不可避免地要纠缠在一起不可避免地要纠缠在一起。设计时,。设计时, 也许也许只想只想提供提供抽象抽象的接口的接口,而不希望去具体,而不希望去具体实现实现 2. 弥补单继承弥补单继承的不足的不足 Java只支持单继承,不能交叉继承树的其它分支中有用的部分。只支持单继承,不能交叉继承树的其它分支中有用的部分。这这 给给面向对象的程序设计带来了困难面向对象的程序设计带来了困难 3. 约束实现接口的类约束实现接口的类 约束实现了接

3、口的类必须满足的要求约束实现了接口的类必须满足的要求 定义接口时,实际上是编写一个契约,用来描述定义接口时,实际上是编写一个契约,用来描述实现它的实现它的类能够做类能够做 什么,能够充当什么角色,具体怎么做和接口无关什么,能够充当什么角色,具体怎么做和接口无关 2021-7-11 中国矿业大学计算机科学与技术学院 3 4.7.1 接口的概念接口的概念 接口和类的区别:接口和类的区别: I. I.类只能单继承,而类只能单继承,而接口可以多继承接口可以多继承 II.II. 类中的方法可以是具体的,也可以抽象的。类中的方法可以是具体的,也可以抽象的。 接口中的方法都是抽象接口中的方法都是抽象的的 I

4、II.III. 接口中的方法要用类来实现,接口中的方法要用类来实现,一个类可以一个类可以 实现多个实现多个接口接口 2021-7-11 中国矿业大学计算机科学与技术学院 4 注意:注意: 接口反映了对象较高层次的抽象,接口反映了对象较高层次的抽象,为描述相互似乎没有关系的对为描述相互似乎没有关系的对 象的共性提供了一种有效的手段象的共性提供了一种有效的手段 4.7.2 接口接口的说明的说明 修饰符修饰符 interface 接口接口名名 extends 接口列表接口列表 接口体接口体 1 1、首部、首部 修饰符修饰符: 不不使用修饰符(同包访问使用修饰符(同包访问) public(任意访问)(

5、任意访问) extends: 定义父接口,支持多重继承定义父接口,支持多重继承 public interface Cookable extends Foodable, Printable 2021-7-11 中国矿业大学计算机科学与技术学院 5 4.7.2 接口接口的说明的说明 2 2、接口体:定义常量和抽象方法、接口体:定义常量和抽象方法 接口接口interface Countable 的的定义定义 interface Countable final int MALMUM=50; void incrementCount(); void decrementCount(); int curren

6、tCount(); int setcount(int newcount); 2021-7-11 中国矿业大学计算机科学与技术学院 6 2 2、接口体:定义常量和、接口体:定义常量和抽象方法抽象方法 接口接口中的成员变量:都是隐含中的成员变量:都是隐含public、static、final 的的静态最终变量(常量静态最终变量(常量) 例如例如,接口中的代码,接口中的代码: int STEP=5; 等同等同于:于: public static final int STEP=5; 2021-7-11 中国矿业大学计算机科学与技术学院 7 2 2、接口体:定义常量和抽象方法、接口体:定义常量和抽象方法

7、 接口中的接口中的方法都是方法都是抽象方法抽象方法,所有方法隐含,所有方法隐含public和和 abstract int increment(int x); 等价等价于于 public abstract int increment(int x); 注意注意接口接口中的方法不能使用下面的修饰符:中的方法不能使用下面的修饰符: static native或或synchronized final 2021-7-11 中国矿业大学计算机科学与技术学院 8 4.7.3接口的使用接口的使用 Java用用关键字关键字implements声明类中将实现的声明类中将实现的接口:接口: 类修饰符类修饰符 clas

8、s类名类名 extends子句子句 implements 子句子句 注意:注意:在在implements子句中可以包含多个接口类型,子句中可以包含多个接口类型, 各个接口类型之间用逗号隔开各个接口类型之间用逗号隔开 2021-7-11 中国矿业大学计算机科学与技术学院 9 例例 TestInterface.java 接口的使用接口的使用示例示例 2021-7-11 中国矿业大学计算机科学与技术学院 10 interface Runner void run(); interface Swimmer void swim(); abstract class Animal abstract void

9、eat(); class Person extends Animal implements Runner, Swimmer / Person是能跑和游泳的动物,所以继承了Animal, / 同时实现了Runner和Swimmer两个接口 public void run() System.out.println(run); public void swim() System.out.println(swim); public void eat() System.out.println(eat); 2021-7-11 中国矿业大学计算机科学与技术学院 11 public class TestInt

10、erface public static void main(String args) TestInterface t = new TestInterface(); Person p = new Person(); t.m1(p); t.m2(p); t.m3(p); public void m1(Runner f) f.run(); public void m2(Swimmer s) s.swim(); public void m3(Animal a) a.eat(); 4.7.4 对接口的引用对接口的引用 接口可以接口可以作为作为引用引用类型类型来使用。来使用。任何实现该接口的类任何实现该

11、接口的类 的实例都可以存储在该接口类型的变量中的实例都可以存储在该接口类型的变量中,通过这些,通过这些 变量可以访问类所实现的变量可以访问类所实现的接口中的方法接口中的方法。Java运行运行时时 动态动态地确定该使用地确定该使用哪个方法哪个方法 如如Person类实现了类实现了Runner接口,可以如下接口,可以如下赋值:赋值: Runner r=new Person(); 2021-7-11 中国矿业大学计算机科学与技术学院 12 接口应用:回调(接口应用:回调(callback) 回调:某个特定事件发生时应该采取的回调:某个特定事件发生时应该采取的动作动作 按下鼠标或者选择某个菜单项时应采

12、取什么行动按下鼠标或者选择某个菜单项时应采取什么行动 java.swingjava.swing中的中的TimerTimer类与类与java.awt.eventjava.awt.event包的包的ActionListenerActionListener 接口接口 public interface ActionListener void actionPerformed(ActionEvent event); 2021-7-11 中国矿业大学计算机科学与技术学院 13 2021-7-11 中国矿业大学计算机科学与技术学院 14 public class TimerDemo public static

13、 void main(String args) ActionListener listener = new TimePrinter(); Timer t = new Timer(10000, listener); t.start(); JOptionPane.showMessageDialog(null, Quit program?); System.exit(0); class TimePrinter implements ActionListener Override public void actionPerformed(ActionEvent e) Date now = new Dat

14、e(); DateFormat df = DateFormat.getDateInstance(); System.out.println(The Time is + df.format(now); 4.7.5 使用接口实现多重继承使用接口实现多重继承 程序设计有时需要表达这样的意思:程序设计有时需要表达这样的意思: “x从属于从属于a,也从属于,也从属于b,也从属于,也从属于c” C+:多重继承,每个类都有具体的实施细节:多重继承,每个类都有具体的实施细节 Java:接口,只有一个类有具体的实施细节:接口,只有一个类有具体的实施细节 基类的功能基类的功能 Interface2 interfa

15、ce1Interface2Interface n 抽象或具体的基类抽象或具体的基类 interface1 Interface n 2021-7-11 中国矿业大学计算机科学与技术学院 15 4.7.6 抽象类和接口的选择抽象类和接口的选择 问题:接口和抽象类都可以使设计和实现分离,那么问题:接口和抽象类都可以使设计和实现分离,那么 继承结构中的基础类应该定义成一个普通类、抽象类继承结构中的基础类应该定义成一个普通类、抽象类 还是还是接口?接口? 语法语法上上都可以,但把都可以,但把基础类定义成抽象类或基础类定义成抽象类或接口会接口会 增加程序的灵活性和增加程序的灵活性和容错性容错性 如果基础类

16、只是定义一些接口,根本不需要具体的如果基础类只是定义一些接口,根本不需要具体的 实现,实现,那么优先那么优先选择使用接口,选择使用接口,接口的抽象程度比抽接口的抽象程度比抽 象类更高;象类更高;如果基础类必须实现方法或者定义成员如果基础类必须实现方法或者定义成员变变 量,考虑量,考虑采用抽象采用抽象类类 2021-7-11 中国矿业大学计算机科学与技术学院 16 4.7.7 多态多态 class Shape void draw() void erase() Shape draw() erase() CircleSquare draw() erase() draw() erase() 2021-

17、7-11 中国矿业大学计算机科学与技术学院 17 例例 Shapes.java 多态性多态性示例示例 例例 Shapes.java 多态性多态性示例示例 class Circle extends Shape void draw() System.out.println(Circle.draw(); void erase() System.out.println(Circle.erase(); class Square extends Shape void draw() System.out.println(Square.draw(); void erase() System.out.print

18、ln(Square.erase(); 2021-7-11 中国矿业大学计算机科学与技术学院 18 public class Shapes static void doShape(Shape s) s.draw(); s.erase(); public static void main(String args) Circle c=new Circle(); Square s=new Square(); doShape(c); doShape(s); 运行结果:运行结果: Circle.draw() Circle.erase() Square.draw() Square.erase() 例例 Sh

19、apes.java 多态性多态性示例示例 2021-7-11 中国矿业大学计算机科学与技术学院 19 多多个个类的类的多态性建立的基础多态性建立的基础: 继承继承(覆盖覆盖) 向上转型向上转型 动态绑定动态绑定 向上转型向上转型 (Upcasting) Circle draw() erase() Square draw() erase() Circle对象对象 Shape draw() erase() 2021-7-11 中国矿业大学计算机科学与技术学院 20 向上转型向上转型 子类对象可以直接转换成父类对象,子类对象可以直接转换成父类对象,即对象即对象除除 了可以当作自己的类型,还可以作为它

20、的基础了可以当作自己的类型,还可以作为它的基础 类型对待类型对待,叫作,叫作向上转型(即向上转型(即“Upcasting”) 例如:例如:Shape s=new Circle(); Circle c=new Circle(); Square s=new Square(); doShape(c); doShape(s); 2021-7-11 中国矿业大学计算机科学与技术学院 21 动态绑定动态绑定 绑定:绑定:将一个方法调用同一个方法体连接起来将一个方法调用同一个方法体连接起来 早期绑定:早期绑定:程序运行以前执行绑定程序运行以前执行绑定 动态绑定(或后期绑定)动态绑定(或后期绑定):在运行期间

21、执行绑定在运行期间执行绑定 Java支持动态绑定:能在支持动态绑定:能在运行期间判断参数的运行期间判断参数的 实际类型实际类型,并分别调用适当的方法体,从而,并分别调用适当的方法体,从而实实 现多态性现多态性 Java中所有非中所有非final和非和非static的方法都会自动地的方法都会自动地 进行动态进行动态绑定绑定 2021-7-11 中国矿业大学计算机科学与技术学院 22 多态的好处多态的好处 多态可以增加程序的多态可以增加程序的扩展性扩展性: 可以在程序中增加新的类型,同时不需要为可以在程序中增加新的类型,同时不需要为 新的类型重写以前的代码新的类型重写以前的代码 Shape dra

22、w() erase() CircleSquare Triangle draw() erase() draw() erase() draw() erase() 2021-7-11中国矿业大学计算机科学与技术学院23 class Triangle extends Shape void draw() Sop(Triangle.draw(); void erase() Sop(Triangle.erase(); 2021-7-11 中国矿业大学计算机科学与技术学院 24 public class Shapes static void doShape(Shape s) s.draw(); s.erase

23、(); public static void main(String args) Circle c = new Circle(); Square s = new Square(); Triangle t=new Triangle(); doShape(c); doShape(s); doShape(t); 多态在面向对象的程序中的重要多态在面向对象的程序中的重要作用作用 提高程序提高程序的抽象程度和的抽象程度和简洁性简洁性 最大限度最大限度地地降降低低类类和程序模块之间的和程序模块之间的耦合性耦合性,提高类提高类 模块的封闭性,模块的封闭性,使不使不需了解对方的具体细节,就可以需了解对方的具体

24、细节,就可以 很好地共同很好地共同工作工作 注意:注意:在设计多态的时候,基础类还可以使用在设计多态的时候,基础类还可以使用抽象类和抽象类和 接口接口,可以,可以使程序更清晰,使程序更清晰,并避免并避免一些容易疏忽的错误。一些容易疏忽的错误。 编程者可以自由决定向上转型为编程者可以自由决定向上转型为一个普通类,一个抽象一个普通类,一个抽象 类或一个类或一个接口接口 2021-7-11 中国矿业大学计算机科学与技术学院 25 4.8 包包 包包是用于组织类的一种方式,可以对类进行分是用于组织类的一种方式,可以对类进行分 组,一个包中可以包含任意数量的组,一个包中可以包含任意数量的类和接口类和接口

25、, 是是一种一种命名机制命名机制,具体表现就是具体表现就是文件夹文件夹 包是一种松散的类的集合包是一种松散的类的集合:不:不要求处于同一个要求处于同一个 包中的类有明确的相互关系,如包含、继承等,包中的类有明确的相互关系,如包含、继承等, 但是由于同一个包中的类在默认情况下可以相但是由于同一个包中的类在默认情况下可以相 互访问,所以互访问,所以为了方便编程和管理,通常把需为了方便编程和管理,通常把需 要在一起工作的类放在一个包要在一起工作的类放在一个包里里 包具有层次结构包具有层次结构 2021-7-11 中国矿业大学计算机科学与技术学院 26 4.8 包包 包的作用:包的作用: I.将将类组

26、织成单元,通过文件夹或目录来组织类组织成单元,通过文件夹或目录来组织 文件和文件和应用程序应用程序 II. 减少名称减少名称冲突带来的问题,可以冲突带来的问题,可以防止同名的防止同名的 类发生类发生冲突冲突 III.包包能够更大面积的保护类、变量和方法,而能够更大面积的保护类、变量和方法,而 不是分别对每个类进行不是分别对每个类进行保护保护 IV. 包包可以可以用于标识类用于标识类 2021-7-11 中国矿业大学计算机科学与技术学院 27 4.8.1 包的创建包的创建 无名包无名包:系统系统为没有为没有明确指明所属包的明确指明所属包的.java文件默文件默 认创建的包认创建的包 无名无名包中

27、的类无法被引用和复用包中的类无法被引用和复用 有名包有名包: (1)说明格式)说明格式 package 包名;包名; package cn.bitsec; package cn.bitsec.is; (2)说明语句必须放在整个)说明语句必须放在整个.java文件的第一行文件的第一行 2021-7-11 中国矿业大学计算机科学与技术学院 28 4.8.1 包的创建包的创建 创建包的含义创建包的含义:在:在当前文件夹下创建一个子文件夹当前文件夹下创建一个子文件夹, 以便存放这个包中包含的所有类的以便存放这个包中包含的所有类的.class文件文件 可以在不同的文件中使用相同的包说明语句,这样就可以在

28、不同的文件中使用相同的包说明语句,这样就 可以将不同文件中的类都包含到相同的程序包中可以将不同文件中的类都包含到相同的程序包中 package SubClass; class s1 package MyClass.SubClass; class s2 2021-7-11 中国矿业大学计算机科学与技术学院 29 4.8.1 包的创建包的创建 例例 练习包的练习包的创建创建 在文件在文件p1.java中包含如下语句:中包含如下语句: package Mypackage; public class MyClass1 在文件在文件p2.java中包含如下语句:中包含如下语句: package Mypackage; class MyClass2 class MyClass3 2021-7-11 中国矿业大学计算机科学与技术学院 30 4.8.2 包的引用包的引用 1、使用全名引用、使用全名引用 同包的类同包的类相互引用相互引用时:时: 在使用的属性或方法名前加上类名作为前缀即可在使用的属性或方法名前加上类名作为前缀

温馨提示

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

评论

0/150

提交评论