Java深入面向对象编程.ppt_第1页
Java深入面向对象编程.ppt_第2页
Java深入面向对象编程.ppt_第3页
Java深入面向对象编程.ppt_第4页
Java深入面向对象编程.ppt_第5页
已阅读5页,还剩34页未读 继续免费阅读

下载本文档

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

文档简介

深入面向对象编程 本章内容 类的继承高级访问控制包 运算符与equals 方法Object类的方法 类的继承 继承是面向对象程序设计语言的另一重要特征 理解继承是理解面向对象程序设计的关键 通过继承可以实现代码的复用 使程序的复杂性线性的增长 而不是随规模的增大呈几何级数增长 在Java中 通过关键字extends继承一个已有的类 被继承的类称为父类 超类 基类 新的类称为子类 派生类 在Java中 不允许多继承 即一个类只能有一个父类 车辆 机动车 非机动车 内燃机车 电车 人力车 蓄力车 柴油机车 汽油机车 马车 手推车 自行车 继承示例 类的继承 继承能够使子类拥有父类的所有的属性和方法 而不需要在子类的类定义时重新定义父类的这些属性和方法 子类即可以保持父类原有的属性和方法 也可以对从父类那里继承而来的属性和方法进行修改 在定义了继承关系后 我们改动父类的一个属性或方法时 子类也会自动改变 但是这些属性和方法必须是非私有 并且没有被子类重新定义的注 子类拥有父类的所有的属性和方法但不能访问父类中的私有属性与方法 一个继承的例子 publicclassStudentextendsPerson privateintid publicvoidsetId intid this id id publicvoidstudy System out println getName isreading publicvoidshowInfomation System out println id id name getName age getAge publicstaticvoidmain String args Studentstu newStudent stu setName zhangsan stu setAge 20 stu study stu showInfomation 构造方法不能被继承 子类不从超类继承构造方法子类的构造方法一定会调用父类的构造方法 默认调用不带参的构造方法在子类中用super 来调用父类的构造方法 特殊变量super 特殊变量super 提供了对父类的访问 可以使用super访问父类被子类隐藏的变量或覆盖的方法 每个子类构造方法的第一条语句 都是隐含地调用super 如果父类没有这种形式的构造方法 那么在编译的时候就会报错 方法的覆盖 override 在子类中定义一个与父类同名 返回类型 参数类型均相同一个方法 称为方法的覆盖 覆盖发生在子类与父类之间 方法覆盖的规则 覆盖方法的返回值类型必须与它所覆盖的方法相同覆盖方法不能比它所覆盖的方法的访问性差覆盖方法不能比它所覆盖的方法抛出更多的异常 方法的覆盖与重载的区别 方法的覆盖是子类和父类之间的关系 而重载可以是发生在一个类内部多个方法间方法的覆盖一般是两个方法间的 而重载时可能有多个重载方法覆盖的方法有相同的方法名和形参表 而重载的方法只能有相同的方法名 不能有相同的形参表覆盖时区分方法的是根据调用他的对象 而重载是根据形参来决定调用的是哪个方法用final修饰的方法是不能被子类覆盖的 只能被重载 多态的概念 多态是指在一棵继承树中的类可以有多个同名但不同方法体以及不同形参的方法 有两种情况 覆盖 在子类中直接定义和父类同样的属性和方法 但重新编写了方法体 即子类与父类方法的形参与返回值都相同 而内部处理不同 这种方法在使用过程中 Java虚拟机会根据调用这个方法的对象来确定哪个方法被调用重载 同一个类定义中有多个同名的方法 但有不同的形参 而且每个方法有不同的方法体 调用时根据形参的个数和类型来决定调用的是哪个方法 对象在继承关系中改变 Java语法规定 子类实例可以被当作父类的一个对象使用 而父类实例不能被当作子类的一个对象使用如果一个被父类对象通过赋值指向的地址是子类对象所在的地址 按照前一条准则 这个对象仍然是父类的对象 但它可以通过强制类型转换成子类对象 对象的类型转换 类型转换用来恢复一个对象的全部功能向上的类型转换 子类转父类 是隐含地实现的向下的类型转换 父类转子类 必须针对子类 并由编译器检查 也就是说类型转换只能发生在有继承关系的父类与子类之间可以使用instanceof来测试一个对象的类型 类型转换示例 Personperson newPerson Studentstudent newStudent Workerworker newWorker person student person worker worker Worker person student Student person 执行出错 抛出ClassCastExceptionworker Worker student 编译出错 两个对象没有继承关系if personinstanceofStudent studentstudent Student person if personinstanceofWorker worker Worker person 多态性的一个呈现 请指出下面代码的执行结果 classPerson publicvoidshowInfo System out println iamaperson classStudentextendsPerson publicvoidshowInfo System out println iamastudent classTest publicstaticvoidmain String args Personp newStudent p showInfo 包 package 为了便于管理大型软件系统中数目众多的类 解决类命名冲突的问题 Java引入了包 package 包 package package语句必须是文件中的第一条语句 也就是说 在package语句之前 除了空白和注释之外不能有任何语句 如果不加package语句 则指定为缺省包或无名包 包对应着文件系统的目录层次结构 在package语句中 用 来指明包 目录 的层次 编译并生成包 在当前目录下生成包javac d Test java在指定目录下生成包javac dE JavaLessonTest java import语句 引入包中的类 importjava io File 引入整个包 importjava io 在同一包中的类可以互相引用 无需import语句 高级访问控制 类的访问说明符1 public 能被其它所有的类访问和引用 可使用import从另一个包中引入所需要的类 但被引入的类必须是public修饰 2 默认 friendly 只能被同一个包中的类访问和引用 一个 Java文件必须有而且最多有一个public修饰的类 且该类的名称要与 java的文件名一致 高级访问控制 方法的访问说明符1 public 如果类也是public修饰的话 这些属性和方法可以被所有的类访问和使用2 private 只能被该类自身访问和调用3 protected 保护访问控制符 可被同一个包中的类或不同包中该类的子类以及该类自身访问和引用4 默认 具有包内访问性 只能被同一个包中的其他类访问和引用 方法的访问控制 不同情形下 访问说明符 到此为止 final final在变量之前 则定义一个常量 final在方法之前 该方法不能被覆盖final在类之前 该类不能被继承 常量的定义 使用关键字final定义常量 例如 finaldoublePI 3 1415926 作为一种约定 在定义常量时 通常采用大写形式 final常量可以在声明的同时赋初值 也可以在构造函数中赋初值 为了节省内存 我们通常将常量声明为静态的 static final方法 为了确保某个函数的行为在继承过程中保持不变 并且不能被覆盖 overridden 可以使用final方法 为了效率上的考虑 将方法声明为final 让编译器对此方法的调用进行优化 要注意的是 编译器会自行对final方法进行判断 并决定是否进行优化 通常在方法的体积很小 而我们确实不希望它被覆盖时 才将它声明为final class中所有的private和static方法自然就是final 和 equals 的用法 在Java中 boolean byte short int long char float double这八种是基本数据类型 其余的都是引用类型 是比较两个变量的值是否相等 equals 是比较两个对象变量所代表的对象的内容是否相等 对于基本数据类型的数据 只要他们的值相等 返回true对于两个字符串对象 只要他们的内容一致 equals 返回true 返回false对于没有重写equals方法的对象 c1和c2 和 equals 都返回false对于赋值语句后的结果 c1 c2 和 equals 均返回true 对象的内存分配图 栈内存 堆内存 str1 str2 a b c a b c 0088 4400 0088 4400 0088 4660 0088 4660 str1标识的对象 str2标识的对象 当我们声明一个引用类型变量时 系统只为该变量分配了引用空间 并未创建一个具体的对象 当用new为对象分配空间后 将对象的引用赋值给引用变量 函数的调用 在Java中 传参时 都是以传值的方式进行 对于基本数据类型 传递的是数据的拷贝 对于引用类型 传递的引用的拷贝 函数的调用 x main change 栈内存 y 4 3 3 4 4 3 classStringTest publicstaticvoidchange intx inty x x y y x y x x y publicstaticvoidmain String args intx 3 inty 4 change x y System out println x x System out println y y x y 函数的调用 pt main change 栈内存 堆内存 Point类的对象 pt 0088 4660 0088 4660 0088 4660 classStringTest publicstaticvoidchange Pointpt pt x pt x pt y pt y pt x pt y pt x pt x pt y publicstaticvoidmain String args Pointpt newPoint pt x 3 pt y 4 change pt System out println x pt x System out println y pt y classPoint intx y Object类 Object类是所有类的基类 如果一个类的定义中没有继承任何类 这个类默认继承自Object类Object类中定义了下列主要方法 protectedObjectclone 用来生成当前对象的一个拷贝 并返回这个复制对象 publicbooleanequals Objectobj 用来比较两个对象是否相同 publicClassgetClass 用来获取当前对象所属类的信息 返回class对象protectedvoidfinalize 用来定义回收当前对象时所需完成的清理工作 publicStringtoString 用来返回当前对象本身的有关信息 按字符串对象返回 publicinthashCode 用来返回当前对象的散列码 toString方法 toString 方法用于将一个对象的信息变换出字符串后 返回 当我们使用println obj 来输出一个对象时 默认会调用该对象的toString方法 一个良好的编程习惯是在每一个实体类中 重写toString 方法 以便于调试 下面是Student类中重写该方法的一个示例 publicStringtoString return name name age age equals方法 equals 用于比较两个对象的内容是否相等 当我们执行两个对象的比较时 需要使用到equals方法 如果被比较的对象没有重写该方法 除非它们指向同一个对象 否则永远返回false 在很多其它的JAVA类的某些方法中 如集合类的contains obj 方法 默认也会调用该方法 下面是重写学生类的equals方法的一个示例 publicbooleanequals Objectobj if obj this returntrue if objinstanceofStudent returnfalse Studentother Student obj returnname equals other getName getClass方法 该方法返回对象的结果信息 返回值是Class Class是类结构的封装 是进行类反射的基础 该方法被声明为final的 不能被覆盖 下面的代码演示了如何在程序运行中动态的获取类的完整名字 Objectobj newPerson StringcName obj getClass getName System out println cName hashCode方法 hashCode方法用于返回一个对象的散列码 该方法在某些需要使用对象散列码值的场合 如该对象作为hashtable的key值时 会被调用 正常情况

温馨提示

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

评论

0/150

提交评论