Java面向对象程序设计(面向对象与异常)ppt.ppt_第1页
Java面向对象程序设计(面向对象与异常)ppt.ppt_第2页
Java面向对象程序设计(面向对象与异常)ppt.ppt_第3页
Java面向对象程序设计(面向对象与异常)ppt.ppt_第4页
Java面向对象程序设计(面向对象与异常)ppt.ppt_第5页
已阅读5页,还剩115页未读 继续免费阅读

下载本文档

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

文档简介

第四章面向对象 上 什么是抽象类与对象及其关系类中定义的属性 域 与方法 操作 对象构造方法类成员属性和方法的其它修饰符包 Package 主要内容 什么是抽象 抽象的定义 抽象 abstraction 是从被研究对象中舍弃个别的 非本质的 或与研究主旨无关的次要特征 而抽取与研究有关的共性内容加以考察 形成对研究问题正确的简明扼要的认识 类与对象及其关系 类与对象及其关系 对象是对客观事物的抽象 类是对对象的抽象 在语言中是一种抽象的数据类型 类的定义在Java中可简述为class类名 它们的关系是 对象是类的实例 类是对象的模板 类中定义的属性与方法 类中定义的属性 域 与方法 操作 类和对象都有属性和操作 属性是事物静态特征的抽象 操作是事物动态特征的抽象 classFighterPlane Stringname intmissileNum voidfire if missileNum 0 missileNum 1 System out println nowfireamissile else System out println Nomissileleft 类的属性或称为 域 类的方法 类中的域变量和方法存在以下关系 类中定义的域变量可以被类中所有的方法所访问 方法中的形式参数和定义的局部变量的作用域仅限于方法 局部变量在使用前必须进行赋值初始化 如果局部变量和类中的属性变量重名 则在方法中对同名变量改变的是局部变量 类中定义的方法可以进行递归调用 例4 2 对象 对象的产生 对象的产生使用的代码 newFighterPlane 对象的声明使用的代码 FighterPlanefp 可以声明后立即赋予对象 FighterPlanefp newFighterPlane 对象内存空间分布 对象作为参数的特点 普通数据类型作为参数传递是值传递 而对象是引用传递 publicclassX privatestaticinta publicstaticvoidmain String args modify a System out println a publicstaticvoidmodify inta a 本程序的输出为0 因为a 是对形式参数进行自增 而不是对象属性a进行自增 对象的引用传递举例 classIntClass intvalue publicclassRunIntClass publicstaticvoidmodifyValue IntClasss intval s value val publicstaticvoidmain Stringargs IntClassa newIntClass modifyValue a 8 System out println a value 对象是引用传递 当对象作为参数传递时 传递的是对象的地址 classIntClass intvalue publicclassRunIntClass publicstaticIntClassgetInstance 在方法中产生对象IntClasss newIntClass s value 8 returns 引用返回 publicstaticvoidmain Stringargs 调用环境中去使用IntClassa getInstance System out println a value 对象 a 对象数组 数组对象特点及常用方法 构造方法 构造方法的概念 例4 8 构造方法的特征 例4 9 4 10 构造方法的注意事项 finalize方法与垃圾回收 类成员属性和方法的其它修饰符 static 用static修饰符修饰的数据成员是不属于任何一个类的具体对象 而是属于类的静态数据成员 它被保存在类的内存区的公共存储单元中 而不是保存在某个对象的内存区中 因此 一个类的任何对象访问它时 存取到的都是相同的数值 访问方式为通过类名加点操作符来访问 也可通过对象引用来访问 Static修饰的方法有如下特点 static方法是类方法 但可以被所有对象所访问 引用这个方法时 可以使用对象名做前缀 也可以使用类名做前缀 static方法内部的代码 只能访问类中的static属性或方法 不能访问类中的非static属性或方法 因为那是对象方法 但非static方法 对象方法 可以访问static数据成员 main方法是特殊的静态方法 是Application程序入口点 必须写成publicstaticvoidmain Stringargs 的形式 静态代码块 一个类中可以使用不包含在任何方法体中的静态代码块 当类被装载时 静态代码块被执行 且只被执行一次 静态代码块经常用来对类中定义的属性进行初始化 classTest staticintvalue static value 3 System out println value value publicstaticvoidmain String args 程序输出结果为3 final final修饰属性 则属性为常量 如果修饰方法 则方法称为最终方法 在子类当中不能被覆盖 见多态一节 可防止任何继承类修改此方法 保证了程序的安全性和正确性 publicConstant staticfinalintOK 0 staticfinalintCANCEL 1 可以在Constant类中定义一些静态常量 在别的类当中这样来使用 Constant OK 也可定义对象的属性常量 包 Package 包 Package 随着Java的应用 SUN公司的JDK 各系统开发商 以及自己开发的类越来越多 如何对这些类进行有效的组织管理和有效使用 Java的解决办法是 包 默认包 例4 16 缺点 打包过程 例4 17 例4 18 步骤 第五章面向对象 中 主要内容 面向对象的特征封装继承类的多态 面向对象的特征 用面向对象语言例如Java所编的程序就一定是面向对象程序吗 封装 概念与特点 访问控制 体现封装 则需要掌握访问控制符public protected private 默认 的用法 在java中这些修饰符可以修饰的地方有3种 修饰类修饰类的属性成员 域 修饰类的成员方法 访问权限首先看类前的修饰符 当类的修饰符为public时 则类可以被所有的类所访问 可以import 当为默认时 则只能为包中的类所访问 在此前提下 再看方法前的修饰符 类前修饰符为public时 当属性和方法前的修饰符为public时 则该属性可以被所有类访问 当属性和方法前为protected修饰时 对于类定义而言 可以被同包中的类和所有子类访问 子类和父类可以不在同一个包中 也就是B C范围 但对于对象而言 只能被同一个包的类对象所访问 也就是B的范围 当为默认时 只能被同包中的类所访问 比protected访问权限小 当为private时 只能被本类内部所访问 访问控制举例5 2 5 5 消息 消息的实质就是引用向对象发出的服务请求 是对数据成员和成员方法的调用 例如fp name和fp fire 就是发送消息 能否发送消息取决于 引用必须引用了特定的对象 否则会在运行是抛出NullPointerException异常 对象必须定义了相应的属性或方法 否则编译不会通过 被访问的属性或方法必须具有可访问的权限 例5 6 继承 继承 通过extends关键字实现 子类可以从父类继承所有非private的属性和方法作为自己的成员 子类在继承父类的时候 首先应该满足父类可被访问 例如当子类和父类不在同一个包当中时 父类修饰符必为public 在父类能被访问的前提下 凡是修饰符为public或是protected的父类属性成员或是方法能被子类所访问 private的属性成员或是方法则不能被访问 例5 7 FighterPlane和Plane类中的属性和方法统统被拷贝到FighterPlane对象当中 包括Plane中的private属性成员 但是FighterPlane对象内部无法直接访问 必须通过setName和getName方法间接访问 Object类是所有类的共同祖先 即使定义类时没有写extentsObject 在Object当中定义了许多方法 这些方法都可以被所有子类所继承 Object类 在框架编程中的应用 继承的作用 最终类 被final修饰的类为最终类 不能有子类 多态 多态的定义 多态的概念 多态是指一个程序中同名的不同方法共存的情况Java中提供两种多态的机制 重载 overloading 与覆盖 overriding 类Parent中有两个getScore方法 它们的参数有所不同 classParent publicintgetScore return3 publicintgetScore inti returni 重载例1 重载例2 publicAudioClipgetAudioClip URLurl publicAudioClipgetAudioClip URLurl Stringname try 通过重新构造一个新的URL对象 之后调用上面的同名方法来实现功能 returngetAudioClip newURL url name catch MalformedURLExceptione returnnull 如 classApplet 重载例3 publicbooleanaddAll Collectionc returnaddAll size c size是链表长度 此方法调用下面的方法 将传入对象插入到指定链表尾部 index是链表的当前索引号publicbooleanaddAll intindex Collectionc 再如 java util ClassLinkedList 子类对父类的同名方法 方法名称相同 参数相同 返回类型相同 重新进行定义 即在子类中定义与父类中已定义的相同名而内容不同的方法 覆盖 方法名称相同 参数名称相同 返回类型相同 覆盖方法名称相同 参数名称不同 重载方法名称相同 参数名称相同 返回类型不同 编译不能通过 classParent publicintgetScore return3 publicStringgetCountryName return China 覆盖例1 classSonextendsParent publicintgetScore return4 publicclassRunSon publicstaticvoidmain Stringargs Sons newSon System out println s getScore System out println s getCountryName 输出结果 4China 子类的访问修饰符权限应等于或大于父类static方法不能覆盖非静态方法 也不能被非static方法覆盖 但是static方法可以覆盖static方法方法前有final修饰符 此方法不能在子类方法中进行覆盖在JDK中 很多父类的方法被子类重新覆盖 赋予了不同的含义 如Object类中的booleanequals Objectobj 方法抽象类中如果存在抽象方法 则具体子类必须对抽象方法进行覆盖 覆盖 注意 classSuper publicIntegergetLenght returnnewInteger 4 publicclassSubextendsSuper publicLongGetLenght returnnewLong 5 publicstaticvoidmain String args Supersooper newSuper Subsub newSub System out println sooper getLenght toString sub getLenght toString 覆盖例2 输出结果 4 4 第六章面向对象 下 主要内容 this与super构造方法的多态与继承抽象类接口抽象类与接口引用类的其他相关内容 this与super this this指代当前对象 主要应用场合 在一些容易混淆的场合 如成员方法的参数名与数据成员同名 成员方法的局部变量名与数据成员同名 this 参数 引用重载的构造方法 见后节 this指带对象 例5 6 super super访问当前类的直接父类 主要应用场合 子类的数据成员或成员方法与父类的数据成员或成员方法名字相同时 当要调用父类的同名方法或同名数据成员时则可用super来指明 即super 数据成员 super 成员方法super 参数 调用父类构造函数 classA intx 4 inty 1 publicvoidPrintme System out println x x y y System out println classname getClass getName publicclassAAextendsA intx publicvoidPrintme intz super x 6 super x 5 super Printme System out println Iaman getClass getName x 6 System out println z z x x super x super x y y super y y publicstaticvoidmain Stringarg intk Ap1 newA AAp2 newAA p1 Printme p2 Printme 运行结果如下 x 4y 1classname Ax 5y 1classname AAIamanAAz 10 x 6super x 5y 1super y 1 讲解 子类和父类定义了同名数据成员 子类继承了父类的x 自己又定义了一个x 则会发生父类数据成员的隐藏 在子类中用的x都是子类自己的 若要使用父类x 则必须用super x 子类在覆盖父类方法的同时 调用父类的super Printme 这个方法中的成员变量均为父类的成员变量 super Printme 中的代码虽然调用父类代码 但其中的this指的是子类对象 A x 4 y 1 VoidPrintme AA x 4 y 1 x VoidPrintme intz super x 6 super x 5super Printme System out println Iaman this getClass getName x 4在子类隐藏 此处调用的是父类代码及父类中的属性成员 构造方法的多态与继承 构造方法的多态 构造方法的多态 重载和覆盖 一个类的若干个重载的构造方法之间可以相互调用 当一个构造方法需要调用另一个构造方法时 可以使用关键字this 同时这个调用语句应该是整个构造方法的第一个可执行语句 使用关键字this来调用同类的其它构造方法 优点同样是以最大限度地提高对已有代码的利用程度 减少程序的维护工作量 例6 3 构造方法的继承 构造方法的继承遵循以下的原则 父类构造方法 子类可以在自己的构造方法中使用super来调用 但必须是子类构造方法的第一个可执行语句 若子类构造方法中没有显式调用父类构造方法 也没有用this调用重载的其它构造方法 则在产生子类的对象时 系统在调用子类构造方法的同时 默认调用父类无参构造方法 若子类构造方法中显式调用了父类构造方法 或使用了this 则不会默认调用父类无参构造方法 综上两点 子类的构造方法必定调用父类的构造方法 如果不显式用super方法 必然隐含调用super 例6 4 6 5 子类对象实例化的过程 为对象分配内存空间 对成员变量进行默认的初始化 注 局部变量必须进行显示初始化 绑定构造方法 将new中的参数传递给构造方法的形式参数 调用this或super语句 二者必居其一 不能同时存在 有了this 则第四步被省略 但有了super则不省略 进行实例变量的显式初始化操作 如 publicclassA intvalue 4 显式初始化Bb newB 显式初始化 注 B为一另一个类 执行当前构造方法的方法体中的程序代码 如果本类是applet 则init 方法在构造方法调用后执行 见下图 对象成员变量初始化流程图 classPare inti 3 Pare classConstructextendsPare inti 8 Construct Construct intnum this intgetSuper returnsuper i publicstaticvoidmain String args Constructct newConstruct 9 System out println ct i System out println ct getSuper classConstruct inti 1 Construct intnum inti this i i publicstaticvoidmain String args Constructct newConstruct 2 3 System out println ct i 抽象类 抽象类的定义 抽象 abstract 类的概念 用abstract修饰的类称为抽象类 用abstract修饰的成员方法称为抽象方法 抽象类和具体类的关系就是一般类和特殊类之间的关系 是继承和被继承的关系 抽象类中可以有零个或多个抽象方法 也可以包含非抽象方法 只要有一个抽象方法 类前就必须有abstract修饰 若没有抽象方法 类前也可有abstract修饰 抽象类不能创建对象 创建对象由具体子类来实现 但可以有声明 声明能引用所有具体子类的对象 对于抽象方法 在抽象类中只指定方法名及类型 而不写实现代码 抽象类必定要派生子类 若派生的子类是具体类 则具体子类中必须实现抽象类中定义的所有抽象方法 覆盖 若子类还是抽象类 如果父类中已有同名abstract方法 则子类中就不能再有同名的抽象方法了 在抽象类中 非抽象方法可以调用抽象方法 abstract不能与final并列修饰同一个类 产生逻辑矛盾 abstract不能与private static 因为static修饰的方法必然被直接调用 final或native并列修饰同一个方法 abstract类中不能有private成员 这些因为抽象类必然要有子类 抽象类的产生过程 抽象类形成的思维过程 客观事物 对象 类 抽象类 如 矩形 三角形 圆形类的属性和方法如图 对以上三类进行抽象 程序 importjava awt importjava applet abstractclassShapes protectedintx y k protecteddoublem publicShapes intx inty intk doublem this x x this y y this k k this m m abstractpublicdoublegetArea abstractpublicdoublegetPerimeter classCircleextendsShapes publicdoublegetArea return m m Math PI publicdoublegetPerimeter return 2 Math PI m publicCircle intx inty intwidth m充当了半径 k充当了直径super x y width width 2 0 classRectangleextendsShapes publicdoublegetArea return k m publicdoublegetPerimeter return 2 k 2 m publicRectangle intx inty intwidth intheight super x y width height classTriangleextendsShapes publicdoublegetArea return Math sqrt m m k m x m y publicdoublegetPerimeter return k x y publicTriangle intbaseA intbaseB intbaseC super baseA baseB baseC 0 m充当了周长的一半m baseA baseB baseC 2 0 publicclassRunShapeextendsApplet Rectanglerect newRectangle 5 15 25 25 Triangletri newTriangle 5 5 8 Circlecir newCircle 5 90 25 publicvoidpaint Graphicsg 绘制矩形 输出矩形的面积和周长g drawRect rect x rect y rect k int rect m g drawString RectArea rect getArea 50 35 g drawString RectPerimeter rect getPerimeter 50 55 输出三角形的面积和周长g drawString TriangleArea tri getArea 50 75 g drawString TrianglePerimeter tri getPerimeter 50 95 绘制圆 输出圆的面积和周长g drawOval cir x int cir k 2 cir y int cir k 2 cir k cir k g drawString CircleArea cir getArea 50 115 g drawString CirclePerimeter cir getPerimeter 50 135 运行结果 可引用具体子类对象 publicclassRunShapeextendsApplet Rectanglerect newRectangle 5 15 25 25 Triangletri newTriangle 5 5 8 Circlecir newCircle 5 90 25 增加两个方法 注意抽象类的声明为s ab为字符串输出的坐标 privatevoiddrawArea Graphicsg Shapess inta intb g drawString s getClass getName Area s getArea a b privatevoiddrawPerimeter Graphicsg Shapess inta intb g drawString s getClass getName Perimeter s getPerimeter a b publicvoidpaint Graphicsg g drawRect rect x rect y rect k int rect m drawArea g rect 50 35 drawPerimeter g rect 50 55 drawArea g tri 50 75 drawPerimeter g tri 50 95 g drawOval cir x int cir k 2 cir y int cir k 2 cir k cir k drawArea g cir 50 115 drawPerimeter g cir 50 135 抽象类设计注意 在设计抽象类的具体子类时 追求它们在实现抽象方法方面所表现的不同性 例如作为shapes 当s引用矩形时 返回矩形周长和面积 当引用三角形时 返回三角形周长和面积 当引用圆时返回圆周长和面积等等 作为抽象类的具体实现者 每个子类必须给出其周长和面积的具体计算方式 在确定抽象类的抽象方法时 一定要确保这些抽象方法就是同类对象共同行为的抽取 否则 抽象方法的设计不当 会为继承这个抽象类的体系带来不利影响 因为抽象类中的任何改动都将关系到整个类体系的改变 所以抽象类中的信息应尽可能和研究对象的本质相关 抽象类 设计不当的举例 abstractclassDoor publicabstractvoidopen publicabstractvoidclose publicabstractvoidalarm 报警门子类的代码实现如下 classAlarmDoorextendsDoor publicvoidopen publicvoidclose publicvoidalarm 但其它类也要继承Door 由于继承关系 必须实现一个和它不相干的方法alarm 这显然对于其它子类的实现带来不便 接口 interface 接口的两种含义 可以被引用调用的方法 public方法或同包中的protected方法或默认方法 另一种是同 类 概念地位相当的专有概念interface interface是方法说明的集合 interface声明格式 public interface接口名 extends父接口名列表 静态常量数据成员声明 public static final 域类型域名 常量值 抽象方法声明 public abstract 返回值方法名 参数列表 throw异常列表 定义接口要注意几点 接口定义用关键字interface 而不是用class interface前的修饰符要么为public 要么为缺省 接口定义的数据成员全是finalstatic 静态常量 即使没有修饰符 其效果也等效 访问级别要么为public 要么为缺省 接口中没有构造方法 所有成员方法都是抽象方法 与抽象类有所不同 即使没有修饰符 其效果完全等效 访问级别要么为public 要么为缺省 注 方法前不能修饰为final 接口具有继承性 可通过extends关键字声明接口的父接口 接口的角色 接口扮演将实现者和使用者有机联系到一起的角色 例6 10 接口实现要注意几点 在类中 用implements关键字来实现接口 一个类可以实现多个接口 在implements后用逗号隔开多个接口的名字 一个接口也可被多个类来实现 接口的实现者可以继承接口中定义的常量 其效果等效于在这个实现类当中定义了一个静态常量 如果实现某接口的类不是abstract的抽象类 则在类的定义部分必须实现接口的所有抽象方法 而且方法头部分应该与接口中的定义完全一致 如果实现接口的类是abstract类 则它可以不实现该接口的所有方法 但对于抽象类的任何一个非抽象的子类而言 接口中的所有抽象方法都必须实现 这些方法体可以来自抽象的父类 被子类继承 也可以来自子类自身的实现 这主要体现了非抽象类中不能存在抽象方法的原则 接口的抽象方法的访问限制符如果为缺省或public时 类在实现方法时 必须显式使用public修饰符 否则将被警告为缩小了接口中定义的方法的访问控制范围 接口在Java事件处理中的应用 接口在编程中的作用 例6 11 例6 12 抽象类与接口 抽象类与接口 引用 引用要点 引用如何形成 先声明 后赋予对象 成为引用 抽象类声明进行引用有什么特点 抽象类声明可以引用所有具体子类对象 此概念可以推广到所有具有父子关系的类 以及接口和实现类 引用可以替换吗 替换是有原则的 父类引用可以指向子类对象 子类声明不能引用平行级别的其它类的对象 也不能引用父类对象 父类声明和子类声明引用同一个子类对象有什么区别 父类声明是从父类的角度去引用对象 子类声明是从子类角度引用对象 父类引用子类对象时 可以经过显式的转化赋给子类的声明 但子类的引用赋值给父类的声明则不需要 接口声明进行引用有什么特点 只能引用实现类对象的接口方法 例6 13 引用比较 instanceof的用法 判断某个对象是否为某个类的可引用实例 equals方法 equals方法是object的方法 因此 所有类可以利用它比较本引用和某个引用是否指向同一对象 如果两边是对象引用则比较的是它们的引用是否相同 如果两边是数值 则比较的是它们的值 如果值类型不同 有可能发生类型转化 例如10 10 0将返回true 如果一边是引用 一边是值 则编译错误 例6 14 例6 15 引用案例 类的其它相关内容 类的完整定义形式 修饰符 class类名 extends父类 implements接口名1 接口2 类成员变量 类方法 注 其中修饰符为 public 缺省 abstract final不能被private protected所修饰 内部类就是在某个类的内部又定义了一个类 内部类 内部类相关要点 例6 17 例6 18 例6 19 所谓匿名内部类就是在类中需要实例化这个类的地方 通常为方法内 定义一个没有名称的类 其通常的实现格式为 格式一 new类A 方法体 此时产生的对象是类A的子类对象 格式二 new接口A 方法体 此时产生的对象是接口A的实现类 匿名内部类 例6 20 例6 23 使用原则和条件 匿名对象 匿名对象就是在产生对象时没有显式地为这个对象建立引用 例如Personp1 newPerson p1 shout 如果改为newPerson shout 就是匿名对象了 匿名对象在两种情况下经常使用 如果对一个对象只需要进行一次方法调用 将匿名对象作为参数传递给一个函数调用 类对象 在java lang包中有一个特殊的类 Class 注 同关键字class区别的地方是首字母大写 它也继承Object类 通过调用对象方法getClass而得到Class对象 进而我们可以知道类的相关的一些特性 如 类的名称 类的包 类的方法 类的父类等待 第七章异常 主要内容 异常含义异常分类异常处理自定义异常与异常对象的主动产生 异常含义 正常情况以外的事件 具有不确定性 遇到异常后程序不能正常向下执行 例如 用户输入错误 除数为0 需要的文件不存在或打不开 数组下标越界 传入参数为空或不符合指定范围 例7 1 publicclassExampleException publicstaticvoidmain String args inta b c a 67 b 0 c a b System out println a b c 运行结果 Exceptioninthread main java lang ArithmeticException byzero 除数为0 异常分类 异常分类 异常处理 异常处理 例7 1 7 4 例7 5 7

温馨提示

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

评论

0/150

提交评论