Java-面向对象设计-类和对象.docx
《Java-面向对象设计-类和对象.docx》由会员分享,可在线阅读,更多相关《Java-面向对象设计-类和对象.docx(41页珍藏版)》请在咨信网上搜索。
1、Java面向对象设计类和对象理解面向对象程序设计面向对象程序(Object-oriented programming, OOP)设计是继面向过程又一 具有里程碑意义的编程思想,是现实世界模型的自然延伸。下面从结构化程序 设计说起,逐步展示面向对象程序设计。结构化程序设计简介早期的程序设计,大量使用共享变量(全局变量)和GOTO语句,这使得代码结 构比较混乱,不容易改错和复用,后来有人证明所有的有意义的程序流程都可 以使用顺序、选择和循环来实现,并由此提出结构化程序设计。其概念最早由在1965年提出的,是软件发展的一个重要的里程碑。它的主要图中座椅设计图就是“类”,由这个图纸设计出来的若干的座椅
2、就是按照该类 产生的“对象”。可见,类描述了对象的属性和对象的行为,类是对象的模 板。对象是类的实例,是一个实实在在的个体,一个类可以对应多个对象。可 见,如果将对象比做座椅,那么类就是座椅的设计图纸,所以面向对象程序设 计的重点是类的设计,而不是对象的设计。一个类按同种方法产生出来的多个对象,其开始的状态都是一样的,但是修改 其中一个对象的时候,其他的对象是不会受到影响的,例如,修改第1把座椅(如锯短椅子腿)的属性时,其他的座椅是不会受到影响。再举一个例子来说明类与对象的关系。17世纪德国著名的哲学家、数学家莱布 尼茨(Leibniz, 1646年一1716年)曾有个著名的哲学论断:“世界上
3、没有两 片完全相同的树叶。”这里,我们用“类”与“对象”的关系来解释:类相同 它们都叫树叶,而对象各异一一树叶的各个属性值(品种、大小、颜色 等)是有区别的,如上图所示。从这个案例也可以得知,类(树叶)是一个抽 象的概念,它是从所有对象(各片不同的树叶)提取出来的共有特征描述。而 对象(各片具体的不同树叶)则是类(树叶这个概念)的实例化。类的声明与定义在使用类之前,必须先声明它,然后才可以声明变量,并创建对象。类声明的 语法如下。可以看到,声明类使用的是class关键字。声明一个类时,在class关键字后 面加上类的名称,这样就创建了一个类,然后在类的里面定义成员变量和方 法。在上面的语法格式
4、中,标识符可以是public、private、protected或者完全省 略这个修饰符,类名称只要是一个合法的标识符即可,但从程序的可读性方面 来看,类名称最好是由一个或多个有意义的单词连缀而成,每个单词首字母大 写,单词间不要使用其他分隔符。类的标识符可以是访问控制符。Java提供了一系列的访问控制符来设置基于类(class)、变量(variable)、方法(method)及构造方法(constructor) 等不同等级的访问权限。Java的访问权限主要有4类。默认模式(default)。在默认模式下,不需为某个类、方法等不加任何访 问修饰符。这类方式声明的方法和类,只允许在同一个包(pa
5、ckage)内是可访 问的。private (私有)。这是Java语言中对访问权限控制最严格的修饰符。如果 一个方法、变量和构造方法被声明为“私有”访问,那么它仅能在当前声明它 的类内部访问。类和接口 (interface)的访问方式是不能被声明为私有的。public (公有)。这是Java语言中访问权限控制最宽松的修饰符。如果一 个类、方法、构造方法和接口等被声明为“公有”访问,那么它不仅可以被跨 类访问,而且允许跨包访问。如果需要访问其他包里的公有成员,则需要事先 导入(import)那个包含所需公有类、变量和方法等的那个包。protected (保护)。介于public和private之
6、间的一种访问修饰符。如 果一个变量、方法和构造方法在父类中被声明为“保护”访问类型,只能被类 本身的方法及子类访问,即使子类在不同的包中也可以访问。类和接口(interface)的访问方式是不能声明为保护类型的。类的标识符除了上述的4个访问控制符,还可以是finale关键字“final”有 “无法改变的”或者“终态的”含义。一个类一旦被声明为final,那这个 final类不能被继承,因此final类的成员方法没有机会被覆盖,默认情况下 类都是default的。在设计类时候,如果这个类不需要有子类,类的实现细节 不允许改变,并且确信这个类不会再被扩展,那么就设计为final类。类的组成使用(P
7、erson, java)。程序首先用class声明了一个名为Person的类,在这里Person是类的名称。第3、4行先声明了两个属性(即描述数据的变量)name和age, name为String (字符串类型)型,age为int (整型)型。第58行声明了一个talk。方法操作数据(如name和age)的方法,此类的定义对一个类定义而言,构造方法(constructor,又称构造器或构造函数)、属性和方法是三种最常见的成员,它们都可以定义零个或多个。如果三种成员都只 定义零个,那实际上是定义了一个空类,那就失去了定义类的意义了。类中各个成员之间,定义的先后顺序没有任何影响。各成员可相互调用,
8、但值 得注意的是,static修饰的成员不能访问没有static修饰的成员。属性用于定义该类或该类的实例所包含的各种数据。方法则用于定义类中的行 为特征或功能实现(即对数据的各种操作)。构造方法是一种特殊的方法,专 用于构造该类的实例(如实例的初始化、分配实例内存空间等),Java语言通 过new关键字来调用构造方法,从而返回该类的实例。定义一个类后,就可以创建类的实例了,创建类实例通过new关键字完成。下 面通过一个实例讲解如何定义并使用类。在ColorDefine这个类中,在第03行定义了一个String类型的属性color,并赋初值“黑色”。在第05行第08行,定义了一个普通的方法get
9、Mes (), 其完成的功能是向屏幕输出字符串“定义类”。第10行15行,定义了一个 公有访问的静态方法一一main方法。在main方法中,代码第12行中,定义了 ColorDefine的对象b,第13行输出了对象b的数据成员color,第14行调用 了对象的方法getMes 0 o还可以看出,在类ColorDefine中,没有构造方法(即与类同名的方法)。但 事实上,如果用户没有显式定义构造方法,Java编译器会提供一个默认的无参 构造方法。类的属性类的基本组成部分包括属性和方法。通过前面的学习,其实大家对方法这个概念并不陌生。例如,在前面内容中, 基本上每个范例都使用了 System, o
10、ut. printin()语句,那么它代表什么含义 呢?事实上,System是系统类(class), out是标准输出对象(object),而 printin()是对象out中的一个方法(method) 0这句话的完整含义就是调用系统 类System中的标准输出对象out中的方法printlnO。一言蔽之,方法就是解决一类问题的步骤的有序组合。由于它涉及的概念很多,我会在后期文章详细探讨这个概念。这里仅做简单的提及,让大家有个初 步的认知。下面我们先来讲解类的属性,类的屈性也称为字段或成员变量,不过习惯上将 它称为属性。属性的定义类的属性是变量。定义属性的语法如下。属性语法格式的详细说明如下。
11、(1)修饰符:修饰符可省略,也可是访问控制符public、protected private 及static、final,其中三个访问控制符public protected和private只能 使用其中之一,static和final则可组合起来修饰属性。属性类型:属性类型可以是Java允许的任何数据类型,包括基本类型(int、float等)和引用类型(类、数组、接口等)。属性名:从语法角度来说,属性名则只要是一个合法的标识符即可。但如果 从程序可读性角度来看,属性名应该由一个或多个有意义的单词(或能见名知 意的简写)连缀而成,推荐的风格是第一个单词应以小写字母作为开头,后面 的单词则用大写字母
12、开头,其他字母全部小写,单词间不使用其他分隔符。如:StringstudentNumber;默认值:定义属性还可以定义一个可选的默认值。提示属性是一种比较符合汉语习惯的说法,在Java的官方文献中,属性被称为Field,因此有些书籍也把“属性”翻译为“字段”或“域”,它们本质上是相 同的。属性的使用下面通过一个实例来讲解类的属性的使用,通过这个实例可以看出在Java中类 属性和对象属性的不同使用方法。类的属性组使用(usingAttribute. java)观点是采用自顶向下、逐步求精及模块化的程序设计方法,使用三种基本控制 结构构造程序,任何程序都可由顺序、选择、循环这三种基本控制结构来构
13、造。结构化程序设计主要强调的是程序的易读性。在该程序设计思想的指导下,编程基本是通过写不同目的的函数/过程来实现,故又称为“面向过程编程(ProcedureOriented Programming, POP)。面向过程开发方式是对计算机底层结构的一层抽象,它把程序的内容分为数据和操纵数据的操纵两个部分。这结构化程序设计方法可以用一句话概括:程序=算法+数据结构这里的“算法”可以用顺序、选择、循环这三种基本控制结构来实现。这里的“数据结构”是指数据以及其相应的存取方式。程序与算法和数据结构之间的关系如上图所示。面向对象程序设计简介代码第03-04行,定义了两个String类型的属性a和b,由于它
14、们是静态的, 所以它们是属于类的,也就是属于所有这个类定义的对象共有的,所有对象看 到的静态属性值是相同的。代码第06-07行,定义了两个String类型的属性c和d,由于它们是非静态 的,所以它们是属于这个类所定义的对象私有的,每个对象都有这个属性,且 它们各自的属性值可不同。 代码第09-14行,定义了静态方法块,它没有名称。使用static关键字加以修 饰并用大括号 ”括起来的代码块称为静态代码块,用来初始化静态成员变 量。如静态变量b被初始化为string-b。代码第23-28行,定义了一个构造方法usingAttribute (),在这个方法中, 使用了类中的各个属性。构造方法与类同
15、名,且无返回值(包括void),它的 主要目的是创建对象。这里仅是为了演示,才使用了若干输出语句。实际使用 过程中,这些输出语句不是必需的。代码30-37行,定义了公有方法print 0,用于打印所有属性值,包括静态成 员值。代码39-45行,定义了常见的主方法mainO,在这个方法中,第44行使用关 键字new和构造方法usingAttribute ()来创建一个匿名对象。由输出结果可以看出,Java类属性和对象属性的初始化顺序如下。类属性(静态变量)定义时的初始化,如范例中的static String a= “string-a” 。static块中的初始化代码,如范例中的static ()
16、中的b = string- b” o对象属性(非静态变量)定义时的初始化,如范例中的String c = stirng-c。 构造方法(函数)中的初始化代码,如范例构造方法中的d二“string- d。当然这里只是为了演示Java类的属性和对象属性的初始化顺序。在实际的应用 中,并不建议在类中定义属性时实施初始化,如例子中的字符串变量“a”和“C” O注意,被static修饰的变量称为类变量(class s variables),它们被类的 实例所共享。也就是说,某一个类的实例改变了这个静态值,其他这个类的实 例也会受到影响。而成员变量(member variable)则是没有被static修
17、饰的 变量,为实例所私有,也就是说,每个类的实例都有一份自己专属的成员变 量,只有当前实例才可更改它们的值。static是一个特殊的关键字,其在英文中直译就是静态的意思。它不仅用于修 饰属性(变量),成员,还可用于修饰类中的方法。被static修饰的方法,同 样表明它是属于这个类共有的,而不是属于该类的单个实例,通常把static修 饰的方法也称为类方法。对象的声明与使用在上述范例中,已创建好了一个Person的类,相信类的基本形式读者应该已经 很清楚了。但是在实际中单单有类是不够的,类提供的只是一个模板,必须依 照它创建出对象之后才可以使用。对象的声明下面定义了由类产生对象的基本形式。创建属
18、于某类的对象,需要通过下面两个步骤实现。 声明指向“由类所创建的对象的变量。利用new创建新的对象,并指派给先前所创建的变量。 举例来说,如果要创建Person类的对象,可用下列语句实现。当然也可以用下面的这种形式来声明变量。提示对象只有在实例化之后才能被使用,而实例化对象的关键字就是newo对象实例化的过程如下图所示。从图中可以看出,当语句执行到Person pl的时候,只是在“栈内存”中声明 了一个Person对象pl的引用,但是这个时候pl并没有在“堆内存”中开辟空 间。对象的“引用”本质上就是一个对象在堆内存的地址,所不同的是,在Java中,用户无法向C/C+那样直接操作这个地址。本质
19、上,“new Person。”就是使用new关键字,来调用构造方法PersonO , 创建一个真实的对象,并把这个对象在“堆内存”中的占据的内存首地址赋予 pl,这时pl才能称为一个实例化的对象。这里做个对比来说明“栈内存”和“堆内存”的区别。在医院里,为了迎接一 个新生命的诞生,护士会先在自己的登记本上留下一行位置,来记录婴儿床的 编号,一旦婴儿诞生后,就会将其安置在育婴房内的某个婴儿床上。然后护士 就在登记木上记录下婴儿床编号,这个编号不那么好记,就给这个编号取个好 记的名称,例如pl,那么这个pl (本质上就为婴儿床编号)就是这个婴儿“对 象”的引用,找到这个引用,就能很方便找到育婴房里
20、的婴儿。这里,护士的 登记表就好比是“栈内存”,它由护士管理,无需婴儿父母费心。而育婴房就 好比是“堆内存”,它由婴儿爸妈显式申请(使用new操作)才能有床位,但 一旦使用完毕,会由一个专门的护工(编译器)来清理回收这个床位一一在 Java中,有专门的内存垃圾回收(Garbage Collection, GO)机制来负责回收 不再使用的内存。对象的使用如果要访问对象里的某个成员变量或方法,可以通过下面的语法来实现。例如,想访问Person类中的name和age属性,可用如下方法来访问。因此若想将Person类的对象p中的属性name赋值为“张三,年龄赋值为25,则可采用下面的写法。25,则可采
21、用下面的写法。如果想调用Person中的talk()方法,可以采用下面的写法。对于对象属性和方法点操作符”,这里建议大家直接读成“的”,例如,pl. name = “张三”,可以读成“pl的name被赋值为张三。再例如,“pl. talkO 可以读成“pl的talk。方法”。这样读是有原因的:点操作符 ”对应的英文为“dot dot w ,通常“t”的发音弱化而读成“do ”(大家可以尝试用英文读一下来体会一下),而“ do的发音很接 近汉语“的”的发音de,如下图所示。此外,“的”在含义上也有“所属” 关系。因此将点操作符”读成“的”,音和意皆有内涵。使用Person类的对象调用类中的属性与
22、方法的过程(ObjectDemo. java)。第06行声明了一个Person类的实例对象pl,并通过new操作,调用构造方法PersonO ,直接实例化此对象。第07-08行,对pl对象中的属性(name和age)进行赋值。第9行调用pl对象中talk。方法,实现在屏幕上输出信息。代码12-20行,是Person类的定义。对照上述程序代码与下图的内容,即可了解到Java是如何对对象成员进行访问匿名对象匿名对象是指就是没有名字的对象。实际上,根据前面的分析,对于一个对象 实例化的操作来讲,对象真正有用的部分是在堆内存里面,而栈内存只是保存 了一个对象的引用名称(严格来讲是对象在堆内存的地址),
23、所以所谓的匿名 对象就是指,只开辟了堆内存空间,而没有栈内存指向的对象。创建匿名对象代码第11行,创建匿名对象,没有被其他对象所引用。如果第11行定义一个有名对象,如:那么调用类中的方法say(),可很自然的写成:面向对象的思想主要是基于抽象数据类型(Abstract Data Type, ADT),在结 构化编程过程中,人们发现把某种数据结构和专用于操纵它的各种操作以某种 模块化方式绑定到一起会非常方便,做到“特定数据对应特定处理方法”,使 用这种方式进行编程时数据结构的接口是固定的。如果对抽象数据类型进一步 抽象,就会发现把这种数据类型的实例当作一个具体的东西、事物、对象,就 可以引发人们
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- Java 面向 对象 设计
1、咨信平台为文档C2C交易模式,即用户上传的文档直接被用户下载,收益归上传人(含作者)所有;本站仅是提供信息存储空间和展示预览,仅对用户上传内容的表现方式做保护处理,对上载内容不做任何修改或编辑。所展示的作品文档包括内容和图片全部来源于网络用户和作者上传投稿,我们不确定上传用户享有完全著作权,根据《信息网络传播权保护条例》,如果侵犯了您的版权、权益或隐私,请联系我们,核实后会尽快下架及时删除,并可随时和客服了解处理情况,尊重保护知识产权我们共同努力。
2、文档的总页数、文档格式和文档大小以系统显示为准(内容中显示的页数不一定正确),网站客服只以系统显示的页数、文件格式、文档大小作为仲裁依据,个别因单元格分列造成显示页码不一将协商解决,平台无法对文档的真实性、完整性、权威性、准确性、专业性及其观点立场做任何保证或承诺,下载前须认真查看,确认无误后再购买,务必慎重购买;若有违法违纪将进行移交司法处理,若涉侵权平台将进行基本处罚并下架。
3、本站所有内容均由用户上传,付费前请自行鉴别,如您付费,意味着您已接受本站规则且自行承担风险,本站不进行额外附加服务,虚拟产品一经售出概不退款(未进行购买下载可退充值款),文档一经付费(服务费)、不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
4、如你看到网页展示的文档有www.zixin.com.cn水印,是因预览和防盗链等技术需要对页面进行转换压缩成图而已,我们并不对上传的文档进行任何编辑或修改,文档下载后都不会有水印标识(原文档上传前个别存留的除外),下载后原文更清晰;试题试卷类文档,如果标题没有明确说明有答案则都视为没有答案,请知晓;PPT和DOC文档可被视为“模板”,允许上传人保留章节、目录结构的情况下删减部份的内容;PDF文档不管是原文档转换或图片扫描而得,本站不作要求视为允许,下载前自行私信或留言给上传者【二***】。
5、本文档所展示的图片、画像、字体、音乐的版权可能需版权方额外授权,请谨慎使用;网站提供的党政主题相关内容(国旗、国徽、党徽--等)目的在于配合国家政策宣传,仅限个人学习分享使用,禁止用于任何广告和商用目的。
6、文档遇到问题,请及时私信或留言给本站上传会员【二***】,需本站解决可联系【 微信客服】、【 QQ客服】,若有其他问题请点击或扫码反馈【 服务填表】;文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“【 版权申诉】”(推荐),意见反馈和侵权处理邮箱:1219186828@qq.com;也可以拔打客服电话:4008-655-100;投诉/维权电话:4009-655-100。