面向对象的核心特性_第1页
面向对象的核心特性_第2页
面向对象的核心特性_第3页
面向对象的核心特性_第4页
面向对象的核心特性_第5页
已阅读5页,还剩59页未读 继续免费阅读

下载本文档

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

文档简介

1、面向对象的核心特性 面向对象思想抽象所有的程序设计语言都实现了某种程度上的抽象. 抽象是把问题领域的问题变成计算机解决领域内的解决方法. 用计算机的思想来解释问题. 面向对象方法是提供了手段来直接描述问题领域内的成分。 我们将问题领域内的成分在解决领域内表现为对象。 当你阅读OOP的程序时,你即是在阅读相应问题的描述。 OOP允许你以问题本身的术语来描述问题,而不是解决领域的术语。 面向对象程序设计 面向对象的程序设计(object_oriented programming):面向对象方法的基本工作是划分和定义对象。 对对象的判断和划分与实际问题的领域有关。Alan Kay的OOP五大原则(1

2、) 所有东西都是对象。 (2) 程序是一大堆对象的组合;通过消息传递,各对象知道自己该做些什么。 (3) 每个对象都有自己的存储空间,可容纳其他对象。 (4) 每个对象都有一种类型。(5) 同一类所有对象都能接收相同的消息。封装(访问控制 ):隐藏的实现不妨把程序设计过程分成class creators 和client programmers两个部门. class creators的目的就是制造类,只把必须的部分向client programmer公开,而把其他部分隐藏起来。有两个理由要控制类中成员的存取权限. 不让client programmer随心所欲地直接使用应该隐藏的部分来改变对象的

3、行为 让class creator能随心所欲地改变隐藏的部分,只要这种改变不会影响公开的部分 继承:重用实现 最简单的重用一个类的方法是直接使用这个类的一个对象来构筑新的对象或程序组织composition:用现有对象构筑一个新的对象 在一个对象内部的对象通常是私有的 继承: 重用接口 使用继承时,相当于创建了一个新类。这个新类不仅包含现有类型的所有成员,但更重要的是,它复制了基础类的接口。 可以向基础类的对象发送的所有消息可以同样地发给衍生类的对象: 即新的衍生类具有与基础类相同的类型 衍生类与基础类有两种关系: 尽管具有相同的接口,但是通常具有不同的行为 - IS-A 或者在基础类的界面的

4、基础上增加新的接口(extend) - IS-LIKE-A 多态性 对于右边这个类族关系,我们要进行的一项重要工作是将衍生类的对象当作基础类的对象对待。它意味着我们只须编写单一的代码,令其忽略类型的特定细节,只与基础类的对象打交道。多态性(续)Upcasting - 把衍生类的对象当作其基础类的对象对待void doStuff(Shape s) s.erase(); / . s.draw();Circle c = new Circle();Triangle t = new Triangle();Line l = new Line();doStuff(c);doStuff(t);doStuff(

5、l);你是一种Shape,我知道你能将自己删掉,即erase();请自己采取那个行动,并自己去控制所有的细节吧。 多态性(续)动态绑定为Cirle调用draw()时执行的代码与为一个Square或Line调用draw()时执行的代码是不同的。但在将draw()消息发给一个不知道确切类型的Shape对象时,根据Shape引用当时连接的实际类型,会采取相应的正确的操作。 多态性:将一条消息发给对象时,如果不知道对方的具体类型是什么,但采取的行动同样是正确的。 在Java中,所有的函数调用都是动态绑定的。 类(Class)类是具有共同属性和行为的对象的抽象。类可以定义为数据和方法的集合。类也称为模板

6、,因为它们提供了对象的基本框架。属性 1方法 1属性 2方法 2Class对象类的实例:每个实例有自己的存储空间(数据类型和变量的关系)动态性,每个对象有自己的生存周期,会经历创建、运行到消亡的变化过程类和对象的关系类对象抽象实例化属性或状态操作或行为数据或变量方法封装的实体=数据+方法建筑图纸楼房1楼房2楼房3抽象具体实例化一个实物模具类的封装性、继承性和多态性封装性为类中的成员变量和成员方法提供多级访问权限继承性从已存在的类创建新类,使得新类自动拥有被继承类的全部成员多态性提供类中方法执行的多样性,重载(overload)和覆盖(overwrite)类的定义声明类类声明 成员变量的声明;

7、成员方法的声明及实现;类声明的格式修饰符 class 类 extends 父类 implements 接口列表public class Date1/类声明 int year, month, day;/声明成员变量类的定义(续)声明成员变量成员变量声明语法修饰符 staticfinaltransient 数据类型 变量;public class Date1/类声明 public int year, month, day;/声明成员变量类的定义(续)声明成员方法方法声明语法修饰符 返回值类型 方法(参数列表) throws 异常类 语句序列; return 返回值;方法体中的局部变量方法体中用re

8、turn语句返回值声明main方法 public static void main(String args)case:Date1.java使用对象声明对象对象实例化引用对象的成员变量和调用对象方法对象的引用模型方法调用的参数传递原则释放对象声明对象声明对象的语法格式类 对象句柄;Date1 aday;/声明aday是Date1类的一个对象句柄声明对象仅仅说明了对象所属的类,对象并没有获得值。对象的创建( 实例化)对象的创建new关键字用于创建对象,对象句柄 = new 类的构造方法(参数列表) Person p1=new Person();同类多个对象的内存分配成员变量:各对象独有成员方法:各

9、对象共享栈内存.p1p2堆内存P1的成员变量P2的成员变量Shout()方法0 x3000 x30230 age 0 age 对象的使用对象中成员变量和成员方法的使用:对象句柄.成员变量对象句柄.成员方法(参数列表)aday.year = 2006; /引用对象的成员变量aday.setDate(2006,1,28) /引用对象的成员方法对象的引用模型类的封装性构造方法与析构方法方法的重载this引用和instanceof对象运算符类及其成员的访问权限实例成员与类成员初始化和清除 As the computer revolution progresses, unsafe programming

10、 has become one of the major culprits that makes programming expensive. 初始化和清除是程序设计安全性的两个最重要的问题。 C+为我们引入了构造函数和析构函数的概念,Java也沿用构造函数这个概念,但新增了自己的垃圾收集器。 构造方法(构造函数)构造方法:是一个在创建对象时被自动调用的特殊函数。构造方法的特征方法名与类名相同;不含返回类型;不能在方法中用return语句返回一个值;在类实例化时,它会由系统自动调用; 用构造函数自动初始化 如果某个类有一个构造函数,那么在创建对象的时候,Java会自动调用那个构造函数。Case

11、: SimpleConstructor.java 缺省构造函数如果一个类没有定义构造函数,则编译程序会帮我们自动创建一个缺省构造函数。然而一旦定义了一个构造函数,就不会帮我们自动生成一个。Case:DefaultCons.java 清除:收尾和垃圾收集垃圾收集机制只知道怎样释放由new分配的内存,所以它不知道如何释放对象的 “特殊”内存。析构方法 public void finalize()语句序列;一旦垃圾收集机制准备好释放对象占用的存储空间,它首先调用finalize()。所以使用 finalize(),就可以在垃圾收集期间进行一些重要的清除工作。 但是finalize()和C+的析构函数

12、截然不同。 1、垃圾收集不等于析构函数,在我们不再需要一个对象之前,有些行动是必须采取的,那么这些行动必须由程序员自己来采取。 2、对象可能不会被当作垃圾被收集掉。 3、垃圾收集只跟内存有关。 方法重载(Methods overloading) 重载的含义:One of the important features in any programming language is the use of names. 我们用名字引用或描述所有对象与方法。 在日常生活中,我们用相同的词表达多种不同的含义,即词的“重载”。 大多数程序设计语言要求我们为每个函数都设定一个独一无二的标识符。 但是构造函数的

13、出现要求函数名也能够“重载”。 Often, the same word expresses a number of different meanings - its overloaded. Case: Overloading.java 函数重载(续)成员方法重载参数列表必须不同,即以不同的参数个数、参数类型、参数的次序来区别重载方法返回值可以相同也可以不同,不能通过返回类型的不同来区分重载函数。 public setDate(int y ,int m , int d)public setDate(int m, int d)public setDate(int d)public setDate

14、(Date1 aday) 构造方法重载Date2 aday1 = new Date2();Date2 aday2 = new Date2(2006,2,28);关键字thisthis引用:this1.java指代对象本身thisCase: Leaf.java访问本类的成员变量和成员方法this.成员变量this.成员方法(参数列表)调用本类重载的构造方法this(参数列表)Case:Flower.java 构造函数调用必须是构造函数中的第一条语句,并且不能在一个构造函数调用两个以上的构造函数。instanceof对象运算符aday instanceof Date2类及其成员的访问权限 A pr

15、imary consideration in object-oriented design is separating the things that change from the things that stay the same. 每个库的用户(client programmer)必须能依赖自己使用的库,并知道一旦新版本的库推出,自己不需要改写代码。 为解决这个问题,Java推出了“访问权限”的概念,允许库创建者声明哪些是客户程序员可以是使用的,哪些是不可以使用的。Java中为类中成员设置了4种访问权限,为类设置了2种访问权限 类中成员的访问权限 (续)针对类内的每个成员的每个定义,Ja

16、va访问权限friendly,public, protected和private都放在它们的前面无论是数据成员还是方法。 权限修饰符同一类同一包不同包的子类所有类public(公有)protected(保护)缺省private(私有)类中成员的访问属性(续)public:接口访问使用public关键字时,它意味着紧随在public后面的成员声明适用于所有人,特别是适用于使用库的客户程序员。Dinner.javaFriendly默认包:位于相同的目录中,而且没有明确的包名的类也是被认为是默认友好的 Cake.javaprivate:不能接触!private关键字意味着除非那个特定的类,而且从那个

17、类的方法里,否则没有人能访问那个成员. IceCream.javaprotected:“友好的一种”. ChocolateChip.java 类的访问权限在Java中,也可用访问权限控制着客户程序员是否能够创建属于这个类的一个对象。声明一个类可使用的权限修饰符只有public和缺省(friendly)两种,不能使用protected和private。public class Date1 /公有的类class Date1_ex /默认的类类的访问权限(续)然而,我们同时还要注意到一些额外的限制:(1) 每个编译单元(文件)都只能有一个public类。每个编译单元有一个公共接口的概念是由那个公共类

18、表达出来的。根据自己的需要,它可拥有任意多个提供支撑的“友好”类。但若在一个编译单元里使用了多个public类,编译器就会向我们提示一条出错消息。(2) public类的名字必须与包含了编译单元的那个文件的名字完全相符,甚至包括它的大小写形式。如果出现不符,就会报告一个编译期错误(3) 可能(但并常见)有一个编译单元根本没有任何公共类。此时,可按自己的意愿任意指定文件名。CASE: Lunch.java.实例成员与类成员(静态成员static)两者区别:实例成员(包括成员变量和成员方法)属于对象,只有创建了对象才能通过对象访问实例成员静态成员(包括静态成员变量和成员方法,前面有关键字stati

19、c)属于类,通过类名就可以直接访问类成员变量和调用类成员方法,即使没有创建对象,也可以通过对象引用。实例成员变量与静态成员变量两者声明时的差别public class Person1 String name; /姓名,实例成员变量 int age; /年龄 static int count; /人数,类成员变量Math类中:Public satic final double PI;实例成员变量与静态成员变量(续)两者存储结构的差别Person p1 = new Person1(“李小明”,21);Person p2 = new Person1(“王大伟”,19);实例成员变量与静态成员变量(续

20、)两者引用方式的差别实例成员变量属于对象,要通过对象引用,类成员属于类,既可以通过对象,也可以通过类访问 / 通过对象访问实例成员变量p1.count /通过对象访问静态成员变量Person1.count / 通过类访问静态成员变量实例成员方法与静态成员方法两者声明时的差别public static int howMany()/静态成员方法 return count; /静态成员方法只能访问类成员变量public static void main(String args)/main方法也是类成员方法两者方法体中语句的差别在类成员方法体中,不能使用this引用。 两者调用方式的差别

21、Person1.howMany(); /通过类名调用类成员方法p1.howMany(); /通过对象调用Static 静态成员方法的几点说明在静态方法里只能直接调用同类中其他的静态成员(包括变量和方法),而不能直接访问类中的非静态成员。(为什么?)静态方法不能以任何方式引用this和super关键字Main()方法是静态的,所以jvm在执行main方法时不创建main方法所在类的实例对象,所以,我们 不能在main方法中使用该类的成员变量和成员函数,只有实例化后才能使用。成员初始化 Java goes out of its way to guarantee that any variable

22、is properly initialized before it is used. 由于任何方法都可以初始化或使用那个数据,所以在正式使用数据前,若还是强迫程序员将其一一初始化成一个适当的值,就可能不够实际。因此,一个类的所有primitive数据成员都会保证获得一个缺省值。当然,句柄会获得null值。InitValues.java 成员初始化对象的成员变量在创建时自动进行初始化基本类型默认值booleanFlasecharu0000(null)byte(byte)0short(short)0int0long0L float0.0fdouble0.0d定义初始化和构造初始化 定义初始化一个直

23、接的做法是在定义数据成员的同时也为其赋值。 class Measurement boolean b=true;char c=x;int i=47; ;也可以用相同的方法初始化对象。 class Measurement Depth o = new Depth(); ; 定义初始化和构造初始化(续)当然这个方法也可以使用参数,但是那些参数不能是尚未初始化的其它数据成员。 class CInit int i = f(); int k = g(i); / . ; class CInitWrong int j = g(i); int i = f(); / . ; 构造函数初始化可以在构造函数中对数据成员

24、初始化。 定义初始化顺序 在一个类里,定义初始化的顺序是由变量在类内的定义顺序决定的。即使变量定义大量遍布于方法定义的中间,那些变量仍然会在调用任何方法之前得到初始化当然在构造函数之前。 Case: OrderOfInitialization.java 静态数据初始化 静态数据成员只在这个类的第一个对象要创建的时候初始化。 Case: StaticInitialization.java 初始化顺序我们总结一下对象的创建过程。考虑一个叫做Dog的类: 1、类型为Dog的一个对象首次创建时,或者Dog类的静态方法/数据首次访问时,Java解释器必须找到Dog.class。 2、找到Dog.clas

25、s后,它的所有的静态初始化模块都会运行。因此,静态初始化仅发生一次。 3、创建一个new Dog( )时,new语句首先会在堆里分配一个足够的空间。 4、这个空间将会被清除为零,因此Dog中所有的数据成员都得到了缺省值。 5、执行定义初始化。 6、执行构造函数。 类的重用One of the most compelling features about 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. 两种方法合成:在

26、新类里简单地创建原有类的对象继承:创建一个新类,这个新类基于一个存在的基础类而定义出来。类的继承性继承的概念由一个已有的类定义一个新类,称为新类继承已有的类。 继承的作用继承原则子类继承父类的成员变量,包括实例成员变量和类成员变量。子类继承父类除构造方法以外的成员方法,包括实例成员方法和类成员方法。子类不能继承父类的构造方法。因为父类构造方法创建的是父类对象,子类必须声明自己的构造方法,创建子类自己的对象。子类能够继承父类的析构方法。子类不能删除父类成员。子类可以增加自己的成员变量和成员方法。子类可以重定义父类成员。定义继承的类继承类的语法:关键字(extends)修饰符 class 类 ex

27、tends 父类 implements 接口列表public class Student1 extends Person1 String speciality; /专业Case:Persion1.java Student1.java定义继承的类单根结构:Java中的类都是Object的子类public class Person1 extends Object类的赋值相容性子类对象即是父类对象。 子类对象对父类成员的访问权限子类对父类的私有成员(private)没有访问权限;子类对父类的公有成员(public)和保护成员(protected)具有访问权限。子类对父类中缺省权限成员的访问分两种情况

28、,对同一包中父类的缺省权限成员具有访问权限,而对不同包中父类的缺省权限成员则没有访问权限。定义继承的类子类重定义从父类继承来的成员子类隐藏父类成员变量Case: TestAB.java子类覆盖父类成员方法子类继承并重载父类成员方法Case : Detergent.javaSuper引用:调用父类的构造方法super(参数列表)引用父类同名成员子类隐藏父类成员变量super.成员变量子类覆盖父类成员方法super.成员方法(参数列表)Case:Student1.java初始化和参数传递构造一个子类时,父类的构造方法在子类的构造方法之前被调用。在子类的构造方法中可用super(参数列表)调用父类的构造方法。如果子类的构造方法中没有显示的调用父类构造方法,也没有使用this关键字调用自己的其他构造方法,那么在产生子类实例对象时JVM自动调用父类无参数的构造方法。Chess.java类的多态性什么是多态一个方法可以有多种实现版本,即“一种定义,多种实现”,类的多态性表现为方法的多态性:方法的重载和方法的覆盖(重写)方法的重载重载(overload)是指同一个类中的多个方法可以同名但参数列表必须不同。方法的覆盖覆盖(override)是指子类声明并实现父类中的同名

温馨提示

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

评论

0/150

提交评论