




已阅读5页,还剩34页未读, 继续免费阅读
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
第三章Java中的类与接口 教授 郭磊 本章导读 Java语言其中一个突出特点就是面向对象 所谓面向对象的方法学 就是使我们分析 设计和实现一个系统的方法尽可能地接近我们认识一个系统的方法 包括 面向对象的分析 OOA Object OrientedAnalysis 面向对象的设计 OOD Object OrientedDesign 面向对象的程序设计 OOP Object OrientedProgram 本章主要介绍面向对象的基本概念 包括类与对象 抽象类 内部类 匿名类 接口和包等 目的是为以后的Java面向对象的编程打好基础 本章要点 类与对象抽象类内部类匿名类接口包 3 1类与对象 3 1 1类的声明1 类的声明格式 类首声明定义类的名字 访问权限以及与其它类的关系等 类主体定义类的成员 包括变量 数据 和方法 行为 3 1类与对象 3 1 2类首声明 class extends implements class 类定义的关键字 extends 表示类和另外一些类 超类 的继承关系 implements 表示类实现了某些接口 修饰符 表示类访问权限 public 和类型说明 abstract final 3 1类与对象 3 1 3成员变量的声明格式 static final static 表示是一个类成员变量 静态变量 final 表示是一个常量 例 finaldoublePI 3 1415926 修饰符 表示变量的访问权限 缺省访问friendly public protected和private 作用域 整个类 同一类中的所有方法都可以对其访问 并可简单地通过名字来引用 在方法体内定义的变量是局部变量 作用域只能在方法体内 3 1类与对象 3 1 3成员方法方法的定义包括两部分 方法声明和方法体 一般格式为 方法声明部分 方法体的内容 3 1类与对象 3 1 4对象的创建与引用1 对象的创建创建一个对象包括对象的声明和为对象分配成员变量两个步骤 1 对象的声明对象声明的一般格式为 类的名字对象名字 如 RectrectangleOne 这里 Rect是一个类的名字 rectangleOne是我们声明的对象的名字 用类声明的数据称为类类型变量 即对象 如上述Rect类声明的对象rectangleOne 3 1类与对象 1 对象的创建 2 为声明的对象分配成员变量为声明的对象分配成员变量 即是给变量分配内存空间 使用new运算符和类的构造方法为声明的对象分配成员变量 如果类中没有构造方法 系统会调用默认的构造方法 默认的构造方法是无参数的 你一定还记得构造方法的名字必须和类名相同这一规定 上述的Rect类提供了2个构造方法 下面都是合法的创建对象的语句 rectangleOne newRect 3 1类与对象 2 对象的引用我们已经知道 当用类创建一个对象时 成员变量被分配内存空间 这些内存空间称做该对象的实体或变量 而对象中存放着引用 以确保这些变量由该对象操作使用 因此 如果两个对象有相同的引用 那么就具有同样的实体 3 1类与对象 3 1 5类的继承与多态只支持单重继承 不支持多重继承 只能从一个父类继承 必须从一个类继承默认是从Object继承如果类Sub是类Super的子类 则类Sub只继承超类Super中非private的成员变量和方法 子类Sub中 包括两部分的内容 从超类Super中继承下来的变量和方法 自己新增加的变量和方法 3 1类与对象 3 1 5类的继承与多态继承的语法修饰符class类名extends父类 新属性 新方法 重载的方法 覆盖的方法 3 1类与对象 3 1 5类的继承与多态多态是指同一个名字的若干个方法 有不同的实现 即方法体中的代码不一样 通过方法的重载和覆盖来实现多态性 方法的重载一个类中 有若干个方法名字相同 但方法的参数不同 称为方法的重载 不正确的方法重载publicvoidfunover inta floatb publicintfunover inta floatb 3 1类与对象 3 1 5类的继承与多态对于多态 可以总结它为 1 使用父类类型的引用指向子类的对象 2 该引用只能调用父类中定义的方法和变量 3 如果子类中重写了父类中的一个方法 那么在调用这个方法的时候 将会调用子类中的这个方法 动态连接 动态调用 4 变量不能被重写 覆盖 重写 的概念只针对方法 如果在子类中 重写 了父类中的变量 那么在编译时会报错 3 2抽象类 Java也可以创建专门的类用来当作父类 这种类称为抽象类 abstractclass 即用关键字abstract修饰类称为abstract类 抽象类 抽象类有点类似 模板 的作用 其目的是要你根据它的格式来修改并创建新的类 不能够通过抽象类直接创建对象 只能通过抽象类派生的新的类 再由新类创建对象 3 2抽象类 在Java中 凡是用abstract修饰符修饰的类称为抽象类 它和一般的类不同之处在于 1 如果一个类中含有未实现的抽象方法 那么这个类就必须通过关键字abstract进行标记声明为抽象类 2 抽象类中可以包含抽象方法 但不是一定要包含抽象方法 它也可以包含非抽象方法和域变量 就像一般类一样 3 抽象类是没有具体对象的概念类 也就是说抽象类不能实例化为对象 4 抽象类必须被继承 子类为它们父类中的所有抽象方法提供实现 否则它们也是抽象类 定义一个抽象类的格式如下 abstractclass类名称 类的主体部分 注意 在抽象类中 方法的定义可分为两种 一种是普通方法 另一种是抽象方法 此方法以abstract开头 且只声明了返回值的数据类型 方法名称 所需参数 但没有方法体 这样 抽象方法中的处理方式必须在子类中完全实现 3 2抽象类 下面我们通过例子 学习抽象方法的使用 例3 11 abstractclassfatherClass abstractvoidabstractMethod voidprintMethod System out println fatherClassfunction classchildClassextendsfatherClass voidabstractMethod System out println childClassfunction publicclassmainClass publicstaticvoidmain Stringargs childClassobj newchildClass obj printMethod obj abstractMethod 3 2抽象类 例子运行的结果 在上面的程序中 首先定义了一个抽象类fatherClass 在这个抽象类中 声明一个抽象方法abstractMethod 和一个非抽象方法printMethod 接着定义了fatherClass的子类childClass 在childClass中重写了abstractMethod 方法 随后 在主类mainClass中生成类childClass的一个实例 并将该实例引用返回到fatherClass类变量obj中 3 3内部类 类可以有两种重要的成员 成员变量和方法 类还可以有一种成员 内部类 Java支持在一个类中声明另一个类 这样的类称作内部类 而包含内部类的类成为内部类的外嵌类 内部类同类中声明的方法或成员变量一样 一个类把内部类看作是自己的成员 外嵌类的成员变量在内部类中仍然有效 内部类中的方法也可以调用外嵌类中的方法 内部类的类体中不可以声明类变量和类方法 外嵌类可以用内部类声明对象 作为外嵌类的成员在一个类的内部还可以定义类 这就是内部类 也称为嵌套类 3 3内部类 内部类本身是一个类 但它同时又是外部类一个成员 作为外部类的成员 它可以毫无限制地访问外部类的变量和方法 包括private成员 这和private的含义并不矛盾 因为private修饰符只是限制从一个类的外部访问该类成员的权限 而内部类在外部类内部 所以它可以访问外部类的所有资源 3 3内部类 3 3 1内部类的分类静态内部类 成员内部类 本地内部类匿名内部类 3 4匿名类 匿名类是不能有名称的类 所以没办法引用它们 必须在创建时 作为new语句的一部分来声明它们 这就要采用另一种形式的new语句 如下所示 new这种形式的new语句声明一个新的匿名类 它对一个给定的类进行扩展 或者实现一个给定的接口 它还创建那个类的一个新实例 并把它作为语句的结果而返回 要扩展的类和要实现的接口是new语句的操作数 后跟匿名类的主体 3 4匿名类 Java中内部匿名类用的最多的地方也许就是在Frame中加入Listner了吧 如下 importjava awt importjava awt event publicclassQFrameextendsFrame publicQFrame this setTitle myapplication addWindowListener newWindowAdapter publicvoidwindowClosing WindowEvente dispose System exit 0 this setBounds 10 10 200 200 3 4匿名类 内部匿名类 就是建立一个内部的类 但没有给你命名 也就是没有引用实例的变量 newWindowAdapter publicvoidwindowClosing WindowEvente dispose System exit 0 new是建立一个WindowAdapter对象 后面一个 表示这个括号中的操作作用于这个默认的对名象 而上面的Java程序中后面是一个函数体 3 5接口 Java为了避免C 中随着多重继承所衍生的问题 因而限定类的继承只支持单重继承 但是实际中的较为复杂问题的解决有需要用到多重继承 因此 Java通过接口来实现类间多重继承的功能 3 5 1接口的定义 Java中声明接口的语法如下 public interface接口名 extends父接口名列表 接口体 常量域声明 public static final 域类型域名 常量值 抽象方法声明 public abstract native 返回值方法名 参数列表 throw异常列表 一个类只能有一个父类 但是类可以同时实现若干个接口 这种情况下如果把接口理解成特殊的类 那么这个类利用接口实际上就获得了多个父类 即实现了多重继承 3 5 1接口的定义 定义接口可归纳为如下几点 1 在Java中接口是一种专门的类型 用interface关键字定义接口 2 接口中只能定义抽象方法 不能有方法体 一定是public修饰的 3 接口中可以定义变量 但实际上是staticfinal修饰的常量 4 接口中不能定义静态方法 接口是简单的未执行的系列以及一些抽象的方法 你可能会思考究竟接口于抽象类有什么区别 了解它们的区别是相当重要的 它们之间的区别如下 1 接口不能包含任何可以执行的方法 而抽象类可以 2 类可以实现多个接口 但只有一个父类 3 接口不是类分级结构的一部分 而没有联系的类可以执行相同的接口 3 5 2接口的实现 接口的声明仅仅给出了抽象方法 相当于程序开发早期的一组协议 而具体地实现接口所规定的功能 则需某个类为接口中的抽象方法书写语句并定义实在的方法体 称为实现这个接口 如果一个类要实现一个接口 那么这个类就提供了实现定义在接口中的所有抽象方法的方法体 3 5 2接口的实现 一个类要实现接口时 请注意以下问题 1 在类的声明部分 用implements关键字声明该类将要实现哪些接口 2 如果实现某接口的类不是abstract抽象类 则在类的定义部分必须实现指定接口的所有抽象方法 即为所有抽象方法定义方法体 而且方法头部分应该与接口中的定义完全一致 即有完全相同的返回值和参数列表 3 如果实现某接口的的类是abstract的抽象类 则它可以不实现该接口所有的方法 但是对于这个抽象类任何一个非抽象的子类而言 它们父类所实现的接口中的所有抽象方法都必须有实在的方法体 这些方法体可以来自抽象的父类 也可以来自子类自身 但是不允许存在未被实现的接口方法 这主要体现了非抽象类中不能存在抽象方法的原则 4 个类在实现某接口的抽象方法时 必须使用完全相同方法头 如果所实现的方法与抽象方法有相同的方法名和不同的参数列表 则只是在重载一个新的方法 而不是实现已有的抽象方法 5 接口的抽象方法的访问限制符都已制定为public 所以类在实现方法时 必须显式地使用public修饰符 否则将被系统警告为缩小了接口中定义的方法的访问控制范围 3 5 2接口的实现 例3 13 interfaceA inta 1 interfaceB intb 2 publicabstractvoidpp interfaceMyInterfaceextendsA B 接口的继承abstractclassAbstractInterfaceExamimplementsA B 抽象类实现接口publicclassInterfaceExamimplementsA B 一般类实现接口 staticInterfaceExamobj newInterfaceExam publicstaticvoidmain String args System out println 继承接口A中的a obj a obj pp publicvoidpp 实现抽象方法pp System out println 继承接口AB中的ab obj b 3 5 3接口回调 接口回调是多态的另一种体现 接口回调是指 可以把使用某一接口的类创建的对象的引用赋给该接口声明的接口变量中 那么该接口变量就可以调用被类实现的接口中的方法 当接口变量调用被类实现的接口中的方法时 就是通知相应的对象调用接口的方法 这一过程称作对象功能的接口回调 不同的类在使用同一接口时 可能具有不同的功能体现 即接口的方法体不必相同 因此 接口回调可能产生不同的行为 3 5 3接口回调 下面我们看看使用了接口的回调技术的例子 例3 14 interfaceShowMessage voidshowTradeMark classTVimplementsShowMessage publicvoidshowTradeMark System out println 我是电视机 classPCimplementsShowMessage publicvoidshowTradeMark System out println 我是电脑 publicclassExample publicstaticvoidmain Stringargs ShowMessagesm 声明接口变量 sm newTV 接口变量中存放对象的引用 sm showTradeMark 接口回调 sm newPC 接口变量中存放对象的引用 sm showTradeMark 接口回调 运行结果是 我是电视机我是电脑 3 6包 包是Java提供的文件组织方式 一个包对应一个文件夹 一个包中可以包括很多类文件 包中还可以有子包 形成包等级 Java把类文件放在不同等级的包中 这样一个类文件就会有两个名字 一个是类文件的短名字 另外一个是类文件的全限定名 短名字就是类文件本身的名字 全限定名则是在类文件的名字前面加上包的名字 3 6包 3 6 1比目录更好的选择可以把一个目录树转化为一个包 jar文件也可以把一个包文件还原为目录树包就是目录树的化身java访问包中的东西就如同访问目录树一样 3 6包 为什么要打成包的格式 简洁更容易下载 拷贝 不容易损坏平台无关避免平台对目录和文件名的限制节省可以选择压缩 节约空间 3 6包 如何打包 bin目录下提供了实用的工具jar exe能处理打包和解包的问题jar cvf包名待处理的目录或文件 本章小结 类是Java语言面向对象编程的基本元素 它定义了一个对象的结构和功能 接口是Java语言中特有的数据类型 由于接口的存在 解决了Java语言不支持多重继承的问题 通过本章学习 要求掌握面向对象程序设计的基本概念 多态中的方法重载和覆盖 类的继承的概念和实现 理解继承 抽象类 接口和包的概念 习题 一 选择题1 每个类初始化其成员变量的方法是 A 方法
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2026中交一公局集团有限公司校园招聘备考考试题库附答案解析
- 2025山东临沂罗开控股集团有限公司及其权属公司招聘工作人员6人考试参考试题及答案解析
- 2025山西阳泉人才发展集团招聘服务工作人员19人备考考试题库附答案解析
- 2025年金华兰溪市市属国企(兰创集团)下半年公开招聘工作人员19人备考考试题库附答案解析
- 2025广东肇庆市高要区公办中小学招聘临聘教师200人备考考试题库附答案解析
- 2025版泌尿外科疾病常见症状及护理建议分享
- 工厂安全培训效果验证课件
- 神经影像标志物筛选-洞察及研究
- 中药资源保护与数字化转型-洞察及研究
- 需求预测精准化-第2篇-洞察及研究
- GB/T 37573-2019露天煤矿边坡稳定性年度评价技术规范
- GB/T 33467-2016全自动吹瓶灌装旋盖一体机通用技术要求
- GB/T 20481-2006气象干旱等级
- 校园监控维护记录表
- 2023年石家庄水务投资集团有限责任公司招聘笔试模拟试题及答案解析
- 2020牛津译林版高中英语新教材选修第一册全册课文翻译及单词表
- 绩效考核环保管理考核细则
- 我国运动员在奥林匹克运动会取得的辉煌成绩课件
- 2021新苏教版科学五年级上册第二单元《热传递》课件
- 专升本高等数学的讲义80页PPT课件
- 汽车机械基础(全套课件)
评论
0/150
提交评论