《Java程序设计及应用》.ppt

上传人:xin****828 文档编号:6612060 上传时间:2020-02-29 格式:PPT 页数:31 大小:2.94MB
返回 下载 相关 举报
《Java程序设计及应用》.ppt_第1页
第1页 / 共31页
《Java程序设计及应用》.ppt_第2页
第2页 / 共31页
《Java程序设计及应用》.ppt_第3页
第3页 / 共31页
点击查看更多>>
资源描述
第6讲 面向对象 1 内容提要 人与计算机的关系物理世界与面向对象类与对象面向对象基本特征封装访问修饰符继承多态重载覆盖 教学要求 物理世界与面向对象的思想 方法计算机面向对象的思想 方法如何定义一个类以及创建其实例面向对象的三个基本特征 人与计算机的关系 人处于主体地位 计算机只能处于从属地位 计算机必须能够模拟这个物理世界 计算机是个小世界 而物理世界是个大世界 小世界来源于大世界 物理世界的认知 1 世界由万物构成 2 事物是运动的 发展的 变化的 3 事物之间的关系是复杂的 多变的 事物的基本特征 1 封装 保护功能相对独立性 2 继承加快事物发展的速度提高事物发展的质量 3 多态 透过现象抓本质 以不变应万变 事物间的关系 泛化关系 Generalization 聚合关系 Aggregation 组合关系 Composition 依赖关系 Dependency 关联 Association 类与对象 世界由万物构成 经由前面的学习 我们知道研究物理世界要用分类的方法 在面向对象程序设计中用类 class 来模拟一类事物 类的定义需用关键字class 定义一个简单类的语法如下 class类名 该行称为类头 大括号之间的部分称为类体零或多个属性 零或多个方法 其中属性的定义格式有两种 如下 1 类型属性名 属性值 2 类型属性名1 属性值1 属性名2 属性值2 类定义举例 1classStudent 2Stringsno 学号3Stringname major 姓名 专业4intage 年龄56voidshowInfo 7System out println 学号 sno t姓名 name 8 t年龄 age t专业 major 9 1011Student 第一种构造方法12 1314 第二种构造方法 15Student Stringsno1 Stringname1 Stringmajor1 intage1 16sno sno1 17name name1 18major major1 19age age1 20 21 22 实例对象 实例对象可以使用类的构造方法和new关键字构造出来 语法为 类名对象引用 new构造方法 例如 Studentt newStudent 类的成员 1 成员属性的定义成员属性也称为成员变量 定义一个成员属性 格式为 修饰符 类型成员属性名 成员属性值 例如 inta 10 intb Strings1 Strings2 newString abc 其中修饰符暂不讲 详见3 8节 2 成员方法的定义语法为 修饰符 返回类型方法名 形式参数列表 throws异常类型列表 方法头执行语句块 方法体 成员变量的初始化 构造方法 当使用new关键字创建一个类实例对象时 系统 JVM 会自动调用该类的构造方法来完成类实例对象的构建 从而构造方法对类定义来说是必须的 那么我们在类中如何声明一个构造方法呢 如下 访问修饰符 类名 参数列表 构造方法的几点说明 1 构造方法的访问修饰符可以是public protected或者缺省 即不用访问修饰符 但不允许private 2 构造方法的名称和类名相同 但没有返回类型 3 若没有定义任何构造方法 则在编译阶段编译器会在编译后的字节码文件中插入一个默认的构造方法 默认的构造方法是 无参数列表 访问修饰符和类的访问修饰符相同 方法体内为空 4 构造方法本身不能递归调用 5 构造方法体的最后一行语句可以是空的return语句 即 return 也可以不用return语句 6 可在一个类中定义多个构造方法 其区别在于参数列表不同 这是构造方法的重载 关于重载 详见3 5 1节 封装的Java表达与访问修饰符 封装有两个作用 保护作用和增强对象的独立性 保护作用是通过设置访问修饰符来实现的 访问修饰符有4个 public protected 默认访问修饰符 private 其中默认访问修饰符就是没有修饰符 即不用public protected private中的任何一个 访问修饰符用于对类 成员属性和成员方法设置访问权限 对它们实施保护作用 访问修饰符 1 public可用于修饰类 成员变量和方法 表明该成员变量和方法是共有的 能在任何情况下被访问 Java应用程序中的main 方法必须用public来修饰 否则能通过编译 但不能运行 就是为了使JVM能够访问它 在一个源代码文件中最多只能定义一个public类 且该类名必须和源代码文件同名 2 protected只能用于修饰成员属性或成员方法 不能修饰类 用protected修饰的成员可以被同包 package 下其他类方法访问 也可以被不同包下的子类方法访问 3 默认访问修饰符修饰的成员只能被同包下的类方法访问 4 private修饰的成员只能被同类中的方法来访问 这4种访问修饰符的访问范围由大到小 或安全保护程度由低到高依次是 public protected 默认访问修饰符 private 举例 1classT 2privateStrings abc 3publicStringgetS 称作访问方法4returns 5 6 78classTest 9publicvoidfunc 10Tt newT 11Strings1 t s 非法12Strings2 t getS 合法13 14 继承 继承的作用 一是提高了软件的开发速度 二是提高了开发软件的质量 继承有广义和狭义之分 广义的继承有些拿来主义的味道 因此在Java中分为横向手法和纵向手法 横向手法是指采用import语句来继承要使用的类或Java接口 纵向手法是指采用extends关键字来实现的手法 狭义的继承就是只指纵向手法 无论是横向手法还是纵向手法都不违背继承的两个作用 在面向对象编程中继承概念通常是指狭义的 举例 1classStudent 2publicvoidfunc 3System out println Student 4 5 67classFreshmanextendsStudent 8publicstaticvoidmain String args 9Freshmanb newFreshman 1011 能够调用Freshman对象的func方法 12 说明func来自Student 13 14b func 15 16 Java不支持多重继承 单继承使Java的继承关系很简单 一个类只能有一个父类 易于管理程序 同时一个类可以实现多个接口 详见3 6节 从而克服单继承的缺点 继承描述的是一种isa关系 例如上例FreshmanisaStudent 是一种特殊与一般的关系 继承是在两个不同的类之间发生的一种关系 被继承的内容是建立在访问权限 受访问修饰符控制 可访问的基础上的 有以下结论 1 子类的访问修饰符不小于父类的访问修饰符 private 默认 protected public 2 private修饰的成员不可以被继承 3 默认访问修饰符修饰的成员只能被同包下的其他类继承 4 构造方法不能被继承 父类 属性1 属性2 属性3 方法 子类图3 2类的继承关系 5 不管父类是否是abstract的 子类可以声明为abstract的 同样 父类中的方法不管是否是abstract的 在子类中都可以把该方法声明为abstract的 继承的UML表示 this与super关键字 this代表类实例对象自身 super代表父类实例对象 在一个类中可以定义多个构造方法 若在一个构造方法中调用另一个构造方法时 必须使用this super不可以连续使用 多态的Java表达 ava表达多态的方式有两种 一是重载 overload 二是覆盖 override 重载 重载是指在同一个类中定义多个同名方法 要求他们的参数列表不同 区分重载方法只能通过参数列表 例如 1classT 2publicvoidfunc 3System out println func 4func 10 输出结果为a 105 6publicvoidfunc inta 7System out println a a 8 9protectedintfunc inta intb 10Stringfunc Strings 11 重载说明 重载方法对修饰符列表 返回类型 抛出异常类型 详见第5章 是否相同均不作要求 区别仅仅在于参数列表 重载方法是程序的一种静态结构 即重载方法之间的关系在编译器编译后就确定了 不会随程序代码的执行来动态确定 这一点和覆盖不同 覆盖是程序的一种动态结构 正是由于重载是一种静态结构 所以完全可以把重载方法看作是各自不同的方法 这一点与不同名的方法之间的关系没有什么区别 在一个重载方法内可以直接调用另外一个重载方法 但在一个重载的构造方法内却不能直接调用另一个重载的构造方法 必须使用this 覆盖 覆盖是指在具有继承关系的两个不同类中定义同名方法 是建立在继承的基础上的 要求如下 1 private方法不能被覆盖 因为private方法不允许被继承 2 方法名 返回类型 参数列表必须相同 3 子类方法的访问修饰符 父类方法的访问修饰符 4 子类中的覆盖方法的修饰符不能是final static 因为final修饰的标识符是不可改变的 而覆盖就是对父类方法的一种修改 若父类方法不需要修改 只采用继承就好了 static是一种静态行为 而覆盖则是一种动态行为 5 子类中的覆盖方法声明的抛出异常不能是父类被覆盖方法声明的抛出异常的祖先类 只能是其子类或同类 子类中的覆盖方法也可以不声明抛出异常 尽管父类中的被覆盖方法声明抛出了异常 详见第5章 成员变量的覆盖 方法可以被覆盖 成员变量也可以被覆盖 举例1classT1 2publicStrings T1 3publicStringgetS 4returns 5 6 7classT2extendsT1 8publicStrings T2 9publicStringgetS 10returns 11 12 13classTest 14publicstaticvoidmain String args 15T1t1 newT1 16T2t2 newT2 1718System out println t1 s 输出T119System out println t1 getS 输出T120System out println t2 s 输出T221System out println t2 getS 输出T22223t1 t2 24System out println t1 s 输出T1 而不是T225System out println t1 getS 输出T2 而不是T126 27 程序分析 从上面程序24 25两行代码的输出结果 可以得出如下结论 1 成员变量可以被覆盖 2 若直接访问发生覆盖的成员变量 则只能访问引用类型的成员变量 上例中第24行 虽然t1指向的对象是T2类型的 但引用t1的类型是T1 故输出结果是T1 3 若通过发生覆盖的方法来访问发生覆盖的成员变量 则访问的成员变量和方法属于同一个对象 例如第25行 t1指向的对象是T2类型的 方法getS 是属于T2实例对象的 故访问的变量是T2实例对象的 所以 若上例中没有第8行代码 则成员变量s会被继承 从而第25行代码的输出是T1 若没有第9 11行代码 会发生方法的继承 但方法本身还是类T1的 不是T2的 故第25行代码的输出是T1 小结 物理世界与面向对象类与对象面向对象基本特征封装访问修饰符继承多态重载覆盖 作业 习题3 1 2 3
展开阅读全文
相关资源
相关搜索

当前位置:首页 > 图纸专区 > 课件教案


copyright@ 2023-2025  zhuangpeitu.com 装配图网版权所有   联系电话:18123376007

备案号:ICP2024067431-1 川公网安备51140202000466号


本站为文档C2C交易模式,即用户上传的文档直接被用户下载,本站只是中间服务平台,本站所有文档下载所得的收益归上传人(含作者)所有。装配图网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。若文档所含内容侵犯了您的版权或隐私,请立即通知装配图网,我们立即给予删除!