05 面向对象技术(一).ppt_第1页
05 面向对象技术(一).ppt_第2页
05 面向对象技术(一).ppt_第3页
05 面向对象技术(一).ppt_第4页
05 面向对象技术(一).ppt_第5页
已阅读5页,还剩26页未读 继续免费阅读

下载本文档

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

文档简介

1、第五讲 面向对象技术(一),Java程序设计基础,主要内容:,类的定义和使用 构造方法和默认的构造方法 变量和方法 访问控制 方法的返回类型,面向对象的程序设计/概述,面向对象的程序设计思想,是将我们要处理的事物抽象成为具有状态和行为的对象来处理 具有共同属性的一组对象,在面向对象的程序设计语言中,可以用一个“模版”或者“基本原型”来描述,这就是类/class 在面向对象的程序设计中,类是我们对客观世界的事物进行抽象思维活动后得到的“抽象数据类型”,而对象则是类的实例 对象的状态用成员变量来表述,行为用成员方法来表述 面向对象的程序设计主要围绕以下几个主要概念 抽象、封装、继承、多态。,面向对

2、象的程序设计/抽象,现实世界中的事物,/Java中的类 public class Bicycles public float move(int rps) float distance; return distance; public int getWheelSize() return wheelSize; public void setWheelSize(int ws) wheelSize = ws; private int wheelSize; private String remark; ,面向对象的程序设计/类与对象,Java中的抽象数据类型(class)/Bicycles,Bicycl

3、es myBicycle = new Bicycles();,Bicycles hisBicycle = new Bicycles();,Bicycles yourBicycle = new Bicycles();,Java中的对象(object)是class的实例(instance),状态不同,指得是它们的成员变量具有不同的值,每个instance都具有,且仅仅具有在class中定义的变量和方法,面向对象的程序设计/类与对象,由于Java中,关于某个类的一个对象就是这个类的一个实例,所以object和instance这两个词常常说的是同一件事 Java中,由某一个class(类)产生的ins

4、tances(对象/objects),一定具有完全相同的属性的行为 这些对象的不同,是由它们的状态,也就是属性的值来决定的,面向对象的程序设计/类与对象,Java中,object之间的交互,可以通过消息映射和相互调用来实现,class A public void theMethod(A a) class B public void theMethod(A a) ,这种机制在事件处理时被广泛使用,一个消息包括三部分内容 1 消息接收者 2 接收者处理该消息的方法 3 上述方法需要的参数,还可以迭加使用abstract或final,面向对象的程序设计/类的定义,public或者没有,修饰符 cla

5、ss 类名 extends 父类名 implements 接口名 ,interface, /声明成员变量 /声明成员方法 ,有少数class只定义其中一种,有一些class会定义static成员,类的研究(1)/定义,对一个Java应用程序来说,main方法是必须的,但并不是在每个类中都需要它 定义一个只包含数据的类是不多见的,往往还要定义操作这些数据的方法,这样就可以把类中数据的特定布局结构隐藏起来,class Box double width; double height; double depth; ,一个简单的类,定义一个类,实际上就是定义了一种新的数据类型 这个例子里,新的数据类型叫

6、Box,类的研究(2)/使用Box,myVol is 3000.0 hisVol is 162.0,class Box double width;double height;double depth; class BoxDemo public static void main(String s) Box myBox = new Box(); Box hisBox = new Box(); double myVol, hisVol; myBox.width=10; myBox.height=20; myBox.depth=15; hisBox.width=3; hisBox.height=6;

7、hisBox.depth=9; myVol=myBox.width*myBox.height*myBox.depth; hisVol=hisBox.width*hisBox.height*hisBox.depth; System.out.println(“myVol is ” + myVol); System.out.println(“hisVol is ” + hisVol); ,用.运算符操作对象的成员,用new来创建类的对象,不同对象的成员变量是相互独立的,接收者的数据类型与返回类型相兼容,Box这个class应该有计算自己体积的能力,返回数据的类型与方法指定的类型相兼容,类的研究(3)

8、/向类中添加方法,myVol is 3000.0 hisVol is 162.0,用不用.运算符,class Box double width;double height;double depth; double volume()return width*height*depth; class BoxDemo2 public static void main(String s) Box myBox = new Box(); Box hisBox = new Box(); double myVol, hisVol; myBox.width=10; myBox.height=20; myBox.d

9、epth=15; hisBox.width=3; hisBox.height=6; hisBox.depth=9; myVol = myBox.volume(); hisVol = hisBox.volume(); System.out.println(“myVol is ” + myVol); System.out.println(“hisVol is ” + hisVol); ,类的研究(4)/Box的不足,上述观点使我们想到,设置Box尺寸的更好途径是创建一个有输入参数的方法,在方法体中适当合理的去设置Box的各个尺寸 例如: public void setDim(double w, d

10、ouble h, double d) ;,在Box类的定义以及后来的应用中,我们看到两点不足 值的设定很麻烦且容易出错(比如漏设了一项) 在好的Java程序设计中,实例变量应该由在该类中定义的方法来存取,在以后的改进中,你可以方便地改变一个方法的行为,但却不能改变一个变量的行为,为提高程序执行效率,去掉了xxVol的声明和赋值语句,Box可以用setDim方法设置成员变量,类的研究(5)/改进的Box class及应用,myVol is 3000.0 hisVol is 162.0,class Box double width;double height;double depth; doubl

11、e volume()return width*height*depth; void setDim(double w, double h, double d) width = w; height = h; depth = d; class BoxDemo3 public static void main(String s) Box myBox = new Box(); Box hisBox = new Box(); / double myVol, hisVol; myBox.setDim(10,20,15); hisBox.setDim(3,6,9); / myVol =myBox.volume

12、(); hisVol = hisBox.volume(); System.out.println(“myVol is ” + myBox.volume(); System.out.println(“hisVol is ” + hisBox.volume(); ,面向对象的程序设计/变量与方法,在class中定义的变量分为类变量和实例变量,方法分为类方法和实例方法 类变量和类方法: 由该类产生的所有 实例所共享 实例变量和方法: 每一个实例拥有一份 独立拷贝,因此每个实 例对象的数据是独立且唯一的,属于类的变量和方法是由关键字static决定的,class X int k; static int

13、 sk class A X x1,x2;,从发生调用处开始,控制转到方法体,方法执行结束或遇到return语句时,控制返回到发生调用处,补充(1)/方法的调用,class Box double width;double height;double depth; double volume()return width*height*depth; void setDim(double w, double h, double d) width = w; height = h; depth = d; class methodCallDemo public static void main(String

14、 s) Box theBox = new Box(); double theVol; theBox.setDim(10,20,15); theVol = theBox.volume(); System.out.println(“Box的体积是” + theVol); System.out.println(“Box的体积是 ” + theBox.volume(); ,只要将方法的名字写出来,并且给出正确的输入参数,就发生了方法调用,只要将方法的名字写出来,并且给出正确的输入参数,就发生了方法调用,补充(2)/为什么要创建对象?,在写程序时,是否要创建对象,要创建哪个类/class的对象,是根据处

15、理问题的需要来决定的 创建一个类/class的对象就是为了能够使用在这个类里已经预定义好了的成员变量和成员方法 例如 我们在程序中要处理一个字符串,我们就会想到可能需要创建String这个类的对象,或者需要创建StringBuffer这个类的对象 而如果我们正在去处理一个有关盒子体积大小的问题,那也许我们就应该要创建一个Box class的对象了,可以直接用,不要我们再去写! 所有这些在Java里预定义的类,构成了Java处理问题的强大功能!,补充(3)/创建对象时发生了什么?,以StringBuffer class为例 如果我们在一段程序中使用了下列语句之一 系统就会为我们创建一个Strin

16、gBuffer的对象 StringBuffer sb = new StringBuffer(); StringBuffer sb = new StringBuffer(32); StringBuffer sb = new StringBuffer(“明月几时有,把酒问青天”);,对象名sb可以是任何合法的Java标识符,系统会去申请一块32位的内存给变量sb用 系统再去申请一块内存给这个对象用,其大小要能够放得下StringBuffer的所有40个成员方法和3个构造方法,再加上一块用于管理的空间和备用空间 将给对象用的这块内存的首地址放到sb中 将所有类成员的实体依次拷贝到给对象用的这块内存中

17、 初始化这个新对象sb,如果使用第三个构造方法,就用“明月几时有,把酒问青天”来初始化sb,系统怎样为我们创建这个对象呢?,sb的内容成为“明月几时有”,sb的内容不变,s被赋值“把酒问青天”,补充(4)/创建对象后我们能做什么?,如果我们创建了一个StringBuffer的对象sb StringBuffer sb = new StringBuffer(“明月几时有,把酒问青天”); 我们能用这个对象做什么呢?,我们就可以使用这个对象所具有的方法和属性了,在这个例子里就是可以用sb里包含的方法来处理字符串“明月几时有,把酒问青天”了,例如我们可以这样做: String s = sb.subst

18、ring(6); 我们也可以这样做: sb.delete(5,11);,可以不要取子串方法前面的赋值部分,而只写成 sb.substring(6); 吗? 语法有错误吗?结果是什么?,补充(5)/我们不能做什么?,假设我们创建了一个StringBuffer的对象sb StringBuffer sb=new StringBuffer(“明月几时有,把酒问青天”);,这个对象里没有的方法和属性,我们不能用!,比如我们不可以这样做: String s = sb.StringBuffer();,这是因为两个类里都有charAt(int index)方法,StringBuffer这个类里没有这样定义的方

19、法,不能把在其它类中定义的方法和属性,拿给这个类的对象用!,我们也不可以这样做: String s = “明月几时有”;s.append(“,把酒问青天”);,append是StringBuffer类的方法,而不是String这个类的方法,我们不能!,也许有人说String有个charAt(int index),在StringBuffer的对象里也照样用: char c = s.charAt(1); 也可以 char c = sb.charAt(1);,Box sb1 = new Box(); Box sb2 = new Box();,仅复制对象的引用,并不复制对象的实体,补充(6)/对象与它

20、的引用,当我们创建一个对象时,如前所述,它由两部分组成 对象的实体 对象的引用 以Box类为例,这是它的一个对象在内存中的映像,执行指令:Box sb2 = sb1;,面向对象的程序设计/构造方法(1),什么是构造方法 构造方法(constructor)是一类特殊的方法,从功能上讲,它是用来对新创建的对象进行初始化的,从形式上来讲,它有以下特点 它与类同名 它没有任何返回值 除了上述两点外,在语法结构上与一般的方法相同,class A A() /初始化代码 /其它代码 ,Java要求程序中每个变量在使用前都要先初始化,包括新创建的对象 在我们使用new关键字来创建一个类的对象时,类的一个构造方

21、法会自动被调用,来完成初始化这个新对象的任务。,面向对象的程序设计/构造方法(2),从一个例子来看构造方法 我们重写Box class使它带有自己的构造方法 class Box Box() width=10; height = 10; depth = 10; System.out.println(“Box的构造方法被调用了!”); double volume() return width*height*depth; double width; double height; double depth; ,这一句是为了让我们能看到构造方法被调用的事实,除此以外没有任何意义。实际上,构造方法里是不会

22、有与输入/输出有关的代码的,两次创建Box的对象,所以构造方法被调用了两次,面向对象的程序设计/构造方法(3),使用带有自己的构造方法的Box class class BoxConstructorDemo public static void main(String s) Box myBox = new Box(); Box hisBox = new Box(); myVol =myBox.volume(); hisVol = hisBox.volume(); System.out.println(“myVol is ” + myVol); System.out.println(“hisVol

23、 is ” + hisVol); ,Box的构造方法被调用了! Box的构造方法被调用了! myVol is 1000.0 hisVol is 1000.0,因为值是在构造方法里设定的,所以得到相同的结果,在Java里,如果一个类没有明显的表明哪一个类是它的父类,Object类就是它的父类,面向对象的程序设计/构造方法(4),现在我们知道了为什么创建一个对象时,总是写: StringBuffer sb = new StringBuffer(); Box b = new Box(); 原来new在调用类的构造方法,如果Java在一个类里找不到构造方法,它就为这个类添写一个默认构造方法,假设类名是

24、X class X X()super(); ,哎,这个类没有父类呀,调父类的那个没有参数的构造方法,面向对象的程序设计/构造方法(1),什么是构造方法 构造方法(constructor)是一类特殊的方法,从功能上讲,它是用来对新创建的对象进行初始化的,从形式上来讲,它有以下特点 它与类同名 它没有任何返回值 除了上述两点外,在语法结构上与一般的方法相同,class A A() /初始化代码 /其它代码 ,Java要求程序中每个变量在使用前都要先初始化,包括新创建的对象 在我们使用new关键字来创建一个类的对象时,类的一个构造方法会自动被调用,来完成初始化这个新对象的任务。,面向对象的程序设计/

25、构造方法(2),从一个例子来看构造方法 我们重写Box class使它带有自己的构造方法 class Box Box() width=10; height = 10; depth = 10; System.out.println(“Box的构造方法被调用了!”); double volume() return width*height*depth; double width; double height; double depth; ,这一句是为了让我们能看到构造方法被调用的事实,除此以外没有任何意义。实际上,构造方法里是不会有与输入/输出有关的代码的,两次创建Box的对象,所以构造方法被调用

26、了两次,面向对象的程序设计/构造方法(3),使用带有自己的构造方法的Box class class BoxConstructorDemo public static void main(String s) Box myBox = new Box(); Box hisBox = new Box(); myVol =myBox.volume(); hisVol = hisBox.volume(); System.out.println(“myVol is ” + myVol); System.out.println(“hisVol is ” + hisVol); ,Box的构造方法被调用了! Bo

27、x的构造方法被调用了! myVol is 1000.0 hisVol is 1000.0,因为值是在构造方法里设定的,所以得到相同的结果,在Java里,如果一个类没有明显的表明哪一个类是它的父类,Object类就是它的父类,面向对象的程序设计/构造方法(4),现在我们知道了为什么创建一个对象时,总是写: StringBuffer sb = new StringBuffer(); Box b = new Box(); 原来new在调用类的构造方法,如果Java在一个类里找不到构造方法,它就为这个类添写一个默认构造方法,假设类名是X class X X()super(); ,哎,这个类没有父类呀,调父类的那个没有参数的构造方法,面向对象的程序设计/构造方法(5),前面一个Box类有个构造方法Box(),好象不是太有用,因为它会把所有Box的尺寸

温馨提示

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

评论

0/150

提交评论