04-面向对象编程基础.pdf
《04-面向对象编程基础.pdf》由会员分享,可在线阅读,更多相关《04-面向对象编程基础.pdf(69页珍藏版)》请在得力文库 - 分享文档赚钱的网站上搜索。
1、4-面向对象编程基础面向对象编程基础面向对象编程基础面向对象编程基础田登山2010年3月16日星期二教学内容1.面向对象基础2.类与对象的实现3.值传递与地址传递4.其他类型数据成员一、面向对象基础?抽象(abstraction),就是从被研究对象中舍弃个别的、非本质的或与研究主旨无关的次要特征,而抽取其与研究工作有关的内容加以分析,形成对所研究问题正确的、简明扼要的认识。?所谓的数据抽象,就是把系统中需要处理的数据和施加于这些数据之上的操作结合在一起,根据功能、性质、作用等因素抽象成不同的抽象数据类型。每个抽象数据类型既包含了数据,也包含了针对这些数据的授权操作,并限定数据的值只能由某些操作
2、来观察和修改。数据抽象是一种更为严格、更为合理的抽象方法。1.1 OOP?面向对象的程序设计就是采用数据抽象数据抽象方法学来构建程序中的类和对象的。它强调把数据和操作结合为一个不可分的系统单位-“对象”,对象的外部只需要知道这个对象能做什么,而不必知道它是如何做的。1.1 OOP?收音机的重量,外观、当前正在收听的频率信息、开关状态、当前的音量都互有差别,调频和调音的按钮可能是旋转式的,也可能按键式的。在进行设计和编码前,需要先对收音机进行抽象,发现哪些与研究主体有关的特征和行为,抛弃那些无关的特征和行为。1.1 OOP?如果要开发一个图形化的收音机软件,用户主要使用调音和调频两个功能,关注的
3、是调音和调频这两个行为以及这两个行为所涉及的特征(音量、频率和开关状态),必然忽略掉收音机的品牌、重量、颜色、形状等无关特征。与函数类似,收音机如何实现音量和频率的调整,需要通过编码实现,外部用户(使用者)不必用关心收音机的内部实现细节,这正是运用了面向对象的数据抽象方法学。1.2 类与对象的概念?按照面向对象的思想,一切事物都是对象。在编码设计的时候,与研究问题有关的事物就是研究对象。在面向对象的程序设计中,把问题域中与研究主体有关的事物通过抽象成对象(Object),事物的静态特征(属性)用一组数据来描述,事物的动态特征(行为)则用一组方法来刻划1.2 类与对象的概念?这些收音机对象的状态
4、:大小、品牌、型号、当前的开关状态、当前收听的频率、当前的音量都各不相同。这种在某个时刻点有一个确定状态值的特征被称作是对象的状态;?当用户旋转了调频按钮或者调音按钮之后,收音机内部如何工作对于用户来说是看不到的,而且根本无需了解其内部机制。这样即使用户不知道电阻、电容等知识也可以通过调音和调频两个按钮来使用收音机。这种类似于调频、调音等需要外部用户来主动触发的行为就是对象的动态特征,对象的动态特征通常被称为对象的行为。1.2 类与对象的概念?类是创建对象的模板,对象是类的实例。类与对象之间的关系就如同一个模具与用这个模具铸造出来的铸件之间的关系一样。也就是说,可以把类与对象之间的关系看成是抽
5、象与具体的关系。对象是对研究事物的抽象认识,而类是对对象的抽象和归纳。1.2 类与对象的概念?明确了研究事物、对象和类的关系,编码时处理顺序如下:?研究问题,找出与研究主题有关信息,发现研究对象;接着,把研究对象抽象到类的层次;最后定义类。1.2 类与对象的概念?收音机类的研究内容:?类属性:?开关状态、频率、音量(大小、品牌、型号与研究主体无关,忽略)。?类方法:?调整音量,调整频率。收音机类-开/关频率音量:boolean:double:double+调音量()调频率():void:void2.1 抽象研究对象为类?类是抽象的,对象才是具体的,编码时内存中存储的是对象的状态以及对象的行为。
6、内存中存放的往往都是具体对象的状态,而不是抽象的类。?类是创建对象的模板,类定义决定了该类型对象所具备的属性和行为。只有先定义类,才能去定义该类对象。2.1 抽象研究对象为类?可以用Java语言实现的类图Radio-onfreqvol:boolean:double:int+chgVol(int offset)chgFreq(double offset):void:void2.1 抽象研究对象为类?类有三个定义要素:?(1)类标识:必须是一个合法的标识符;?(2)属性说明:用来描述相同对象的静态特征;?(3)类的方法(即类的成员方法):用来描述相同对象的动态特征。2.1 抽象研究对象为类?按照J
7、ava命名规范:类名的第一个字母必须大写,如果类名由多个单词组成,每个单词的首字母必须大写。?收音机开关状态只能是两种情况,开或者关,使用布尔类型boolean来描述,因为“开/关”是非法的标识符,需要调整为数据成员“on”;音量可以用0-100内的整数来表示,可以用整数类型int来存储?“音量”属性也是非法的标识符,需要调整为数据成员“vol”;?频率都是带有小数的,就需要用浮点数类型double来描述,定义为数据成员“freq”。2.1 抽象研究对象为类?现在,Radio类有三个属性:布尔类型的属性on,用于存储收音机的开关状态;整数类型的音量属性vol、浮点类型频率属性freq,用于存储
8、收音机的当前音量和频率状态值。属性on、freq和vol都变成了属性的合法Java标识符2.1 抽象研究对象为类?在实际调音或者调频的时候,需要手动旋转按钮来调小或者调大音量和频率。每次调整音量,通过旋转给定了一个偏移量,可以调小,也可以调大;调频也是如此。为此约定,调大时偏移量为正值,调小时为负值。2.1 抽象研究对象为类?方法定义:一个用于调整音量chgVol(),考虑到每次调整音量的时候需要传入一个偏移量,加入形参定义:void chgVol(int offset),其语法与函数相同。?另外一个成员方法用于调整频率:void chgFreq(double offset)。?这样一来,外部
9、调用者只需要知道成员方法的名字,通过成员方法名理解提供的服务功能,而不用理会成员方法的内部实现代码。2.1 抽象研究对象为类?其实,函数是一个功能,没有与对象绑定,为了函数能够编译成功,函数定义前加入了static来修饰。成员方法则是定义对象的一个功能,同样适用黑盒子原则,输入一些参数,进行处理之后返回处理结果。但是,成员方法绑定于对象,没有对象就不能调用其方法;而函数则不需要绑定对象,没有对象仍然可以调用函数。2.2 类的定义?class 类标识符?声明属性?定义方法?收音机类Radio.java的框架版本?class Radio?/可以加入属性和方法的定义?2.2 类的定义?加入数据成员后
10、的版本?class Radio?boolean on;?double freq;?int vol;?属性直接在类中进行定义,其定义方式与变量定义相同。区别在于普通变量定义于函数内部,而类的属性则直接定义在类中,与类方法(特殊的函数,后续介绍)平级。2.2 类的定义?class Radio?boolean on;?double freq;?int vol;?void chgVol(int offset)?/此处添加实现代码此处添加实现代码此处添加实现代码此处添加实现代码?void chgFreq(double offset)?/此处添加实现代码此处添加实现代码此处添加实现代码此处添加实现代码?2
11、.3 创建对象?类和对象的关系如同模板和零件的关系,当类定义完毕之后,就可以通过类这个模板来构建零件(对象,又称实例)了。创建对象的语法如下:?类名类名类名类名 对象名对象名对象名对象名=new 类名类名类名类名();?赋值表达式两边的代码是先执行右边的语句,也就是“new 类名()”,该语句执行时,将在内存中划出一个连续的内存块,用于存储对象的状态值。为了能够访问到刚刚构建的对象,需要定义该Radio类型的变量并通过赋值表达式进行赋值,编码者将通过该变量名来访问新开辟的内存块。2.3 创建对象?class Radio?boolean on;?double freq;?int vol;?voi
12、d chgVol(int offset)?/TODO:实现代码?void chgFreq(double offset)?/TODO:实现代码?public static void main(String args)?Radio r=new Radio();?/执行时在内存中创建对象执行时在内存中创建对象执行时在内存中创建对象执行时在内存中创建对象r。?2.3 创建对象?只有类编译成功后,生成了class类型的字节码文件后,虚拟机执行main()函数中的代码时,才能使用该字节码文件中定义的类模板在内存中划分对象空间,完成对象创建的处理。?至于对象的方法,则在调用的时候才去加载字节码中的成员方法的
13、实现代码2.4 访问对象的数据成员?一旦对象创建成功之后,就可以使用域操作符“.”来去访问(读取和修改)对象的状态;同样通过域操作符“.”还可以去调用对象的成员方法。2.4 访问对象的数据成员?class Radio?boolean on;?double freq;?int vol;?void chgVol(int offset)?/TODO:实现代码?void chgFreq(double offset)?/TODO:实现代码?public static void main(String args)?Radio r=new Radio();?if(r.on)?System.out.print
14、ln(r.vol);?else?System.out.println(已关已关已关已关);?2.4 访问对象的数据成员?public static void main(String args)?Radio r=new Radio();?r.on=true;?r.freq=99.8;?r.vol=28;?if(r.on)?System.out.println(r.vol);?else?System.out.println(已关);?2.5 构造方法初始化对象状态值?创建对象时,首先要为对象的状态值赋初值,这个过程被称作对象的初始化。对象的初始化过程通常用于存储现实世界中的对象信息。出于用户方便角
15、度,Java提供了专用的构造方法来完成这一操作。?构造方法是一个类的方法中,方法名与类名相同的类方法。每当使用new关键字创建一个对象,为新建对象开辟了内存空间之后,Java系统将自动调用构造方法初始化这个新建对象的各个状态。2.5 构造方法初始化对象状态值?构造方法是类的一种特殊方法,它的特殊性主要体现在以下几个方面:?(1)构造方法是类的一种特殊方法,它能够简化初始化对象数据成员的操作;?(2)构造方法的方法名与类的名称(类标识符)完全相同;?(3)不能对构造方法指定返回值类型,它有隐含的返回值,该值由系统内部使用,也不能声明为void;?(4)对于外部用户而言,通过new关键字调用类的构
16、造方法完成对象状态值的初始化;2.5 构造方法初始化对象状态值?(5)构造方法可以重载,可定义多个具有不同参数的构造方法;?(6)构造方法可以继承,即子类可以继承父类的构造方法;?(7)如果用户在一个自定义类中未定义该类的构造方法,系统自动在该类的字节码添加一个缺省的空构造方法。这个空构造方法没有形式参数,也没有任何具体语句,不能完成任何操作,通过new创建该对象时,系统会调用自动添加的构造方法完成对象的初始化。2.5 构造方法初始化对象状态值?构造方法分为以下两种类型:?(1)无参构造方法?如果用户没有在类中定义构造方法,则虚拟机在编源代码的译时候,会自动为本类添加一个空的构造方法,该构造方
17、法为无参构造方法。?在代码清单4-5 Radio.java中定义的Radio类,系统将自动添加空的无参构造方法如下:?Radio()/代码编译时自动添加的空的无参构造方法?2.5 构造方法初始化对象状态值?按照模板构建零件的规则,类是模具,对象是零件,先有了模具,才能有零件,类中定义了成员方法和数据成员。对于外部用户而言,通过“new”构建新对象的时候调用该类的构造方法,构造方法执行时首先根据属性定义,在内存分配内存块用于存储对象状态值。在构造方法中可以直接通过属性名来初始化新构建对象的状态值:比如把收音机的开关状态设置为true,音量设置为10,而频率不做设置,当然还是默认的0.0。2.5
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 04 面向 对象 编程 基础
限制150内