Java抽象类和接口.ppt_第1页
Java抽象类和接口.ppt_第2页
Java抽象类和接口.ppt_第3页
Java抽象类和接口.ppt_第4页
Java抽象类和接口.ppt_第5页
已阅读5页,还剩29页未读 继续免费阅读

下载本文档

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

文档简介

CoreJava 抽象类和接口 Java中的抽象类 接口和程序包 抽象类与抽象方法 抽象类 用abstract关键字来修饰一个类时 该类叫做抽象类 抽象类必须被继承 抽象类不能被直接实例化 它只能作为其它类的超类 这一点与最终类 final类 正好相反 抽象方法 用abstract来修饰一个方法时 该方法叫做抽象方法 抽象方法必须被重写抽象方法只有声明 不能有实现 定义了抽象方法的类必须是抽象类 abstractreturnTypeabstractMethod paramlist 两个类Circle和Rectangle 完成相关参数的计算 classRectangle publicfloatwidth height Rectangle floatw floath width w 这里不需 this height h publicfloatarea returnwidth height classCircle publicfloatr Circle floatr this r r this指 这个对象的 publicfloatarea return3 14 r r Java中的抽象类 接口和程序包 抽象类与抽象方法 假设有若干个Circle 以及若干个Rectangle 希望计算它们的总面积 直截了当的做法是将它们分别放到两个数组中 用两个循环 加上一个加法 这种做法是不漂亮的 如果还有其它形状 Triangle Ellipses等 上述方法显得 累赘 我们希望有一种统一的表示 例如用一个数组shape 接受所有的形状 然后用 for i 0 i shape length i area total shape i area Java中的抽象类 接口和程序包 抽象类与抽象方法 Java中的抽象类 接口和程序包 抽象类与抽象方法 抽象类和最终类 声明抽象类与抽象方法publicabstractclassPlaneGraphics1 平面图形类 抽象类 publicabstractdoublearea 计算面积 抽象方法 分号 必不可少 使用abstract关键字 抽象方法只有方法声明 没有方法体 抽象类和最终类 规定 抽象类不能被直接实例化 只有它的非抽象子类可以创建对象抽象类中不一定包含抽象方法 但有抽象方法的类必定是抽象类抽象类中的抽象方法只是声明 不包含方法体 即不给出方法的实现构造方法 类方法不能声明为抽象方法抽象类的子类必须给出抽象类中的抽象方法的具体实现 除非该子类也是抽象类 抽象类和最终类 抽象类的意义 描述抽象的概念 规定必须实现的方法的统一接口关于抽象类和抽象方法Abstracttest java 抽象类和最终类 最终类和最终方法final关键字修饰的类称为最终类 最终类不能被继承final关键字修饰的方法称为最终方法 最终方法不能被覆盖最终方法和最终类没有必然的对应关系 Java中的接口 入门知识 1 含义 一组只有成员函数原型定义而无成员函数定义体的方法集 接口定义了一组成员函数 但没有具体加以实现 其实现则是由实现该接口的类来加以具体完成的 2 作用 为若干个类 相关或无关的类 定义一组相同的功能行为 从而达到相同的功能名称 不同的功能实现之目的 另外也可以实现类似C 语言中的多重继承但又避免了虚基类的编程 接口的概念 在构建问题的类过程中 我们经常会遇到一种特殊的情况 在描述某个类的各个方法时 对每个方法我们只能给出其功能实现的要求 原形声明 但不能给出具体的功能实现 函数定义体 因为我们所处理的问题只是一个泛泛的功能说明 并没有针对某一具体类型的问题来说明 设计出实现图像显示功能的设备时 可以只给出功能实现的要求显示图像调整图像 在投影仪中实现显示图像调整图像 在电视机中实现显示图像调整图像 您觉得接口抽象吗 接口定义格式 要点 类似于类的定义格式 只是以interface作为定义符 格式 接口的类型interface接口名 常量 并且必须初始化 成员方法定义 只有原形而无函数定义体 或 接口的类型interface派生的接口名extends父接口名列表 接口中的成员变量定义 接口中的成员方法原型定义 实现接口 方法 通过定义一个类同时采用implements来指明所实现的接口名 并在该类中重写接口中的所有成员方法且给出成员函数体定义 要点 类中所实现的接口中的成员函数的原型都应该与它在接口中的原型定义保持一致 并在类中重写接口中的所有成员方法 通过实现接口 从而可扩充或增加该类的功能 接口只定义方法名 而类实现接口内部的方法的代码接口的继承只是继承接口本身 而非代码 从而不会产生重复继承多次 一个类可以实现多个接口实现接口的类必须给出接口中所有方法的具体实现 除非这个类是抽象类接口的作用接口提供了完全的抽象说明所有实现该接口的类应具有的形式接口中的方法在多个实现接口的类中表现出多态性接口回调接口也是引用数据类型 指向接口的引用也可以指向任意实现了该接口的类创建的实例接口回调 即接口的引用可以指向实现了接口的类的实例例子 Interfacetest java 注意 程序实例 interfaceComputer publicvoidComputeData 计算机应该有数据计算的功能publicvoidSaveData 计算机应该有存储数据的功能publicvoidPrintData 计算机应该有打印数据的功能publicvoidDisplayData 计算机应该有显示数据的功能 定义出接口 实现只给出功能的描述 在设计PC机时来实现它自己的功能 classPCComputerimplementsComputer 实现它的计算 存储和打印数据 显示数据的功能publicvoidComputeData publicvoidSaveData publicvoidPrintData publicvoidDisplayData Sun公司在Solaris机中实现它的功能 classSunSolarisComputerimplementsComputer Sun在设计Solaris机时实现它的功能publicvoidComputeData publicvoidSaveData publicvoidPrintData publicvoidDisplayData 抽象类和接口的对比 接口和类是很相似但又有区别的一种数据结构 其设计和调用也是JAVA程序设计的一种重要技术 从结构上看 接口有如下特点 接口用interface来定义 而不是class接口中定义的变量去全部是最终的静态变量接口中没有自身的构造方法 不能创建实例 而定义的其他方法全是抽象方法 即提供了方法的定义 但是没有提供方法的实现 接口采用多重继承机制 而不是采用单一的继承机制 接口与抽象类的区别抽象类和接口中主要关心的都是抽象 而不关心具体的实现 但也有一些区别 一个类只能继承一个类 但可以实现多个接口抽象类表示一种继承关系 接口只说明功能二者的区别主要体现在对问题域的理解上 抽象类的应用 abstractclassPerson privateintID privateStringName publicabstractvoidEat Foodobj publicvoidStep Feetobj publicvoidSleep 在描述某一个问题时 如果只能给出部分的功能实现 而不能给出全部的功能实现时 应该采用抽象类来描述 接口的应用 interfaceTV publicintSize 29 publicabstractvoidshowImage publicabstractvoidsetChannel publicabstractvoidreceiveImage 在描述某一个问题时 如果不能给出任何的功能实现 应该采用接口来描述 内部类 声明内部类在一个类中包含另一个类的定义内部类可以在类 方法甚至语句块中定义内部类可以是private或protected的 见例子 TestGoods java 在这个例子里类Content和GDestination被定义在了类Goods内部 并且分别有着protected和private修饰符来控制访问级别 Content代表着Goods的内容 而GDestination代表着Goods的目的地 它们分别实现了两个接口Content和Destination 在后面的main方法里 直接用Contentsc和Destinationd进行操作 你甚至连这两个内部类的名字都没有看见 这样 内部类的第一个好处就体现出来了隐藏你不想让别人知道的操作 也即封装性 同时 我们也发现了在外部类作用范围之外得到内部类对象的第一个方法 那就是利用其外部类的方法创建并返回 上例中的cont 和dest 方法就是这么做的 那么还有没有别的方法呢 当然有 其语法格式如下 outerObject newouterClass ConstructorParameters outerClass innerClassinnerObject outerObject newInnerClass ConstructorParameters 注意 在创建非静态内部类对象时 一定要先创建起相应的外部类对象 至于原因 也就引出了我们下一个话题非静态内部类对象有着指向其外部类对象的引用 对刚才的例子稍作修改 TestGoods1 java 注意 在修改的代码里我们给Goods类增加了一个private成员变量valueRate 意义是货物的价值系数 在内部类Content的方法value 计算价值时把它乘上 我们发现 value 可以访问valueRate 这也是内部类的第二个好处一个内部类对象可以访问创建它的外部类对象的内容 甚至包括私有变量 这是一个非常有用的特性 为我们在设计时提供了更多的思路和捷径 要想实现这个功能 内部类对象就必须有指向外部类对象的引用 Java编译器在创建内部类对象时 隐式的把其外部类对象的引用也传了进去并一直保存着 这样就使得内部类对象始终可以访问其外部类对象 同时这也是为什么在外部类作用范围之外想要创建内部类对象必须先创建其外部类对象的原因 有人会问 如果内部类里的一个成员变量与外部类的一个成员变量同名 也即外部类的同名成员变量被屏蔽了 怎么办 没事 Java里用如下格式表达外部类的引用 outerClass this有了它 我们就不怕这种屏蔽的情况了 内部类 关于内部类非静态内部类具有指向其外部类的引用 可以访问外部类中的成员 当内部类中定义了与外部类同名的成员时 可以使用 宿主类的名称 this 成员 的格式访问外部类的成员 内部类可以被定义为静态的 静态内部类没有指向外部类的引用 只能访问外部类的类成员 任何非静态内部类中不能有静态数据 静态方法或者静态内部类 内部类 内部类作用与接口一起实现完整的多重继承内部类作用InnerClass java内部类具有访问外部类的引用 内部类引用外部类的成员publicclassInner2 classaa inta 1 classbb intb 2 classcc 这对括号必须有 因为类中语句必须包含在一个代码块或方法体中intb 4 intc 3 System out println cc System out println cc c c System out println bb b bb this b 内部类引用外部类成员System out println aa a aa this a 内部类 匿名内部类当只需创建一个类的对象而用不上它的名字时 可以使用匿名内部类匿名内部类由于没有名字 所以它没有带名字的构造函数java的匿名内部类的语法规则看上去有些古怪 当你只需要创建一个类的对象而且用不上它的名字时 使用内部类可以使代码看上去简洁清楚 它的语法规则是这样的 newinterfacename 或newsuperclassname 有一点需要注意的是 匿名内部类由于没有名字 所以它没有带名字的构造函数 但是如果这个匿名内部类继承了一个只含有带参数构造函数的父类 创建它的时候必须带上这些参数 并在实现的过程中使用super关键字调用相应的内容 如果你想要初始化它的成员变量 有下面几种方法 如果是在一个方法内部的匿名内部类 可以利用这个方法传进你想要的参数 不过记住 这些参数必须被声明为final 将匿名内部类改造成有名字的局部内部类 这样它就可以拥有有名字的构造函数了 在这个匿名内部类中使用初始化代码块 例子 Test java 匿名内部类实例classPackBox interfaceGoods 定义内部接口 StringgetName GoodsSportShoe returnnewGoods 匿名内部类Stringname 运动鞋 intprice 200 publicStringgetName returnname 事实上匿名内部类必须继承一个类或实现一个接口 内部类小结 为什么需要内部类 java内部类有什么好处 为什么需要内部类 首先举一个简单的例子 如果你想实现一个接口 但是这个接口中的一个方法和你构想的这个类

温馨提示

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

评论

0/150

提交评论