第3章面向对象程序设计

上传人:痛*** 文档编号:232556615 上传时间:2023-09-21 格式:PPT 页数:159 大小:599.50KB
收藏 版权申诉 举报 下载
第3章面向对象程序设计_第1页
第1页 / 共159页
第3章面向对象程序设计_第2页
第2页 / 共159页
第3章面向对象程序设计_第3页
第3页 / 共159页
资源描述:

《第3章面向对象程序设计》由会员分享,可在线阅读,更多相关《第3章面向对象程序设计(159页珍藏版)》请在装配图网上搜索。

1、面向对象程序设计概述3 3程序设计方法公共数据函数函数函数函数算法数据结构数据方法方法数据方法方法过程式程序设计OOP程序设计对象消息消息2面向对象编程3 3程序设计方法4面向过程的程序设计面向过程的程序遵循面向过程的问题求解方法其中心思想是用计算机能够理解的逻辑来描述和表达待解决的问题及其具体的解决过程。算法+数据结构数据结构利用计算机的离散逻辑来量化表达需要解决的问题。而算法则研究如何快捷、高效地组织解决问题的具体过程。4面向过程面向机器3面向对象编程3 3程序设计方法4面向对象的程序设计面向对象问题求解关心的不仅仅是孤立的单个过程,而是孕育所有这些过程的母体系统它能够用计算机逻辑来模拟、

2、描述系统本身,包括系统的组成,系统的各种可能状态,以及系统中可能产生的各种过程与过程引起的系统状态切换。面向对象的程序设计是以要解决的问题中所涉及到的各种对象为主要考虑因素。对象是一种看问题的观点,是对现实世界各种元素的一种抽象。对象既含数据又含功能,因此具有自身处理数据的能力。对象被认为是迄今为止最接近真实事物的数据抽象。4面向对象编程3 3对象与过程4考虑对象 考虑过程:前者更有意义4设计对象 设计过程:前者更富挑战性,尤其是设计可重用的对象。4面向对象的程序设计和问题求解力求符合人们日常自然的思维习惯,降低分解问题的难度和复杂性,提高整个求解过程的可控制性、可监测性和可维护性,从而达到以

3、较小的代价和较高的效率获得较满意效果的目的。5面向对象编程3 3对象的几个特征4Everything is an object原则上,可以将所要解决的问题中的任何一个 “概念组件”在程序中表示为一个对象。对象类似一个记录,可以存储数据,但你还可以让它执行某些操作(作用在它自身的数据上)4A program is a bunch of objects telling each other what to do by sending messages所谓 对一个对象发信息,就是调用该对象的一个方法。4Every object has a type each object is an instanc

4、e of a class4对象+消息6面向对象编程3 3现实中的对象4现实世界中对象有两个共同的特点:一方面,它们都有自己的状态,如一台电 视机有自己的摆放位置,有关机和开机状 态,此刻正在播放某一频道的电视节目等 另一方面,它们又都有自己的行为或功能,如电视机的开机、关机、调台等。7面向对象编程3 3对象的属性与方法4面向对象程序设计中的对象是现实世界对象的模型化,它同样具有状态和行为。对象的状态用属性来维护,对象的行为用方法来实现。4因此可以简单地讲,对象是面向对象的程序设计模式,它由描述状态的属性(变量)和用来实现对象行为的方法(代码)组成。4几种叫法属性 静态属性 域 成员变量 状态方

5、法 动态属性 成员方法 行为8面向对象编程3 3案例-定单系统4成立新的公司时尚服装。4每月发布商品编目,并寄给定户。4客户可以发e-mail 或FAX定货(寄定单)。4对于客户的定货要检查存货清单,如缺货,得暂时搁置定单,直到供货商送到货。4公司检查支票和信用卡。4公司将定单下发给仓库,给客户发货。4注意:同种商品每月价格不一。如果订户使用的是六个月之前的编目,价格采用当前编目价格。公司接受所有主要的信用卡。9面向对象编程3 3分析对象4系统是由相互作用的对象组成。任何系统需要它的对象做它的工作。4案例对象:定单,服装,客户4在一个问题域中识别对象不是科学而是艺术。对象取决于人的观点(模块化

6、,应用)4从“名词”开始确定系统中的对象。对象可以是:简单的和复杂的:衬衣,银行实际的和概念的:银行出纳员,银行帐号10面向对象编程3 3对象的属性和方法4确定对象的属性和方法4对象属性:可以是数据或对象。客户客户号,客户名,地址定单定单号,定货条目,顾客号(也可以是顾客对象)。4对象方法:让对象做的事情(可以对自己,也可以对其他对象),经常影响对象属性。客户提交定单 定单打印定单,改变条目11面向对象编程3 3模型化对象CustomerCustomerIDnamebillingAddressshipping Addressphoneinitialize()placeOrder()Ordero

7、rderIDCustomerdateOrdereditemsOrderedpaymentplacedByinitialize()calcAmountOwed()printOrder()makePayment()changeItem()12面向对象编程3 3测试对象4与问题域是否有关、适当?4是否独立存在 客户可以独立存在。定单可以,但在使用时必须有客户配合。4是否有属性和方法。13面向对象编程3 3对象与类4类(Class)是同种对象的集合与抽象4类是对象的抽象及描述,它是具有统一属性和方法的多个对象的统一描述体,是用来定义一组对象共有属性和方法的模板。4类是用来创建对象实例的样板,它包含所创

8、建对象的状态描述和方法的定义。类是一个型,而对象则是这个型的一个实例。4类是静态概念,而对象则是一个动态概念,因为只有在运行时才给对象分配空间,对象才真正存在。14面向对象编程3 3对象是类的唯一性实例现实世界 实体抽象数据类型 计算机世界对象 类抽象映射 计算机逻辑的实现实例化抽象概念世界15面向对象编程3 3接口与实现4类是一种封装技术。4如果属性或方法被定义为public,它就是接口的一部分,其他类可以直接访问它。4如果属性或方法被定义为private,它就是实现的一部分。只有类自己的方法可以访问它。4对象要注意保护自己的数据(私有属性,公有方法)。对象通过它们的方法管理,实现由编程人员

9、控制。4通过接口与对象发生作用,内部实现不影响接口(汽车,内部变化不影响驾驶)程序一部分变化不会影响其他部分。4复用事先写好的操作可在整个项目中使用重用比重写更容易16面向对象编程3 3对象与类几种相互关系4包含关系当对象A是对象B的属性时,我们称对象B包含对象A。4关联关系当对象A的引用是对象B的属性时,我们称对象A和对象B之间是关联关系。4类之间的继承关系B类继承了A类,就是继承了A类的属性和方法。A类称之为父类,B类称之为子类。17面向对象编程3 3为什么要学习面向对象编程4面向对象技术的意义人脑与电脑的思维如何解决软件危机4学习面向对象的紧迫性现在已经到了如果不了解面向 对象编程,作为

10、一个程序员就抬 不起头来的时候了。18面向对象编程3 3面向对象技术意义4目前的计算机功能很强,但目前的计算机并不很合理。最大的不合理是来自人认识问题时的认识空间和计算机处理问题时的方法空间的不 一致,人与目前的计算机之间仍存在着较大的隔阂。而面向对象技术有助于减小这一隔阂、并使这两个空间尽量趋于一致。4软件复用类库的使用(可重用的标准化的模块)类的继承4面向对象技术应用的普遍性19面向对象编程3 3面向对象技术-人人受益4for manager更迅速和更经济地开发和维护软件系统。4for analysts and designers模块化的过程将变的简单,并能获得一个清晰的、易于管理的设计方

11、案。4for programmers清晰的对象模型,丰富的面向对象开发工具及类库使得编程变为一件饶有兴趣的工作。程序员明显感到编程效率的提高。20面向对象编程面向对象程序设计基础3 3主要内容4 抽象4 封装4 继承4 多态4 类定义4 重载4 包4 接口22面向对象编程3 3OOP的主要特点4抽象去除对象中与主旨无关的次要部分,而 仅仅抽取出与研究有关的内容(数据抽象)23面向对象编程3 3抽象4在软件开发方法中使用的抽象有两类:过程抽象和数据抽象过程抽象将整个系统的功能划分为若干部分,强调功能完成的过程和步骤数据抽象把系统中需要处理的数据和这些数据上的操作结合在一起,根据功能、性质、作用等

12、因素抽象成不同的抽象数据类型。每个抽象数据类型包含了数据,也包含了针对这些数据的授权操作。面向对象的软件开发采用数据抽象的方法来构建程序的类、对象和方法。24面向对象编程3 3抽象4所有编程语言都提供“抽象”功能。4你所能解决问题的复杂程度取决于抽象的种类和质量。4汇编语言对于计算机(机器语言)是一步很小的抽象。4过程化语言(高级语言)相对于汇编语言的抽象迈了一大步。但你所考虑的仍然是机器的结构而非问题的结构。4面向对象方法为程序员提供了一种表示问题空间元素的全新的方法,且不受问题类型的约束。25面向对象编程3 3抽象4问题空间元素方法空间中的表示:对象4“对象”是现实世界的实体或概念在计算机

13、逻辑中的抽象表示。4面向对象的程序设计是以要解决的问题中所涉及到的各种对象为主要考虑因素。4面向对象语言更加贴近人的思维方式。OOP允许你用问题空间中的术语来描述问题。26面向对象编程3 3OOP的主要特点4封装(encapsulation)实现了信息的隐藏及安全性提高了程序的模块化,且易于维护27面向对象编程3 3封装-信息隐藏4封装 是一种组织软件的方法。其基本思想是把客观世界中联系紧密的元素及相关操作组织在一起,使其相互关系隐藏在内部,而对外仅仅表现为与其他封装体间的接口。从而构造出具有独立含义的软件实现。4封装并不是一个新的概念,但在面向对象的程序设计中提出了一种全新的封装方法 类28

14、面向对象编程3 3封装-信息隐藏4封装 就是利用抽象数据类型将数据和基于数据的操作封装在一起,数据被保护在抽象数据类型的内部,系统的其他部分只有通过包裹在数据外面的被授权的操作,才能与这些抽象数据类型交流和交互。4在面向对象的程序设计中,抽象数据类型是用“类”来代表的。29面向对象编程3 3封装-信息隐藏4每个类里都封装了相关的数据和操作。在实际的开发过程中,类多用来构建系统内部的模块。4由于封装特性把类内的数据保护得很严密,模块与模块间仅通过严格控制的界面进行交互,使它们之间耦合和交叉大大减少,从而降低了开发过程的复杂性,提高了效率和质量,减少了可能的错误,同时也保证了程序中数据的完整性和安

15、全性。30面向对象编程3 3封装-软件复用4封装使得对象:对内成为一个结构完整、可自我管理、自 我平衡、高度集中的整体。对外则是一个功能明确、接口单一、可在 各种合适的环境下都能独立工作的有机的 单元。4类的封装特性使得类可重用性大为提高,这样的有机单元特别适宜构建大型标准化的应用软件系统,可以大幅度地提高生产效率。31面向对象编程3 3OOP的主要特点4继承(inheritance)体现了对现实世界的抽象模拟提高了代码的复用性交通工具车船飞机汽车火车父类/超类(superclass)子类(subclass)Java仅支持单重继承,但可通过接口实现多重继承32面向对象编程3 3OOP的主要特点

16、4多态(polymorphism)用同一个名字调用实现不同操作的方法方式1:不同的类之间的同名方法 如:中国人/日本人/美国人 说话方式2:参数不同的同名方法使用方便,且降低了维护和编程量33面向对象编程3 3Java中的类4几个概念类:同种对象的集合与抽象 系统类库中已定义好的类:是系统提供 的已实现的标准类的集合,是Java的API,它可帮助开发者方便、快捷地开发Java程序。用户自定义的类 针对特定问题子类、父类34面向对象编程3 3Java中的类4Java中的类结构基类:所有Java的类都派生自ObjectJava的类可组织在包(package)中Java提供的标准类库分布在一系列的包

17、中,如java.lang,java.util,等 (参见 P.117)编程的过程就是继承基类或标准类而创建、定义特殊子类的过程35面向对象编程3 3在程序中定义你抽象出的类4新类必须在已有类的基础上构造。4在已有类的基础上构造新类的过程称为派生。4派生出的新类称为已有类的子类。已有类称为超类(父类)。4子类继承父类的属性和方法。4当没有显式指定父类时,父类隐含为java.lang包中的Object类。父类子类36面向对象编程3 3Java中类的声明4类说明语法:类修饰符 class 类名 extends 父类名 implements 接口名 成员变量定义;方法定义;类体37面向对象编程3 3J

18、ava中类的声明4类修饰符(Modifier):public:允许其他类(没有限制)访问本类,一个 源文件仅可以有一个public类缺省:可被当前包中的其他类访问abstract:没有实例的抽象概念类,是它的所有子类 的公共属性和公共方法的集合final:不能再被扩展,不能有子类的类;易于安全 性的实现,或用于创建固定功能的类4父类继承声明:extends 父类名4实现接口(interface):implements 接口名38面向对象编程3 3Java中类的声明4例:public abstract class shape class rectangle extends shape final

19、 class roundrect extends rectangle 注意:final可以与abstract一起使用吗?39面向对象编程3 3创建对象4对象(实例instance):以类为模板创建的 具体实例(实际个体)创建某个类的具体对象(类似变量声明)类名 欲创建的对象名new 类名(参数表);例如:String s=new String(“Hello!”);40面向对象编程3 3类的成员变量的声明4声明成员变量(member)的语法修饰符 数据类型 变量名;4引用:对象名.变量名4修饰符访问控制符public:可被所有其他类引用private:仅可被该类自身引用和修改,不能被其他任何类(

20、包括该类的子类)引用,它提供了最高级别的保护。41面向对象编程3 3成员变量的声明protected:该类自身、子类、同一包中的其他类private protected:该类自身、子类 注:private protected仅1.0.2支持,1.1之后不再支持缺省:本包中的类static:类成员变量,对所有的实例一致,引用时前缀 可使用类名或对象名final:数值不变常量,定义同时应对其进行初始化 42面向对象编程3 3成员变量的声明4例:class shapeprivate protected int x;private protected int y;static final float

21、MaxArea=100.0f;43面向对象编程3 3成员变量的声明 class Employee String name;int age;float salary;Employee e=new Employee();e.name=“张立”;e.age=21;e.salary=528.37F;final 类型 常量名=值实例变量成员变量其生命周期与对象存在的时间相同。44面向对象编程3 3类成员变量(静态变量)4静态变量为类的各实例共享的变量。static 静态变量名;4位于类的内存区域中,为该类的各个对象共享.4无此限定符的变量是实例变量。class ex int i;static int j

22、;static final int k=10;-4 final 常量可同时定义为static类exjk=10对象1i :3对象2i :545面向对象编程3 3类成员变量(静态变量)4实现各实例之间的通讯 对于该类的任何一个对象访问该静态变量时,取得的都是相同的值4跟踪创建的实例数 public class Count private int serial;/实例变量 private static int counter=0;/静态变量 public Count()counter+;serial=counter;4静态变量类似于某些语言中的全局变量46面向对象编程3 3类成员变量(静态变量)4非

23、private 的静态变量无须创建实例就可以从类的外部访问。class StaticVar static int x=100 ;public class test public void m()int m=StaticVar.x;47面向对象编程3 3类成员变量(静态变量)class PhoneCard200 static final String connectNumber=“200”;static double additoryFee;long cardNumber;int password;boolean connected;double balance;48面向对象编程3 3类成员变量

24、(静态变量)public class a public static void main(String args)PhoneCard200 my200_1=new PhoneCard200();PhoneCard200 my200_2=new PhoneCard200();PhoneCard200.additoryFee=0.1;System.out.println(“第一张200卡的接入号码:”+my200_1.connectNumber);System.out.println(“第二张200卡的附加费:”+my200_2.additoryFee);System.out.println(“2

25、00卡类的附加费:”+PhoneCard200.additoryFee)System.out.println(“200卡接入号码:”+PhoneCard200.connectNumber);49面向对象编程3 3方法的声明4定义对类内成员变量(数据)的操作4方法的声明语法:修饰符 返回类型 方法名(参数列表)throws 例外名 方法体;4方法是类的动态属性,标志了类所具有的功能和操作50面向对象编程3 3类的方法定义规则4方法名后的小括号是方法的标志。4形式参数是方法从调用它的环境输入的数据。4返回值是方法在操作完成后返还给调用它的环境的数据。4要指定方法返回值类型。如没有返回值,类型要写

26、void4方法名相同,但参数不同,是不同的方法。4与类名相同的所有方法都是类的构造方法。51面向对象编程3 3方法体的定义4在方法中定义的变量称为局部变量。其生命周期:执行进入方法体时建立,退出方法时撤消。局部变量使用之前必须初始化。4在方法体中可以访问所有的类属性,可以调用所有类中定义的方法。4方法可以递归调用。52面向对象编程3 3方法的声明4修饰符(Modifier):访问控制符:public、private、protected、private protectedstatic:静态方法,又称类方法使用类名或对象名作为前缀,建议使用类名在方法体中只能使用static变量和static方法a

27、bstract:只有方法头,而没有具体的方法体和操作实现的方法,要在子类中通过重新定义(override)来实现final:不能被重新定义(override)的方法53面向对象编程3 3访问控制符4访问控制符是一组起到限定类、域或方法是否可以被程序里的其他部分访问和调用的修饰符。4类访问控制符公共类 :public 类名 一般类(缺省)4一个类被声明为公共类,表明它可以被所有的其他类所访问和引用。程序的其他部分可以创建这个类的对象、访问这个类的内部可见成员变量和调用它的可见方法4一般类只能被同一包中的类访问和引用。4定义在同一个程序中的所有类属于一个包。54面向对象编程3 34一个类作为整体对

28、程序的其他部分可见,并不能代表类内的所有成员变量和方法也同时对程序的其他部分可见,前者只是后者的必要条件 4成员变量和方法的可见性域和方法的访问限定符只限在本类内使用。private可被同包中其他类使用。可 被子类继承(包括位于不同包中的子类)protected公共变量和公共方法,可被任何类使用。public可被同包中其他类使用。无访问限定符55面向对象编程3 3域和方法的访问限定符4为了使对象具有良好的封装性,一般将类的实例变量设计成私有。4为了使其它类或对象能够访问私有实例变量,本类必须提供访问私有变量的方法(公共方法)。4按照惯例,读私有变量的方法取名为get 写私有变量的方法取名为 s

29、et 56面向对象编程3 3方法的声明(续)4返回类型:void、return4参数列表:参数类型可为类类型4throws:通告本方法中会产生的例外(异常)类型,提醒调用者要对相应的可能例外进行处理。当执行此方法并发生了例外时,程序会转入调用者编制的例外处理程序段。57面向对象编程3 3方法的参数4方法的参数要有名有型,参数的作用域在本方法中,在方法体中可以象方法体自己定义的变量一样使用。4参数是值传递 对象的内容可以改变,但对象的引用决不会改变。4方法的参数可以与类的成员变量同名,这时,参数在方法体中将隐藏同名的成员变量。class circle int x,y,radius;setCirc

30、le(int x,int y,int radius)58面向对象编程3 3值传送与地址传送ABABAB引用类型值传送基本类型值传送地址传送3.143.143.140 x2F0 x2F59面向对象编程3 3参数传递例public class PassTest float m_float;void change1(int pi)pi=100;void change2(String ps)ps=new String(“Right”);void change3(PassTest po)po.m_float=100.0;public static void main(String args)PassTe

31、st pt=new PassTest();60面向对象编程3 3参数传递例 int i=22;pt.change1(i);System.out.println(“i value is”+i);String s=new String(“Hello”);pt.change2(s);System.out.println(“s value is”+s);pt.m_float=22.0F;pt.change3(pt);System.out.println(“Current pt.m_float is ”+pt.m_float);/main()/class实参形参copy61面向对象编程3 3方法的说明4

32、为Employee类增加打印方法将数据和代码封装在一个单一的实体中。class Employee String name;int age;float salary;void print()System.out.println(name +“年龄为:”+age +“月薪为:”+salary);/class 62面向对象编程3 3对象方法的含义 Employee emp=new Employee();emp.name=“张立”;emp.age=21;emp.salary=528.37F;4一旦对象被建立并被初始化,就可以调用该方法打印这个对象的数据。emp.print();4对象emp执行prin

33、t 方法操作自己的数据。4向对象发消息,让对象做某件事。63面向对象编程3 3方法的声明4例:class shapeprivate int x;static float MaxArea=100.0f;public void setx(int newx)x=newx;public int getx()return x;public static void setMA(float newMA)MaxArea=newMA;64面向对象编程3 3类方法(静态方法)4类方法:static 方法名()4使用类方法不用创建类的对象。调用这个方法时,建议使用类名做前缀,而不是使用某一个具体的对象名。4非sta

34、tic的方法是对象方法(或称实例方法)。4类方法中不能访问实例变量,而只能访问类变量(static方法 static域)。4类方法中不能直接使用本类中的实例方法,只能使用其他的static方法。4类方法中没有this值。65面向对象编程3 3类方法(静态方法)public class a public static void main(String args)System.out.println(Math.round(3.54);String s=to_char(2.718);System.out.println(“e=“+s);static String to_char(double x)r

35、eturn Double.toString(x);66面向对象编程3 3类方法(静态方法)4main方法是静态方法,这是为了使系统在没有任何实例化对象之前可以运行一个应用程序。4如果main方法要调用本类的其它方法:将这些方法设计成静态方法创建对象,使用对象方法。4一个静态方法不能被一个非静态方法所覆盖。67面向对象编程3 3例子:银行业务4要求:处理简单帐户存取款、查询4面向对象的分析分析(OOA)对象模型抽象:银行帐户银行帐户对象模型分析:余额、存、取、查余额、存、取、查4面向对象的设计设计(OOD)对象模型的实现:类及其成员定义BankAccount类类Banlance,etcgetBa

36、lance(),getMoney(),etc68面向对象编程3 3银行业务的程序结构银行帐户类BankAccount数据:余额、利率操作:查询余额、存款、取款 查询利率、设置利率主类主类UseAccountmain()方法,创建BankAccount类的对象,并完成相应操作UseAccount.java69面向对象编程3 3小结类与对象4面向对象的数据和方法:一个类的对象虽然具有相同的属性,但对象却各不相同(属性值不同)。一个类的对象方法虽然具有相同的代码,但表现不同,因为方法所操作的对象(数据)不同。4共享的数据和方法:类属性 在同一类的实例中共享数据(该数据不属于一个对象,而属于一个类)。

37、类方法 不需要实例化就能使用的静态方法,虽然它们也能通过实例来访问。70面向对象编程3 3小结类与对象4类名.域名 静态域,在类的空间里,是该类对象共享的单元 4类名.方法名 静态方法 类方法的调用 4类方法及域也可以用对象名调用,但最好用类名4对象名.属性名 实例变量。通过方法操作属性。4对象名.方法名 方法调用又称“消息传递”,实际上就是给指定对象发送消息:告诉它做什么,向它要信息(方法的返回值)。71面向对象编程3 3小结类与对象4访问一个类:创建该类的对象,并使用该类对象的可见属性与方法。调用该类的可见静态方法,访问该类的可见静态属性。继承该类。4finalfinal类不能被继承。fi

38、nal 方法不能被覆盖。final 域不能被修改。72面向对象编程3 3小结封装4类中的数据使用private定义。4使用public方法来操作数据。4把逻辑上相关联的数据封装成新的类来使用,类似结构体。4不要定义太庞大的类,要把无关的功能适当分离。4培养良好的编程风格。73面向对象编程3 3this与super4this和super是常用来指代子类对象和父类对象的关键字。Java系统默认,每个类缺省地具有null、this和super三个域,所以在任意类中都可以不加说明而直接使用它们。4this表示的是当前对象本身,更确切地说,this代表了当前对象的一个引用。利用this可以使用当前对象的

39、域,调用当前对象的方法。4super 表示的是当前对象的直接父类对象,是当前对象的直接父类对象的引用。74面向对象编程3 3方法中使用this class Banana void f(int i).Banana a=new Banana();b=new Banana();a.f(1);b.f(2);4方法如何知道是处理哪个对象?4编译做了一些内部处理 Banana.f(a,1);Banana.f(b,2);4把一个隐含的参数传给了方法指向被操作对象的引用。75面向对象编程3 3this如果你在方法中想拿到这个引用 thisclass Banana void pick()void pit()th

40、is.pick();/pick()public class MyDate int day,month,year ;public void tomorrow()this.day=this.day+1;/day=day+1 76面向对象编程3 3this4this 只能在方法中使用,表示当前对象,或类的当前实例。4this 适用于一些特殊的场合。4例:public class MyDate int day,month,year;public void born()Birthday bd=new Birthday(this);77面向对象编程3 3this 例class Leaf private i

41、nt i=0;Leaf increment()i+;return this;void print()System.out.println(i=+i);public class a public static void main(String args)Leaf x=new Leaf();x.increment().increment().increment().print();78面向对象编程3 3Java中的多态4多态:同一程序中同名的不同方法共存可以通过子类对父类方法的覆盖实现多态可以利用重载(overload)在同一个类中定义多个同名的方法4多态情况下进行方法调用时,如何区分这些同名的不

42、同方法不同类中的同名方法:冠以类名以示区别同类中的同名方法:用不同的参数列表(参数的个数,类型,顺序的不同)来区别同名的不同方法79面向对象编程3 3多态4例:Shapes.java三个类Circle、Square、Triangle均有draw()方法和erase()方法,但不同类的方法的具体操作其实并不相同,实现了多态。draw()erase()draw()erase()draw()erase()80面向对象编程3 3Overloding方法重载4用同一个名字来表示不同的方法。这些方法同名的原因,是因为它们的最终功能和目的都相同,但由于在完成同一功能时,可能遇到不同的具体情况,所以需要定义含

43、不同的具体内容的方法。4方法名必须相同(是同一类中定义同名方法的情况)。4方法的参数必须不同(同名不同方法是靠不同形式的参数列表来区分,包括形式参数的个数、类型、顺序的不同)。4返回类型可以不同,但不是重载的标志。4利用“重名”现象提高程序的抽象度和简洁性。81面向对象编程3 3方法的重载4例:(相同类型的工作,不同的参数)public void println(int i);public void println(float f);public void println(String s);4Integer类 String toString();static String toString(

44、int i);4Double 类 String toString();static String toString(double d);在一个类中,不可以存在两个只有返回值不同的方法 82面向对象编程3 3构造方法(constructor)4问题的提出Java试图在每个对象一诞生时,就给它一确定的状态,但有时这种系统的缺省初值不合适;所以在创建一个新对象时,需用构造方法完成合法的初始化,使类内成员的初始化工作不依赖于外界完成。83面向对象编程3 3构造方法4构造方法是一种特殊的成员方法,在创建每个新的类对象时自动执行,以保证新对象的各成员有合法、确定的数值。4构造方法的名字就是类的名字。4构造

45、方法没有返回类型。4主要用于完成变量的初始化;另外,一个类中可以存在多个构造方法(重载),这些构造方法之间可以互相调用,当一个构造方法调用另一个构造方法时,要使用关键字this,同时这个调用语句应该是整个构造方法的第一条可执行语句。84面向对象编程3 3构造方法4构造方法只能在创建类对象时由系统隐含调用,而不能直接引用;4 类对象创建时,利用运算符 new 在内存中开辟专用空间,存放指定的类的实例(即对象),这时会自动执行类的构造方法,初始化新对象的成员变量。85面向对象编程3 3构造方法4实例化对象初始化对象 类名 对象名new 构造方法();Employee emp=new Employe

46、e();4new运算符的参数就是调用类的构造方法,初始化新建的对象。4new运算符为对象分配内存空间,并返回对该对象的一个引用。4当没定义任何构造方法时,系统配一个隐含的构造方法(如:Employee())里面没有内容。4一旦定义了一个构造方法,隐含构造方法失效!86面向对象编程3 3定义构造方法 Employee(String n,int a,float s)name=n;if(a=18&a=60)age=a;else System.out.println(illegal age);System.exit(1);salary=s;87面向对象编程3 3class Rock Rock(int

47、i)/constructor System.out.println(Creating Rock number +i);public class SimpleConstructor public static void main(String args)for(int i=0;i=18&a Lunch()PortableLunch()Bread()Cheese()Lettuce()Sandwich()106面向对象编程3 3构造方法的继承4子类的构造方法定义中,如要调用父类的含参数的构造方法,需用super关键字,且该调用语句必须是子类构造方法的第一个可执行语句。4若子类 的构造方法中没有sup

48、er()语句,系统将隐含调用父类无参数构造方法。4一构造方法可利用this调用本类其他的构造方法,此时this应是第一个可执行语句107面向对象编程3 3调用父类构造方法4在继承情况下的对象初始化:为对象分配内存并初始化(0、false、null)。如果没有为类中的某些成员赋初始值,Java系统会为类的成员赋固定的初始值(数值变量的值为0,布尔变量的值为false,未初始化的引用为null)。执行每一层的类的显式初始化。执行每一层的类的构造方法(由于显式或隐式调用)。108面向对象编程3 3抽象与抽象类4程序员可以先创建一个定义共有属性和方法的一般类,再从一般类派生出具有特性的新类。4抽象类实

49、际上是所有子类的公共域和公共方法的集合,而每一个子类则是父类的特殊化,是对公共域和方法在功能、内涵方面的扩展和延伸。109面向对象编程3 3类继承树Objectclassabstract class classfinal classclassJava单重继承110面向对象编程3 3抽象类与最终类4abstract 抽象类 没有具体对象的概念类 较高层次的概括抽象类的作用是让其他类来继承它的抽象化的特征。在程序中不能用抽象类作为模板来创建对象。4final 最终类 该类不能有子类。电话卡类无卡号类有卡号类磁卡IC卡校园201卡IP卡200卡111面向对象编程3 3抽象类与最终类 abstract

50、 class PhoneCard class Number_PhoneCard extends PhoneCard final class D200_Card extends Number_PhoneCard .4抽象类经常要包含某些抽象方法(方法的具体实现要在子类中实现)。4final可以与abstract一起使用吗?112面向对象编程3 3抽象方法4abstract 抽象方法 仅有方法头而没有方法体的方法,为该类的子类定义一个方法的接口标准。abstract void performDial();一个抽象类的子类如果不是抽象类,则它必须为父类中的所有抽象方法书写方法体。非抽象方法抽象方法X

51、一般类抽象类113面向对象编程3 3最终方法4final 最终方法不能被当前类的子类重新定义的方法。子类不能再重新定义与此方法同名的自己的方法,而仅能使用从父类继承来的方法。只能继承但不能修改。4固定了这个方法所对应的具体操作,可以防止子类对父类关键方法的错误的重定义,保证了程序的安全性和正确性。114面向对象编程3 3电话卡域:余额方法:拨打电话 查询余额 无卡号电话卡域:对应电话机型号方法:获得电话机型号有卡号电话卡域:卡号,密码接 入号码,接通方法:登录交换机继承继承电话磁卡域:使用地域 方法:拨打电话200卡域:附加费方法:修改密码 拨打电话IP卡 域:失效日期 方法:拨打电话电话IC

52、卡域:方法:拨打电话继承继承 继承继承类继承图变量的继承与扩充115面向对象编程3 3变量的继承与扩充 double balance;long cardNumber;int password;String connectNumber;boolean connect;double additoryFee;D200_Card类 double balance;long cardNumber;int password;String connectNumber;boolean connect;Number_ PhoneCard类 double balancePhoneCard类116面向对象编程3 3变

53、量的隐藏class D200_Card extends Number_PhoneCard double additoryFee;/新增double balance;/隐藏boolean performDial()if(balance (0.5+additoryFee)balance-=(0.5+additoryFee);return true;elsereturn false;定义自己的变量隐藏了父类变量balancebalance117面向对象编程3 3变量的隐藏4如何访问被隐藏的父类的变量:调用从父类继承的方法操作的是从父类继承的变量。使用super.变量名。class test publ

54、ic static void main(String args)a a1=new a();a1.print();1 b b1=new b();b1.print();1 1 100 class a int x=1;void print()System.out.println(x);class b extends a int x=100;void print()System.out.println(super.x=+super.x);super.print();System.out.println(x=+x);118面向对象编程3 3方法覆盖(overriding)4在面向对象的程序设计中,子类可

55、以把从父类那里继承来的某个方法改写,形成同父类方法同名、解决的问题也相似、但具体实现和功能却不尽一致的新方法。4定义与父类完全相同的方法,实现对父类方法的覆盖:完全相同的方法名完全相同的参数列表完全相同类型的返回值注意:在满足上述三个条件同时,还必须保证:访问权限不能缩小,抛出的例外要相同4三个条件有一个不满足,就不是方法的覆盖,而是子类自己定义与父类无关的方法,父类的方法未被覆盖,因而仍然存在。4调用父类被覆盖的方法 super.方法名119面向对象编程3 3方法覆盖-抽象方法的实现4PhoneCard类抽象了一个其子类共有的方法:abstract boolean performDial()

56、;4这个方法代表的相同功能(拨打电话),但在不同种类的电话卡中,其具体实现是不同的。不同的子类可以重新定义该方法。4但是所有的类中,凡是实现拨打电话这种功能的方法,尽管内容不同,却共享相同的名字 performDial4由于同名的不同方法是属于不同的类,所以只需在调用方法时指明是哪个类的方法即可区分(类名.方法名或对象名.方法名)。120面向对象编程3 3方法的覆盖abstract PhoneCard类:abstract boolean performDial();double getBalance()abstract Number_PhoneCard类:abstract boolean pe

57、rformDial();double getBalance()boolean performConnection(long cn,int pw)final D200_Card类:boolean performDial()覆盖 实现抽象方法double getBalance()覆盖 实现细节不同boolean performConnection(long cn,int pw)121面向对象编程3 3方法重载/方法覆盖/变量隐藏4方法的覆盖与方法重载的区别重载:一个类中,同名方法(参数不同)覆盖:子类对父类方法的覆盖(不同类的同名方法)4方法的覆盖与变量的隐藏的区别:子类隐藏父类的变量只是使之不可

58、见,父类的同名变量在子类对象中仍然占有自己独立的内存空间;而子类方法对父类同名方法的覆盖将清除父类方法占用的内存,从而使父类方法在子类对象中不复存在。122面向对象编程3 3类的初始化-静态初始化器4由关键字static引导的一对大括号括起的语句组。用来完成类的初始化的工作,作用与构造方法相似4与构造方法的区别:构造方法是对每个新创建的对象初始化,而静态初始化器是对类自身进行初始化;构造方法是在用new运算符产生新对象时由系统自动执行,而静态初始化器则是在它所属的类加载入内存时由系统调用执行;不同于构造方法,静态初始化器不是方法,没有方法名、返回值和参数列表。123面向对象编程3 3静态初始化

59、器4静态数据成员、复杂数据成员的初始化可在静态初始化器中完成4静态初始化器中的语句在类加载内存时执行,这种初始化操作要比构造方法执行得更早。4static a=10;b=a+3;c=a+b;124面向对象编程3 3垃圾回收机制4一个小问题?Rock R1=new Rock(1);Rock R2=R1;4这时,内存中为Rock类创建了几个实例呢?4如果只有一个实例,那么这个实例有几个引用(reference)呢?125面向对象编程3 3垃圾回收机制4Java的垃圾回收机制:每个对象有自己的REFERENCE计数器,计数器减为零时对象丢失,系统在其后某个时刻自动回收不再可用的对象。Rock R1=

60、new Rock(1);/计数为1Rock R2=R1;/计数为2 /计数为1 /计数为0126面向对象编程3 3包(package)4利用面向对象技术开发系统时,通常需要定义许多类共同工作,为了更好地管理这些类,JAVA中引入了包的概念。4象文件夹把各种文件组织在一起一样,JAVA中的包把各种类组织在一起,使得程序功能清楚,结构分明。127面向对象编程3 3包(package)4在操作系统中,目录用来组织文件,设置权限。4Java利用包来组织相关的类,并控制访问权限。4包是一种松散的类的集合。一般不要求处于同一个包中的类有明确的相互关系,如包含、继承等等。4由于同一包中的类在缺省情况下可以互

61、相访问,所以为了方便编程和管理,通常把需要在一起工作的类放在一个包里。4利用包来管理类,可实现类的共享与复用(类库)。128面向对象编程3 3包与目录4一个包要放在指定目录下。classpath 指定搜寻包的路径。4一个包可以包含若干个类文件,还可包含若干包。4包名本身又对应一个目录(用一个目录表示)。4包名可以有层次,以小数点分割。包名一般全小写(类 名第一个字母大写)。p3 p2d1d2类classpath=d:d1;d:d1d2 p1包129面向对象编程3 3包(package)4创建 package package 包名;每一个class在编译的时候被指定属于某一特定的package,

62、用关键字package说明:package srd.math;/命名要注意唯一性,可使用WWW域名 public class ComplexNumber 如果package未指定,则所有的 class都被组合到一个未命名的缺省package中,不能被其他包中的类引用package说明必须是非注释非空行的第一行130面向对象编程3 3包(package)4创建包就是在当前文件夹下创建一个子文件夹,以便存放包中包含的所有类的.class文件。4上面创建的包语句中的符号“.”代表了目录分割符,即这个语句创建了两个文件夹。第一个是当前文件夹下的子文件夹srd;第二个是srd下的子文件夹 math,当前

63、包中的所有类就存放在这个文件夹中。131面向对象编程3 3包(package)4使用包:使用其他包中的class,需在引用类之前冠以包名作前缀用import 语句将此包中的某些或所有class加载入当前程序:import srd.math.ComplexNumber;import srd.math.*;4包与文件系统每个包对应一个同名的路径,此包中所有class编译生成的.class文件都在此目录中;此目录系统不会自动生成,必须手工创建132面向对象编程3 3包(package)(续)CLASSPATH环境变量,缺省为当前路径。但可使用set命令修改 set classpath=.;c:jav

64、amyclasses;4例:P.java定义了package tools;ToolTest.java中使用import tools.*;133面向对象编程3 3使用其他包中的类4import语句将指定包中的类引入当前的程序中,即告诉编译到哪去找程序中使用的类。4 import语句必须出现在所有类定义之前。例:import java.util.*;该语句引入整个utility 类库(标准Java库的一部分)例:import java.util.Vector;该语句只引入Vector类,但utility类库中的其他类不可用。134面向对象编程3 3从包中加载类4Java解释器加载类过程:将环境变量

65、CLASSPATH包含的一个或多个目录作为起始目录。解释器取出包名,将小数点换成斜杠,产生以CLASSPATH目录为起点的查找路径。查找目录下的.class文件当Java解释器对所生成的二进制字节码文件进行解释时,如果找不到所需使用的其他.class文件,系统会自动到CLASSPATH环境变量所指明的路径中去寻找4import p1.p2.*转换为 p1p2*.class 或 p1/p2/*.class(取决于操作系统)135面向对象编程3 3创建包、添加类package mypk;public class mycjavac d d:myc.java 会在指定目录下建包import mypk.

66、*;public class testa public static void main(String args)myc c=new myc();.set CLASSPATH=.;d:;%CLASSPATH%136面向对象编程3 3接口4“接口”是抽象类的概念。4接口中的方法都是没有方法体的抽象方法。4接口中只能定义 static final 属性。4接口定义的仅仅是实现某一特定功能的一组方法的对外接口和规范,而并没有真正地实现这个功能。4接口的功能实现是在“继承”了这个接口的各个类中完成的,由这些类来具体定义接口中所有抽象方法的方法体。4通常把对接口的“继承”称为“实现”。137面向对象编程3 3接口的实现Java单重继承Object类Abstract class classfinal class接口class继承实现138面向对象编程3 3接口(interface)4接口是一种特殊的类,是作为一个整体声明的抽象方法和常量方法:抽象、无定义的(不必写abstract)常量:隐含为final和static的 4接口定义 public interface 接口名 extends 父接口名

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

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

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


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