面向对象的核心特性

上传人:s9****2 文档编号:569817166 上传时间:2024-07-31 格式:PPT 页数:64 大小:985.01KB
返回 下载 相关 举报
面向对象的核心特性_第1页
第1页 / 共64页
面向对象的核心特性_第2页
第2页 / 共64页
面向对象的核心特性_第3页
第3页 / 共64页
面向对象的核心特性_第4页
第4页 / 共64页
面向对象的核心特性_第5页
第5页 / 共64页
点击查看更多>>
资源描述

《面向对象的核心特性》由会员分享,可在线阅读,更多相关《面向对象的核心特性(64页珍藏版)》请在金锄头文库上搜索。

1、第第3 3讲讲面向对象核心特性面向对象核心特性面向对象的核心特性面向对象的核心特性第第3 3讲讲面向对象核心特性面向对象核心特性面向对象思想面向对象思想n抽象抽象所有的所有的程序设计语言程序设计语言都实现了某种程度上的抽象都实现了某种程度上的抽象.抽象是把抽象是把问问题领域题领域的问题变成的问题变成计算机解决领域内计算机解决领域内的解决方法的解决方法.用计算机的思想用计算机的思想来解释问题来解释问题.n面向对象方法是提供了手段来直接描述问题领域内的面向对象方法是提供了手段来直接描述问题领域内的成分成分。我们我们将问题领域内的将问题领域内的成分成分在解决领域内表现为对象。在解决领域内表现为对象。

2、n当你阅读当你阅读OOP的程序时,你即是在阅读相应问题的描述。的程序时,你即是在阅读相应问题的描述。nOOP允许你以问题本身的术语来描述问题,而不是解决领域的术允许你以问题本身的术语来描述问题,而不是解决领域的术语。语。第第3 3讲讲面向对象核心特性面向对象核心特性面向对象程序设计面向对象程序设计n面向对象的程序设计面向对象的程序设计(object_orientedprogramming):面向对象方法的基本工作是划分和定义对象划分和定义对象。对对象的判断和划分与实际问题的领域有关。第第3 3讲讲面向对象核心特性面向对象核心特性AlanKay的的OOP五大原则五大原则(1)所有东西都是对象。所

3、有东西都是对象。(2)程序是一大堆程序是一大堆对象对象的组合;通过消息传递,的组合;通过消息传递,各对象知道自己该做些什么。各对象知道自己该做些什么。(3)每个对象都有自己的存储空间,可容纳其他每个对象都有自己的存储空间,可容纳其他对象。对象。(4)每个对象都有一种类型。每个对象都有一种类型。(5)同一类所有对象都能接收相同的消息同一类所有对象都能接收相同的消息。第第3 3讲讲面向对象核心特性面向对象核心特性封装(访问控制封装(访问控制):隐藏的实现):隐藏的实现n不妨把程序设计过程分成不妨把程序设计过程分成class creators和和client programmers两个部门两个部门.

4、nclasscreators的目的就是制造类,只把必须的部分向的目的就是制造类,只把必须的部分向clientprogrammer公开,而把其他部分隐藏起来。公开,而把其他部分隐藏起来。n有两个理由要控制类中成员的存取权限有两个理由要控制类中成员的存取权限.不让clientprogrammer随心所欲随心所欲地直接使用应该隐藏的部分来改变对象的行为让classcreator能随心所欲随心所欲地改变隐藏的部分,只要这种改变不会影响公开的部分第第3 3讲讲面向对象核心特性面向对象核心特性继承:重用实现继承:重用实现n最简单的重用一个类的方法是直接使用这个类最简单的重用一个类的方法是直接使用这个类的一

5、个对象来构筑新的对象或程序的一个对象来构筑新的对象或程序组织composition:用现有对象构筑一个新的对象在一个对象内部的对象通常是私有的第第3 3讲讲面向对象核心特性面向对象核心特性继承继承:重用接口重用接口n使用继承时,相当于创建了一个新类。这个新类不仅包含使用继承时,相当于创建了一个新类。这个新类不仅包含现有类型的所有成员,但更重要的是,它复制了基础类的现有类型的所有成员,但更重要的是,它复制了基础类的接口接口。可以向基础类的对象发送的所有消息可以同样地发可以向基础类的对象发送的所有消息可以同样地发给衍生类的对象给衍生类的对象:即新的衍生类具有与基础类相同的类型即新的衍生类具有与基础

6、类相同的类型n衍生类与基础类有两种关系:衍生类与基础类有两种关系:尽管具有相同的接口,但是通常具有不同的行为-IS-A或者在基础类的界面的基础上增加新的接口(extend)-IS-LIKE-A第第3 3讲讲面向对象核心特性面向对象核心特性多态性多态性n对于右边这个类族关系,对于右边这个类族关系,我们要进行的一项重要工我们要进行的一项重要工作是将作是将衍生类的对象当作衍生类的对象当作基础类的对象对待基础类的对象对待。它意。它意味着我们只须编写单一的味着我们只须编写单一的代码,令其忽略类型的特代码,令其忽略类型的特定细节,只与基础类的对定细节,只与基础类的对象打交道。象打交道。第第3 3讲讲面向对

7、象核心特性面向对象核心特性多态性(续)多态性(续)nUpcasting-把衍生类的对象当作其基础类的对象对待把衍生类的对象当作其基础类的对象对待voiddoStuff(Shapes)s.erase();/.s.draw();Circlec=newCircle();Trianglet=newTriangle();Linel=newLine();doStuff(c);doStuff(t);doStuff(l);你是一种Shape,我知道你能将自己删掉,即erase();请自己采取那个行动,并自己去控制所有的细节吧。第第3 3讲讲面向对象核心特性面向对象核心特性多态性(续)多态性(续)n动态绑定动态

8、绑定为Cirle调用draw()时执行的代码与为一个Square或Line调用draw()时执行的代码是不同的。但在将draw()消息发给一个不知道确切类型的Shape对象时,根据Shape引用当时连接的实际类型,会采取相应的正确的操作。多态性:将一条消息发给对象时,如果不知道对方的具体类多态性:将一条消息发给对象时,如果不知道对方的具体类型是什么,但采取的行动同样是正确的。型是什么,但采取的行动同样是正确的。在Java中,所有的函数调用都是动态绑定的。第第3 3讲讲面向对象核心特性面向对象核心特性类(类(Class)类是具有共同类是具有共同属性属性和和行为行为的对象的抽象。的对象的抽象。类可

9、以定义为类可以定义为数据数据和和方法方法的集合的集合。类也称为类也称为模板模板,因为它们提供了,因为它们提供了对象的基本框架对象的基本框架。属性 1方法 1属性 2方法 2第第3 3讲讲面向对象核心特性面向对象核心特性对象对象n类的实例:类的实例:每个实例有自己的存储空间每个实例有自己的存储空间(数据(数据类型和变量的关系)类型和变量的关系)n动态性,动态性,每个对象有自己的生存周期,会经历每个对象有自己的生存周期,会经历创建、运行到消亡的变化过程创建、运行到消亡的变化过程第第3 3讲讲面向对象核心特性面向对象核心特性类和对象的关系类和对象的关系类对象抽抽象象实实例例化化属性或状态属性或状态操

10、作或行为操作或行为数据或变量数据或变量方法方法封装的实体封装的实体=数据数据+方法方法建筑图纸建筑图纸楼房楼房1 1楼房楼房2 2楼房楼房3 3抽象抽象具体实例化一个实物具体实例化一个实物模具模具第第3 3讲讲面向对象核心特性面向对象核心特性类的封装性、继承性和多态性类的封装性、继承性和多态性n封装性封装性为类中的成员变量和成员方法提供多级访问权限n继承性继承性从已存在的类创建新类,使得新类自动拥有被继承类的全部成员n多态性多态性提供类中方法执行的多样性,重载(overload)和覆盖(overwrite)第第3 3讲讲面向对象核心特性面向对象核心特性类的定义类的定义n声明类声明类类声明类声明

11、成员变量的声明成员变量的声明;成员方法的声明及实现成员方法的声明及实现;n类声明的格式类声明的格式修饰符class类extends父类implements接口列表publicclassDate1/类声明intyear,month,day;/声明成员变量第第3 3讲讲面向对象核心特性面向对象核心特性类的定义(续)类的定义(续)n声明成员变量声明成员变量成员变量声明语法修饰符修饰符staticfinaltransient数据类型变量;publicclassDate1/类声明publicintyear,month,day;/声明成员变量第第3 3讲讲面向对象核心特性面向对象核心特性类的定义(续)类的

12、定义(续)n声明成员方法声明成员方法方法声明语法修饰符返回值类型返回值类型方法方法(参数列表)throws异常类语句序列;return返回值;方法体中的局部变量方法体中用return语句返回值n声明声明main方法方法publicstaticvoidmain(Stringargs)ncase:Date1.java第第3 3讲讲面向对象核心特性面向对象核心特性使用对象使用对象n声明对象声明对象n对象实例化对象实例化n引用对象的成员变量和调用对象方法引用对象的成员变量和调用对象方法n对象的引用模型对象的引用模型n方法调用的参数传递原则方法调用的参数传递原则n释放对象释放对象第第3 3讲讲面向对象核

13、心特性面向对象核心特性声明对象声明对象n声明对象的语法格式声明对象的语法格式类类对象句柄对象句柄;Date1aday;/声明aday是Date1类的一个对象句柄n声明对象仅仅说明了对象所属的类,声明对象仅仅说明了对象所属的类,对象并没对象并没有获得值。有获得值。第第3 3讲讲面向对象核心特性面向对象核心特性对象的创建对象的创建(实例化实例化)n对象的创建new关键字用于关键字用于创建对象创建对象,对象句柄=new类的构造方法(参数列表)Personp1=newPerson();第第3 3讲讲面向对象核心特性面向对象核心特性同类多个对象的内存分配同类多个对象的内存分配n成员变量:各对象独有成员变

14、量:各对象独有n成员方法:各对象共享成员方法:各对象共享栈内存栈内存.p1p2堆内存堆内存P1的成员变量的成员变量P2的成员变量的成员变量Shout()方法方法0x3000x30230 age 0 age 第第3 3讲讲面向对象核心特性面向对象核心特性对象的使用对象的使用n对象中成员变量和成员方法的使用:对象中成员变量和成员方法的使用:对象句柄对象句柄.成员变量对象句柄对象句柄.成员方法(参数列表)aday.year=2006;/引用对象的成员变量aday.setDate(2006,1,28)/引用对象的成员方法第第3 3讲讲面向对象核心特性面向对象核心特性对象的引用模型对象的引用模型第第3

15、3讲讲面向对象核心特性面向对象核心特性类的封装性类的封装性n构造方法与析构方法构造方法与析构方法n方法的重载方法的重载nthis引用和引用和instanceof对象运算符对象运算符n类及其成员的访问权限类及其成员的访问权限n实例成员与类成员实例成员与类成员第第3 3讲讲面向对象核心特性面向对象核心特性初始化和清除初始化和清除nAsthecomputerrevolutionprogresses,unsafeprogramminghasbecomeoneofthemajorculpritsthatmakesprogrammingexpensive.n初始化和清除是程序设计安全性的两个最重要的初始化

16、和清除是程序设计安全性的两个最重要的问题。问题。nC+为我们引入了构造函数和析构函数的概念,为我们引入了构造函数和析构函数的概念,Java也沿用构造函数这个概念,但新增了自己的也沿用构造函数这个概念,但新增了自己的垃圾收集器。垃圾收集器。第第3 3讲讲面向对象核心特性面向对象核心特性构造方法(构造函数)构造方法(构造函数)n构造方法:是一个在创建对象时被构造方法:是一个在创建对象时被自动调用自动调用的的特殊函数。特殊函数。n构造方法的特征构造方法的特征方法名与类名相同;方法名与类名相同;不含返回类型;不含返回类型;不能在方法中用不能在方法中用return语句返回一个值;语句返回一个值;在类实例

17、化时,它会由系统自动调用;在类实例化时,它会由系统自动调用;第第3 3讲讲面向对象核心特性面向对象核心特性用构造函数自动初始化用构造函数自动初始化n如果某个类有一个构造函数,那么在创建对象的如果某个类有一个构造函数,那么在创建对象的时候,时候,Java会自动调用那个构造函数。会自动调用那个构造函数。Case:SimpleConstructor.java第第3 3讲讲面向对象核心特性面向对象核心特性缺省构造函数缺省构造函数n如果一个类没有定义构造函数,则编译程序会帮如果一个类没有定义构造函数,则编译程序会帮我们自动创建一个缺省构造函数。我们自动创建一个缺省构造函数。n然而一旦定义了一个构造函数,

18、就不会帮我们自然而一旦定义了一个构造函数,就不会帮我们自动生成一个。动生成一个。nCase:DefaultCons.java第第3 3讲讲面向对象核心特性面向对象核心特性清除:收尾和垃圾收集清除:收尾和垃圾收集n垃圾收集机制只知道怎样释放由垃圾收集机制只知道怎样释放由new分配的内存,所以它不知道如何分配的内存,所以它不知道如何释放对象的释放对象的“特殊特殊”内存。内存。n析构方法析构方法publicvoidfinalize()语句序列;一旦垃圾收集机制准备好释放对象占用的存储空间,它首先调用finalize()。所以使用finalize(),就可以在垃圾收集期间进行一些重要的清除工作。n但是

19、但是finalize()和和C+的析构函数截然不同。的析构函数截然不同。1、垃圾收集不等于析构函数,在我们不再需要一个对象之前,有些行动是必须采取的,那么这些行动必须由程序员自己来采取。2、对象可能不会被当作垃圾被收集掉。3、垃圾收集只跟内存有关。第第3 3讲讲面向对象核心特性面向对象核心特性方法重载(方法重载(Methodsoverloading)n重载的含义:重载的含义:One of the important features in any programming language is the use of names.我们用名字引用或描述所有对象与方法。在日常生活中,我们用相同的词表

20、达多种不同的含义,即词的“重载”。大多数程序设计语言要求我们为每个函数都设定一个独一无二的标识符。但是构造函数的出现要求函数名也能够“重载”。Often, the same word expresses a number of different meanings - its overloaded.Case:Overloading.java第第3 3讲讲面向对象核心特性面向对象核心特性函数重载函数重载(续续)n成员方法重载参数列表必须不同,即以不同的参数个数、参数类型、参数的次序来区别重载方法返回值可以相同也可以不同,不能通过返回类型的不同来区分重载函数。不能通过返回类型的不同来区分重载函数。

21、publicsetDate(inty,intm,intd)publicsetDate(intm,intd)publicsetDate(intd)publicsetDate(Date1aday)n构造方法重载Date2aday1=newDate2();Date2aday2=newDate2(2006,2,28);第第3 3讲讲面向对象核心特性面向对象核心特性关键字关键字thisnthis引用:引用:this1.java指代对象本身thisCase:Leaf.java访问本类的成员变量和成员方法this.成员变量this.成员方法(参数列表)调用本类重载的构造方法this(参数列表)Case:Fl

22、ower.java构造函数调用必须是构造函数中的第一条语句,并且不能在一个构造函数调用两个以上的构造函数。ninstanceof对象运算符对象运算符adayinstanceofDate2第第3 3讲讲面向对象核心特性面向对象核心特性类及其成员的访问权限类及其成员的访问权限 Aprimaryconsiderationinobject-orienteddesignisseparatingthethingsthatchangefromthethingsthatstaythesame.n每个库的用户每个库的用户(clientprogrammer)必须能依赖自己使用必须能依赖自己使用的库,并知道一旦新版

23、本的库推出,自己不需要改写代的库,并知道一旦新版本的库推出,自己不需要改写代码。码。n为解决这个问题,为解决这个问题,Java推出了推出了“访问权限访问权限”的概念,允许的概念,允许库创建者声明哪些是客户程序员可以是使用的,哪些是库创建者声明哪些是客户程序员可以是使用的,哪些是不可以使用的。不可以使用的。nJava中为中为类中成员类中成员设置了设置了4种访问权限种访问权限,为,为类类设置了设置了2种访种访问权限问权限第第3 3讲讲面向对象核心特性面向对象核心特性类中成员的访问权限类中成员的访问权限(续)(续)n针对类内的每个成员的每个定义,针对类内的每个成员的每个定义,Java访问权限访问权限

24、friendly,public,protected和和private都放在它们的前面都放在它们的前面无论是数据无论是数据成员还是方法。成员还是方法。权限修饰符同一类同一包不同包的子类所有类public(公有)protected(保护)缺省private(私有)第第3 3讲讲面向对象核心特性面向对象核心特性类中成员的访问属性(续)类中成员的访问属性(续)npublic:接口访问:接口访问使用public关键字时,它意味着紧随在public后面的成员声明适用于所有人,特别是适用于使用库的客户程序员。Dinner.javanFriendly默认包默认包:位于相同的目录中,而且没有明确的包名的类也是被

25、认为是默认友好的Cake.javanprivate:不能接触!:不能接触!private关键字意味着除非那个特定的类,而且从那个类的方法里,否则没有人能访问那个成员.IceCream.javanprotected:“友好的一种友好的一种”.ChocolateChip.java第第3 3讲讲面向对象核心特性面向对象核心特性类的访问权限类的访问权限n在在Java中,也可用访问权限控制着客户程序员是否能够中,也可用访问权限控制着客户程序员是否能够创建创建属于这个类的一属于这个类的一个对象。个对象。n声明一个类可使用的权限修饰符只有声明一个类可使用的权限修饰符只有public和缺省(和缺省(frien

26、dly)两种,不能使两种,不能使用用protected和和private。publicclassDate1/公有的类公有的类classDate1_ex/默认的类默认的类第第3 3讲讲面向对象核心特性面向对象核心特性类的访问权限(续)类的访问权限(续)n然而,我们同时还要注意到一些额外的限制:然而,我们同时还要注意到一些额外的限制:(1)每个编译单元(文件)都只能有一个public类。每个编译单元有一个公共接口的概念是由那个公共类表达出来的。根据自己的需要,它可拥有任意多个提供支撑的“友好”类。但若在一个编译单元里使用了多个public类,编译器就会向我们提示一条出错消息。(2)public类的

27、名字必须与包含了编译单元的那个文件的名字完全相符,甚至包括它的大小写形式。如果出现不符,就会报告一个编译期错误(3)可能(但并常见)有一个编译单元根本没有任何公共类。此时,可按自己的意愿任意指定文件名。CASE:Lunch.java.第第3 3讲讲面向对象核心特性面向对象核心特性实例成员与类成员(静态成员实例成员与类成员(静态成员static)n两者区别:两者区别:实例成员实例成员(包括成员变量和成员方法)属于对象属于对象,只有创建了对象才能通过对象访问实例成员静态成员(包括静态成员变量和成员方法,前面有关键字static)属于类属于类,通过类名就可以直接访问类成员变量和调用类成员方法,即使没

28、有创建对象,也可以通过对象引用。第第3 3讲讲面向对象核心特性面向对象核心特性实例成员变量与静态成员变量实例成员变量与静态成员变量n两者声明时的差别两者声明时的差别publicclassPerson1Stringname;/姓名,实例成员变量intage;/年龄staticintcount;/人数,类成员变量Math类中:PublicsaticfinaldoublePI;第第3 3讲讲面向对象核心特性面向对象核心特性实例成员变量与静态成员变量实例成员变量与静态成员变量(续续)n两者存储结构的差别两者存储结构的差别Personp1=newPerson1(“李小明”,21);Personp2=ne

29、wPerson1(“王大伟”,19);第第3 3讲讲面向对象核心特性面向对象核心特性实例成员变量与静态成员变量实例成员变量与静态成员变量(续续)n两者引用方式的差别两者引用方式的差别实例成员变量属于对象,要通过对象引用,类成员属于类,既可以通过对象,也可以通过类访问p1.name/通过对象访问实例成员变量p1.count/通过对象访问静态成员变量Person1.count/通过类访问静态成员变量第第3 3讲讲面向对象核心特性面向对象核心特性实例成员方法与静态成员方法实例成员方法与静态成员方法n两者声明时的差别两者声明时的差别publicstaticinthowMany()/静态成员方法retu

30、rncount;/静态成员方法只能访问类成员变量静态成员方法只能访问类成员变量publicstaticvoidmain(Stringargs)/main方法也是类成员方法n两者方法体中语句的差别两者方法体中语句的差别在类成员方法体中,不能使用this引用。n两者调用方式的差别两者调用方式的差别Person1.howMany();/通过类名调用类成员方法p1.howMany();/通过对象调用第第3 3讲讲面向对象核心特性面向对象核心特性Static静态成员方法的几点说明静态成员方法的几点说明n在静态方法里只能直接调用同类中其他的静态成员在静态方法里只能直接调用同类中其他的静态成员(包括变量和方

31、法),而不能直接访问类中的非静态(包括变量和方法),而不能直接访问类中的非静态成员。(为什么?)成员。(为什么?)n静态方法不能以任何方式引用静态方法不能以任何方式引用this和和super关键字关键字nMain()方法是静态的,所以()方法是静态的,所以jvm在执行在执行main方法时方法时不创建不创建main方法所在类的实例对象,所以,我们方法所在类的实例对象,所以,我们不能不能在在main方法中使用该类的成员变量和成员函数,只有方法中使用该类的成员变量和成员函数,只有实例化后才能使用。实例化后才能使用。第第3 3讲讲面向对象核心特性面向对象核心特性成员初始化成员初始化nJava goes

32、 out of its way to guarantee that any variable is properly initialized before it is used.n由于任何方法都可以初始化或使用那个数据,所以在由于任何方法都可以初始化或使用那个数据,所以在正式使用数据前,若还是强迫程序员将其一一初始化成正式使用数据前,若还是强迫程序员将其一一初始化成一个适当的值,就可能不够实际。因此,一个类的所有一个适当的值,就可能不够实际。因此,一个类的所有primitive数据成员都会保证获得一个缺省值。当然,句数据成员都会保证获得一个缺省值。当然,句柄会获得柄会获得null值。值。nIn

33、itValues.java第第3 3讲讲面向对象核心特性面向对象核心特性成员初始化成员初始化n对象的对象的成员变量成员变量在创建时在创建时自动进行初始化自动进行初始化基本类型默认值booleanFlasecharu0000(null)byte(byte)0short(short)0int0long0Lfloat0.0fdouble0.0d第第3 3讲讲面向对象核心特性面向对象核心特性定义初始化和构造初始化定义初始化和构造初始化n定义初始化一个直接的做法是在定义数据成员的同时也为其赋值。classMeasurementbooleanb=true;charc=x;inti=47;也可以用相同的方法

34、初始化对象。classMeasurementDeptho=newDepth();第第3 3讲讲面向对象核心特性面向对象核心特性定义初始化和构造初始化定义初始化和构造初始化(续续)当然这个方法也可以使用参数,但是那些参数不能是尚未初始化的其它数据成员。classCInitinti=f();intk=g(i);/.;classCInitWrongintj=g(i);inti=f();/.;构造函数初始化构造函数初始化可以在构造函数中对数据成员初始化。第第3 3讲讲面向对象核心特性面向对象核心特性定义初始化顺序定义初始化顺序n在一个类里,定义初始化的顺序是由变量在在一个类里,定义初始化的顺序是由变量

35、在类内的定义顺序决定的。即使变量定义大类内的定义顺序决定的。即使变量定义大量遍布于方法定义的中间,那些变量仍然量遍布于方法定义的中间,那些变量仍然会在调用任何方法之前得到初始化会在调用任何方法之前得到初始化当当然在构造函数之前。然在构造函数之前。Case:OrderOfInitialization.java第第3 3讲讲面向对象核心特性面向对象核心特性静态数据初始化静态数据初始化n静态数据成员只在这个类的第一个对象要创建的时候初始化。Case:StaticInitialization.java第第3 3讲讲面向对象核心特性面向对象核心特性初始化顺序初始化顺序n我们总结一下对象的创建过程。考虑一

36、个叫做我们总结一下对象的创建过程。考虑一个叫做Dog的类的类:1、类型为Dog的一个对象首次创建时,或者Dog类的静态方法/数据首次访问时,Java解释器必须找到Dog.class。2、找到Dog.class后,它的所有的静态初始化模块都会运行。因此,静态初始化仅发生一次。3、创建一个newDog()时,new语句首先会在堆里分配一个足够的空间。4、这个空间将会被清除为零,因此Dog中所有的数据成员都得到了缺省值。5、执行定义初始化。6、执行构造函数。第第3 3讲讲面向对象核心特性面向对象核心特性类的重用类的重用nOne of the most compelling features abou

37、t Java is code reuse. But to be revolutionary, you ve got to be able to do a lot more than copy code and change it.n两种方法两种方法合成:在新类里简单地创建原有类的对象继承:创建一个新类,这个新类基于一个存在的基础类而定义出来。第第3 3讲讲面向对象核心特性面向对象核心特性类的继承性类的继承性n继承的概念继承的概念由一个已有的类定义一个新类,称为新类继承已有的类由一个已有的类定义一个新类,称为新类继承已有的类。n继承的作用继承的作用n继承原则继承原则子类继承父类的成员变量,包括实

38、例成员变量和类成员变量。子类继承父类除构造方法以外构造方法以外的成员方法,包括实例成员方法和类成员方法。子类不能继承父类的构造方法不能继承父类的构造方法。因为父类构造方法创建的是父类对象,子类必须声明自己的构造方法,创建子类自己的对象。子类能够继承父类的析构方法。子类不能删除不能删除父类成员。子类可以增加可以增加自己的成员变量和成员方法。子类可以重定义父类成员重定义父类成员。第第3 3讲讲面向对象核心特性面向对象核心特性定义继承的类定义继承的类n继承类的语法:关键字(继承类的语法:关键字(extends)修饰符class类extends父类implements接口列表publicclassSt

39、udent1extendsPerson1Stringspeciality; /专业Case:Persion1.javaStudent1.java第第3 3讲讲面向对象核心特性面向对象核心特性定义继承的类定义继承的类n单根结构:单根结构:Java中的类都是中的类都是Object的子类的子类publicclassPerson1extendsObjectn类的赋值相容性类的赋值相容性子类对象即是父类对象。n子类对象对父类成员的访问权限子类对象对父类成员的访问权限子类对父类的私有成员(private)没有访问权限;子类对父类的公有成员(public)和保护成员(protected)具有访问权限。子类对

40、父类中缺省权限成员的访问分两种情况,对同一包中父类的缺省权限成员具有访问权限,而对不同包中父类的缺省权限成员则没有访问权限。第第3 3讲讲面向对象核心特性面向对象核心特性定义继承的类定义继承的类n子类重定义从父类继承来的成员子类重定义从父类继承来的成员子类隐藏父类成员变量Case:TestAB.java子类覆盖覆盖父类成员方法子类继承并重载重载父类成员方法Case:Detergent.javanSuper引用:调用父类的构造方法引用:调用父类的构造方法super(参数列表)n引用父类同名成员引用父类同名成员子类隐藏父类成员变量super.成员变量子类覆盖父类成员方法super.成员方法(参数列

41、表)nCase:Student1.java第第3 3讲讲面向对象核心特性面向对象核心特性初始化和参数传递初始化和参数传递n构造一个子类时,父类的构造方法在子类的构造方法构造一个子类时,父类的构造方法在子类的构造方法之前被调用。之前被调用。n在子类的构造方法中可用在子类的构造方法中可用super(参数列表参数列表)调用父类的调用父类的构造方法。构造方法。n如果子类的构造方法中没有显示的调用父类构造方法,如果子类的构造方法中没有显示的调用父类构造方法,也没有使用也没有使用this关键字调用自己的其他构造方法,那么关键字调用自己的其他构造方法,那么在产生子类实例对象时在产生子类实例对象时JVM自动调

42、用父类无参数的构自动调用父类无参数的构造方法。造方法。nChess.java第第3 3讲讲面向对象核心特性面向对象核心特性类的多态性类的多态性n什么是多态什么是多态一个方法可以有多种实现版本一个方法可以有多种实现版本,即“一种定义,多种实现”,类的多态性表现为方法的多态性:方法的重载和方法的覆方法的重载和方法的覆盖(重写)盖(重写)方法的重载重载(overload)是指同一个类中的多个方法可以同名但参数列同名但参数列表必须不同。表必须不同。方法的覆盖覆盖(override)是指子类声明并实现父类中的同名方法并且参子类声明并实现父类中的同名方法并且参数列表也完全相同。数列表也完全相同。第第3 3

43、讲讲面向对象核心特性面向对象核心特性上溯造型(上溯造型(upcasting)n取得一个子类的对象句柄,可以将其作为基础取得一个子类的对象句柄,可以将其作为基础类型句柄使用的行为就叫作类型句柄使用的行为就叫作“上溯造型上溯造型”Case:Music.javan为什么要上溯造型?为什么要上溯造型?Case:Music2.javan上溯造型是安全的(为什么?)上溯造型是安全的(为什么?)第第3 3讲讲面向对象核心特性面向对象核心特性方法调用的绑定方法调用的绑定n将一个将一个方法调用同一个方法主体连接到一起方法调用同一个方法主体连接到一起就称为就称为“绑定绑定”(Binding)。)。早期绑定和后期绑

44、定(动态绑定)nJava中绑定的所有方法都采用中绑定的所有方法都采用后期绑定技术后期绑定技术,除非一,除非一个方法已被声明成个方法已被声明成finaln子类正确的调用自己的实现函数子类正确的调用自己的实现函数shapes,shapes.java,n扩展性扩展性music,music3.java第第3 3讲讲面向对象核心特性面向对象核心特性抽象类和最终类抽象类和最终类n抽象类抽象类声明抽象类与抽象方法publicabstractclassPlaneGraphics1/平面图形类,抽象类publicabstractdoublearea();/计算面积,抽象方法,分号;必不可少抽象类不能被实例化抽象

45、类不能被实例化PlaneGraphics1p=newPlaneGraphiic1()错误错误抽象类与抽象方法的作用抽象方法必须被子类覆盖第第3 3讲讲面向对象核心特性面向对象核心特性例:例:PlaneGraphics1n设计抽象的平面图形类设计抽象的平面图形类PlaneGraphics1Case:PlaneGraphics1.javan设计长方形类设计长方形类Rectangle1,继承平面图形类。,继承平面图形类。Case:Rectangle1.javan设计椭圆类设计椭圆类Ellipse1,继承平面图形类。,继承平面图形类。Case:Ellipse1.javan使用平面图形类及其子类使用平面

46、图形类及其子类Case:PlaneGraphics1_ex.java第第3 3讲讲面向对象核心特性面向对象核心特性第第3 3讲讲面向对象核心特性面向对象核心特性final关键字nfinal:一旦赋值后就不能改变了一旦赋值后就不能改变了n在在java中声明类、属性和方法时,可以使用关中声明类、属性和方法时,可以使用关键字键字final来修饰来修饰finalfordatafinalformethodsfinalforaclass第第3 3讲讲面向对象核心特性面向对象核心特性最终类(最终类(final)n声明最终类声明最终类publicfinalclassMathextendsObject/数学类,最终类/不能被继承不能被继承n声明最终方法声明最终方法publicclassCircle1extendsGraphics1publicfinaldoublearea()/最终方法,不能被子类覆盖最终方法,不能被子类覆盖returnMath.PI*this.radius*this.radius;

展开阅读全文
相关资源
正为您匹配相似的精品文档
相关搜索

最新文档


当前位置:首页 > 幼儿/小学教育 > 幼儿教育

电脑版 |金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号