欢迎来到淘文阁 - 分享文档赚钱的网站! | 帮助中心 好文档才是您的得力助手!
淘文阁 - 分享文档赚钱的网站
全部分类
  • 研究报告>
  • 管理文献>
  • 标准材料>
  • 技术资料>
  • 教育专区>
  • 应用文书>
  • 生活休闲>
  • 考试试题>
  • pptx模板>
  • 工商注册>
  • 期刊短文>
  • 图片设计>
  • ImageVerifierCode 换一换

    Java-面向对象编程.ppt

    • 资源ID:80463047       资源大小:1.01MB        全文页数:52页
    • 资源格式: PPT        下载积分:11.9金币
    快捷下载 游客一键下载
    会员登录下载
    微信登录下载
    三方登录下载: 微信开放平台登录   QQ登录  
    二维码
    微信扫一扫登录
    下载资源需要11.9金币
    邮箱/手机:
    温馨提示:
    快捷下载时,用户名和密码都是您填写的邮箱或者手机号,方便查询和重复下载(系统自动生成)。
    如填写123,账号就是123,密码也是123。
    支付方式: 支付宝    微信支付   
    验证码:   换一换

     
    账号:
    密码:
    验证码:   换一换
      忘记密码?
        
    友情提示
    2、PDF文件下载后,可能会被浏览器默认打开,此种情况可以点击浏览器菜单,保存网页到桌面,就可以正常下载了。
    3、本站不支持迅雷下载,请使用电脑自带的IE浏览器,或者360浏览器、谷歌浏览器下载即可。
    4、本站资源下载后的文档和图纸-无水印,预览文档经过压缩,下载后原文更清晰。
    5、试题试卷类文档,如果标题没有明确说明有答案则都视为没有答案,请知晓。

    Java-面向对象编程.ppt

    Java程序设计2面向对象程序设计的特点面向对象程序设计具有三大特征:封装继承多态封装封装:隐藏内部细节,控制外部访问的方式恰当的封装可防止程序员相互干扰,实现了模块化和信息隐藏通过控制对(内部)属性和方法的访问方式来实现封装不要依赖于你不需要知道的知识类和包是Java语言中的基本封装机制类实现了数据和方法的封装包是对一组相互耦合度较高的类型的封装访问控制修饰符JAVA中的访问控制修饰符 public,protected,package public,protected,package(缺省)(缺省),private,private修饰符修饰符类类包包子类子类所有类和包所有类和包privatepackageprotectedpublic关联和聚合对象不是孤立的关联(Association)两个对象间存在某种语义联系方向性关联可以是单向的,也可以是双向的单向关联:A“知道”B,但B不“知道”A双向关联:A“知道”B,B也“知道”A依赖性不完全依赖A“知道”B,因此A依赖于B这种依赖一般是松散的,即A和B的存在都不需要以对方的存在为基础实现时,一般通过保存对方的对象标识来表达关联和聚合关联(Association)的UML表示aProfessoranUniversityEmployeeEmployer关联和聚合聚合(Aggregation)表示两个对象间有整体部分关系一种特殊的关联对象间的聚合关系总是单向的依赖性依赖较强B是A的一部分,如果A聚合B(has-A关系)将B从A中取出,则A往往变得不完整一般情况下,B可以独立于A而存在换句话说,在系统内部存在一个A和B同时都独立存在的暂时状态(当然此时聚合对象的功能不完整)。实现时,一般通过在A中保存B的对象标识来表达关联和聚合聚合(Aggregation)的UML表示aStudentaSchedule关联和聚合复合(Composition)一种更强的聚合关系(特殊的聚合)对象间的复合关系总是单向的依赖性部分的生命周期依赖于整体B不能独立于A而存在B的生命周期受A的控制(B会随着A的创建而创建,随A的消亡而消亡)实现时,一般通过在A中保存完整的B对象来表达B对象的实例化在A中完成关联和聚合复合(Composition)的UML表示aTreeaLeaf关联和聚合练习:以下各组对象之间应是哪种关联关系?学生课本教师学生书前言书作者汽车引擎PCCPU深圳大学深圳大学软件学院顾客合同继承概述继承概述类与类之间还有一种Is-A关系,子类自动获得父类的方法与属性,我们称之为继承 子类拥有父类的一些公有的属性和方法,并且子类可能也会有自己的方法和属性 派生与抽象、特化与泛化除了添加父类中没有的新方法外子类还可以通过重写父类的方法来重定义自己的行为方式 继承基础继承基础重写与重载不同,重载需要不同的参数来区别相同方法名的方法,重写是发生在子类与父类上,重写父类方法必须与父类的方法名同名同参并且同返回值。当访问修饰符为private时,表明该方法不能被重写,同样当方法具有final关键字时该方法不能被重写。子类虽然重写了父类的某个方法,但仍然需要用到父类的这个方法,这时使用super关键字仍然可以调用父类的方法。/TestOstrich.javapublic class TestOstrich public static void main(String args)Bird ostrich1=new Ostrich();/向上转型 ostrich1.fly();class Bird public static void fly()System.out.println(Bird Flying!);class Ostrich extends Birdpublic static void fly()System.out.println(I cant fly!);输出结果:Bird Flying!StaticStatic方法不能重写方法不能重写Bird类派生了鸵鸟Ostrich类,以上程序声明了一个Bird类型的鸵鸟对象,象基本类型数据的自动提升一样,鸵鸟自动提升为Bird类,这叫做向上转型。static方法是不会被重写如TestOstrich.java所示:子类中定义了与父类同名的fly方法,父类的fly方法不会被重写,而是被遮蔽因此得出结果鸵鸟会飞!构造方法的构造方法的调用顺序调用顺序子类在产生对象实例时首先会调用父类的构造方法,如果没有显示的指定调用父类自定义的构造方法,那么编译器会调用默认的父类构造方法:super()。但是父类如果自定义了带参数的构造方法,就必须在子类的构造方法中指定调用它,否则会因找不到super()而报错。注意,如果需要显示的调用父类构造方法,必须将其写在构造方法里的第一行。接着按声明的顺序调用成员初始化。最后调用本构造方法的方法体 ObjectObject类类Java中所有的类都是继承自一个老祖宗,Object类,它们都是Object类的子类。如果一个类在声明时没有用extends关键字显式的指定继承自某个基类,则Java隐式的指定它的默认基类为Object类。这种强制的继承模式叫做单根继承模式。单根继承使得Java简化了许多操作,基于单根继承,所有的对象都可以像基本数据类型一样向上转型到根层次上而使其操作上一视同仁 单根继承的优势还在于可以在Object类定义所有对象都通用的方法,所有类都会自动继承这些方法 toStringtoString方法方法Object类定义了 public String toString()方法,返回值是String类型,每当个对象都会有个toString方法,作用就是描述对象的信息要想使用toString方法必须按自己的需求重写这个方法 对象的比较对象的比较Java中比较两个基本数据类型变量的值时很简单使用“=”操作符 Object类中的equals方法提供了对象内容的比较方法同样我们要是用这个方法必须重写它 如果不重写equals方法,将调用object类的equals方法。Object类的equals方法相当于“=”为什么要继承“继承”概念的引入最早出现于Simula67语言需要继承,因为它支持更丰富、更强大的建模,有利于重用它可以在一个类中定义信息和行为,在相关子类中共享这些定义继承是很自然的使用继承,可以在已有类的基础上扩充,建立新类抽取一组类中的共同信息和行为,并同时保持类型安全进行抽象。对类进行约束设计类层次结构自顶向下根据需要逐步扩充自底向上寻找相同点和相异点逐级抽象继承的表示法:一条带有空心大箭头的有向实线,箭头指向父类标识继承关系的原则:LSP“Inheritance should ensure that any property proved about supertype objects also holds for subtype objects.”Liskov,1987多重继承为什么引入多重继承?多重继承的优点功能强大允许私有继承更接近真实世界允许混合(mix-in)多重继承的缺点复杂,有时难以理解导致名字冲突(二义性)重复继承编译器和运行时实现困难示例:摘自ARM(,TheAnnotatedC+ReferenceManual,Addison-Wesley,1990)classLotterypublic:virtualintdraw();.;classGraphicalObjectpublic:virtualintdraw();.;classLotterySimulation:publicLottery,publicGraphicalObject./没有声明draw;LotterySimulation*pls=newLotterySimulation;pls-draw();/编译错误classB.;classC.;classD:publicB,publicC.;往往最后会发展成象下面这样:classA.;classB:virtualpublicA.;classC:virtualpublicA.;classD:publicB,publicC.;问题是:设计类A和类B时,能否知道它们会被同时继承?多重继承如何替代多重继承(Java、C#等语言中的)接口聚合面向方面编程(AOP)范型(类属)继承与聚合继承与聚合都可用于扩展类的功能和进行重用继承通过扩展一个已有类的实现,从而获得新功能泛化类(超类)可以显式地捕获那些公共的属性和方法特殊类(子类)则通过附加属性和方法来进行实现的扩展聚合通过创建一个聚合了其它对象的对象,从而获得新功能通过将功能委托给所聚合的一个对象,从而实现新功能继承与聚合例子:class Stack extends ArrayList private int stack_pointer=0;public void push(Object article)add(stack_pointer+,article);public Object pop()return remove(-stack_pointer);public void push_many(Object articles)for(int i=0;i-失败。乘客是人所扮演的一种角色。代理人亦然。失败。乘客是人所扮演的一种角色。代理人亦然。2.2.永远不需要转化永远不需要转化-失败。随着时间的发展,一个失败。随着时间的发展,一个PersonPerson的子类实例可的子类实例可能会从能会从PassengerPassenger转变成转变成AgentAgent,再到,再到Agent PassengerAgent Passenger。3.3.扩展,而非重写和废除扩展,而非重写和废除-通过。通过。4.4.不要扩展一个工具类不要扩展一个工具类-通过。通过。5.5.在问题域内,特指一种角色,交易或设备在问题域内,特指一种角色,交易或设备-失败。失败。PersonPerson不是一种角色,交易或设备。不是一种角色,交易或设备。继承并非适用于此处!继承并非适用于此处!继承与聚合例:1.1.是一个是一个的特殊类型的特殊类型,而非,而非 是一个由是一个由所扮演的角色所扮演的角色-通过。乘客和代理人都是特殊类型的人所扮演的角通过。乘客和代理人都是特殊类型的人所扮演的角色。色。2.2.永远不需要转化永远不需要转化-通过。一个通过。一个PassengerPassenger对象将保持不变;对象将保持不变;AgentAgent对象对象亦然。亦然。3.3.扩展,而非重写和废除扩展,而非重写和废除-通过。通过。4.4.不要扩展一个工具类不要扩展一个工具类-通过。通过。5.5.在问题域内,特指一种角色,交易或设备在问题域内,特指一种角色,交易或设备-通过。通过。PersonRolePersonRole是一种类型的角色。是一种类型的角色。继承适用于此处!继承适用于此处!继承与聚合例:1.1.是一个是一个的特殊类型的特殊类型,而非,而非 是一个由是一个由所扮演的角色所扮演的角色-通过。预订和购买都是一种特殊类型的交易。通过。预订和购买都是一种特殊类型的交易。2.2.永远不需要转化永远不需要转化-通过。一个通过。一个ReservationReservation对象将保持不变;对象将保持不变;PurchasePurchase对象亦然。对象亦然。3.3.扩展,而非重写和废除扩展,而非重写和废除-通过。通过。4.4.不要扩展一个工具类不要扩展一个工具类-通过。通过。5.5.在问题域内,特指一种角色,交易或设备在问题域内,特指一种角色,交易或设备-通过。是一种交易。通过。是一种交易。继承适用于此处!继承适用于此处!继承与聚合小结1.聚合与继承都是重要的重用方法2.在OO开发的早期,继承被过度地使用3.随着时间的发展,我们发现优先使用聚合可以获得重用性与简单性更佳的设计4.当然可以通过继承,以增加可复合的类(enlarge the set of composable classes)。5.因此聚合与继承可以一起工作6.但是我们的基本法则是:优先使用对象聚合,而非(类)继承区分接口继承与实现继承*深入分析继承机制,会发现它由两个可分的部分组成:函数接口的继承函数实现的继承作为类的设计者有时希望派生类只继承成员函数的接口(声明)有时希望派生类同时继承函数的接口和实现,但允许派生类改写实现有时则希望同时继承接口和实现,并且不允许派生类改写任何东西区分接口继承与实现继承 例:abstract class Shape public abstract void draw();virtual void error(String msg)int objectID().;class Rectangle extends Shape .;class Ellipse extends Shape .;区分接口继承与实现继承 定义纯虚函数的目的在于,使派生类仅仅只是继承函数的接口声明简单虚函数的目的在于,使派生类继承函数的接口和缺省实现非虚成员函数表明了一种特殊性上的不变性,因为它表示的是不会改变的行为区分接口继承与实现继承 Tips:如果需要简单虚函数,不应将其声明为公有的决不要重新定义继承而来的非虚函数在C+中,如果要使用实现继承,尽可能使用private继承面向接口编程接口表达了对象在交互中的“角色”“应该尽可能的避免实现继承”Jams Gosling实现继承打破了类的封装实现继承增加了耦合避免“向下转换”继承层次类型系统类型一组值作用于这些值上的操作在OO世界中,类型(Type)=类(Class)类型系统一组禁止误用值的规则类型表达式、定型断言、定型规则、类型检查算法可以在运行时检查(动态类型系统),也可在编译时检查(静态类型系统)类型系统动态类型系统 编译快,编译器实现简单程序员修改方便支持Test-Modify方式最终仍可以发现错误静态类型系统编译仍相当快运行性能高可以找出拼写错误程序自描述性较好多态性多态性(polymorphism)多态变量一个值在不同上下文中表示不同类型可以把多态变量看作是一个占位符多态消息一个消息不同上下文中有不同的行为(实现)为限制对“多种类型”的滥用,需要使用继承来附加约束仅允许将子类型对象的类型“改变”为父类型多态是和继承密切相关的,正因为有继承,才会有多态出现。多态从字面上的意思应该是多种形态。更进一步,延伸到继承里来,那么多态就应该是具有相同的操作不同的行为的一种特征。多态性多态性问题为什么要引入多态?为了支持对类型扩展中涉及的行为扩展早期的想法现在呢?多态性多态的应用代替分支语句使得不同的行为(实现)可以由相同的消息(接口)来引发,以提供更利于重用的封装留下“扩展点”,便于今后进行扩展代替“函数指针”向上转型(向上转型(upcastingupcasting)publicclassShape voiddraw()staticvoidstart(Shapes)s.draw();publicstaticvoidmain(Stringagrs)start(newCircle();start(newSquare();classCircleextendsShape voiddraw()System.out.println(“drawCircle”);classSquareextendsShape voiddraw()System.out.println(“drawSquare”);向上转型(向上转型(upcastingupcasting)在start()方法中,通过传入的参数类型不同,表现出来的行为也会不同。但是传入后的参数都统一转型为Shape这个基类型,这里就表现为向上转型。由导出类到基类,从继承图上面我们可以看出是向上移动的,因此我们一般称之为“向上转型”。向上转型是从一个较具体的类型转换为一个较抽象的类型的过程,所以说是安全的。在导出类中至少包含了基类的方法。在向上转型的过程中,由于在导出类中可能含有基类中没有的方法。类接口会丢失一些方法 将一个方法调用同一个方法主体关联起来被称之为绑定,若在程序执行前绑定就被称为早期绑定。晚期绑定也被称为动态绑定,即编译器始终都不会知道对象的类型,只有当方法在运行期间被调用时,方法的调用机制根据实参类型找到正确的方法体。动态绑定动态绑定动态绑定运行时将消息关联到实现代码上处理多态的机制“真正的多态”多态性规则总是使用尽可能高的抽象级别来编程总是把字段、局部变量、方法参数的类型声明为继承层次中最高的类构造器中多态方法的行为构造器中多态方法的行为publicclassShape3 Shape3()System.out.println(“thisisashape”);draw();voiddraw()publicstaticvoidmain(Stringagrs)Shape3circle=newCircle();classCircleextendsShape3 inti=100;Circle()draw();voiddraw()System.out.println(“drawCircle”+i);最后的输出结果是:this is a shapedraw Circle0draw Circle100 不是我们希望的结果。构造器中多态方法的行为构造器中多态方法的行为I、在其他任何事物发生之前,将分配给对象的存储空间初始化为二进制的零。II、如前所述的那样调用基类构造器。因此我们会发现,虽然在基类的构造器中调用了其子类的draw方法,而里面的i值还并没有被初始化,但由于步骤1的原因,i的值被置为0。III、按照声明顺序调用成员的初始化方法。IV、调用子类的构造器主体。抽象类和接口抽象类和接口 抽象类抽象类使用abstract修饰的类叫做抽象类使用abstract修饰的方法叫做抽象方法抽象类的意图是为从它派生出去的所有类都创建一个通用接口。从而实现运行时多态。抽象类不一定要包含抽象方法。如果一个类中包含了一个以上的abstract方法,那么这个类必须是abstract。abstract类不能被实例化,只能作为父类来派生子类。由抽象类派生的非抽象子类必须实现父类中的所有抽象方法。抽象类、抽象方法的表现形式。接口接口是一个更“纯”的抽象类。(不能含有非abstact方法,变量)接口这样描述自己:“对于实现我的所有类,看起来都应该象我现在这个样子”。接口只包含常量和方法的定义,没有变量和方法的实现。接口可以实现多重继承的功能。“面向接口设计”1.关于接口的几个问题关于接口的几个问题接口声明格式:publicinterface接口名 extends接口列表接口体接口体包含常量和方法的定义2.接口的定义接口的定义3.接口的实现接口的实现 使用使用使用使用implementsimplements关键字关键字关键字关键字接口接口

    注意事项

    本文(Java-面向对象编程.ppt)为本站会员(wuy****n92)主动上传,淘文阁 - 分享文档赚钱的网站仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。 若此文所含内容侵犯了您的版权或隐私,请立即通知淘文阁 - 分享文档赚钱的网站(点击联系客服),我们立即给予删除!

    温馨提示:如果因为网速或其他原因下载失败请重新下载,重复下载不扣分。




    关于淘文阁 - 版权申诉 - 用户使用规则 - 积分规则 - 联系我们

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

    工信部备案号:黑ICP备15003705号 © 2020-2023 www.taowenge.com 淘文阁 

    收起
    展开