面向对象程序设计3.ppt_第1页
面向对象程序设计3.ppt_第2页
面向对象程序设计3.ppt_第3页
面向对象程序设计3.ppt_第4页
面向对象程序设计3.ppt_第5页
已阅读5页,还剩58页未读 继续免费阅读

下载本文档

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

文档简介

第4章 面向对象程序设计 主要任务: 理解面向对象编程的基本概念 了解类的封装方法 如何创建类和对象 了解成员变量和成员方法的特性 学习使用OOP方式进行程序设计 本章主要内容 l1.创建体现OOP风格的Java的类与对象 l2.成员变量 l 3.成员方法 4.1 创建体现OOP风格的Java类与对象 l4.1.1 具有OOP风格的Java程序 l4.1.2 创建Java类 l4.1.3 创建Java对象 4.1.1 具有OOP风格的Java程序 lJava是完全面向对象编程语言。面向 对象编程(OOP)是一种全新的编程 理念。 l什么是对象?类又是什么?它们之间有 什么关系?对象是如何通过消息和外部 通讯的? l下面的内容就讨论这些问题。 4.1.2 创建Java类 l 类通过关键字class来创建,下面的声明语句 格式给出了可能出现的符号和顺序: public abstract final extends 父类 implements 接口 其中, 表示为可选项,表示为必选项。 关键字含义说明如下: 1class 类名 lclass关键字告诉编译器这是一个类, 类名是可以自由选取但必须是合法的标 识符。 l在声明类的语句中,class前面的关键 字称为类的修饰符。 2访问限制修饰词 l (1)public(公共的) 带有public修饰符的类,称为公共类,是访问限制最宽的修 饰词,公共类可以被任何包中的类使用。 注意:在同一个源程序文件中只能有一个public类。 l (2)private(私有的) 带有private修饰符的类,称为私有类,是访问限制最窄的 修饰词,只能被该类的对象访问,其子类不能访问,更不能跨 包访问。 l (3)protect(保护的) 带有protect修饰符的类,称为保护类,能被该类的对象与 子类访问,即使子类在不同包中也可以。 l (4)default(默认的) 带有default修饰符的类,称为默认类,与没有任何修饰符 相同,默认情况下,类只能被同一个包中的其他类访问。 3Abstract(抽象的) l有时,定义的类代表了一个抽象的概念 ,就不能用它来实例化一个对象。 l同样在OOP中,可能建立了一个不需 要产生对象的类。例如,java.lang包 中的Number类代表了数这个抽象概念 ,可以用它在程序中产生一个数的子类 ,如Interger或Float,但从Number中 直接生成对象是没有意义的。 labstract说明的类称为抽象类,不能用 它实例化一个对象,它只能被继承。 4final(最终的) lfinal说明的类称为最终类。一个最终类 不可能有子类,也就是说它不能被继承 。 l黑客常用的一个攻击技术是设计一个子 类,然后用它替换原来的父类。子类和 父类很相象,但做的事情却大不一样。 5Extends(继承)父类名 lextends告诉编译器创建的类是从父类 继承下来的子类,父类必须是Java系 统类或已经定义的类。 l从父类继承,可以提高代码的重用性, 不必从头开始设计程序。大部分情况下 应该利用继承的手段编程,只在没有合 适的类可以继承时才自己设计类。 6Implements(实现)接口名 limplements告诉编译器类实现的接口 ,接口必须有定义,一般为系统类。 l接口是消息传递的通道,通过接口,消 息才能传递到处理方法中进行处理。 implements说明你的类可以实现的一 个或多个接口,如果有多个接口,要用 逗号分隔。 例4.1 下面这个Applet程序将在页面上输出两个 矩形,并伴有文字输出。见图: 程序代码: import java.awt.*; import java.applet.Applet; public class Class1 extends Applet private int x, y, width, height; public void init() width=60; height=60; public void setPosition(int xPos, int yPos) x=xPos; y=yPos; public void paint(Graphics g) setPosition(20,20); g.drawRect(x, y, width, height); g.drawString(“矩形 1 的 X 位置: “+x, 20,100); g.drawString(“矩形 1 的 Y 位置: “+y, 20,120); setPosition(170,20); g.drawRect(x, y, width, height); g.drawString(“矩形 2 的 X 位置: “+x, 170,100); g.drawString(“矩形 2 的 Y 位置: “+y, 170,120); 4.1.3 创建Java对象 l 类是对象的产品模板。在现实世界里,我们 使用的是产品而不是产品的图纸。同样道理 ,Java运行的应该是用类创建的实例化对象 。 l 一个典型的Java程序会创建很多对象,它们 通过消息传递进行相互交流,共同完成程序 的功能。一旦任务完成,对象就会被垃圾收 集器收回,完成它从创建、使用到清除的生 命三步曲。 l 下面介绍对象的创建过程。先看一个例子。 例4.2 下面这个程序是改写后的例4.1。 import java.awt.*; import java.applet.Applet; public class Class2 extends Applet MyBox b1=new MyBox(); MyBox b2=new MyBox(170,20,60,60); public void paint(Graphics g) b1.setPosition(20,20); b1.setSize(60,60); b1.draw(g); g.drawString(“矩形 1 的 X 位置: “+b1.getX(), 20, 100); g.drawString(“矩形 1 的 Y 位置: “+b1.getY(), 20, 120); b2.draw(g); g.drawString(“矩形 2 的 X 位置: “+b2.getX(), b2.getX(), b2.getY()+80); g.drawString(“矩形 2 的 Y 位置: “+b2.getY(), b2.getX(), b2.getY()+100); 程序代码: class MyBox private int x, y, width, height; MyBox() x=0; y=0; width=0; height=0; MyBox(int xPos, int yPos, int w, int h) x=xPos; y=yPos; width=w; height=h; public void setPosition (int xPos, int yPos) x=xPos; y=yPos; public void setSize (int w, int h) width=w; height=h; public int getX() return x; public int getY() return y; public void draw(Graphics g) g.drawRect(x, y, width, height); 下面给出创建对象和使用对象的方法说明 l1创建对象与构造方法 首先必须拥有一个合适的类才能创建一 个合适的对象,有了合适的对象才能完 成合适的工作。下面的三条语句分别创 建了三个对象: Lable label1=new Label(“标签“); TextField field1=new TextField(10); MyBox b1=new MyBox(20,20,100,100); 创建对象语句 l创建对象语句有三个组成部分:声明对 象、实例化、初始化。 格式为: =new ( 参数列表) 创建对象 l 创建对象相当于定义一个变量,既可采用上 述方法,也可以把上述步骤分开进行,先声 明对象,再实例化对象,进行初始化。 (1)声明对象 如:MyBox b2 (2)实例化和初始化 = new (参数列表) 如,MyBox b2=new MyBox(20,20,100,100); 2对象初始化的说明 l(1)系统如何对变量初始化 变量声明后没有赋值,在使用变量时 会出现错误。当用new创建了一个对象 时,系统会为对象中的变量进行初始化 。 l(2)构造方法的作用与构成 new操作符为对象分配内存后将调用类 的构造方法确定对象的初始状态,初始 化所有变量。也就是说,对象的初始化 任务要靠构造方法来完成。 例4.3中定义的两个构造方法: MyBox() x=0; y=0; width=0; height=0; MyBox(int xPos, int yPos, int Width, int Height) x=xPos; y=yPos; width=Width; height=Height; 构造方法比较 l第一个是缺省的构造方法MyBox(),没 有任何参数,它把MyBox类的4个成员 变量赋值为0。 l第二个构造方法MyBox(int, int, int, int) 有4个参数,创建对象时可以传递4 个参数给MyBox类赋初值。 lMyBox() 和MyBox(int, int, int, int) 同 为类MyBox的构造方法,方法名相同 而参数不同,这是类的多态性的体现。 3对象的使用 l创建对象时,一个对象的所有变量和方 法代码(包含对象的类的变量和方法) 都被读到专为它开辟的内存区域中。为 了让解释器知道代码的内存地址,使用 对象的任何成员时都要加上引用。即在 变量和方法的前面加上对象名,并用圆 点分隔。格式为: . . 4清除对象 l使用new操作符创建对象后,Java虚 拟机自动为该对象分配内存并保持跟踪 。Java虚拟机对不再被引用的对象释 放其占用的内存。这种定期寻找不再使 用的对象并自动释放对象占用内存的过 程称为垃圾收集。 lJava虚拟机实际上是利用变量生存期 来管理内存的,对象的引用被保存在变 量中,当程序跳出变量所在的区域后, 它就会被自动清除。 OOP的基本思想 lOOP的基本思想:抽象、封装、继承 等。 l封装是抽象的具体实现。封装就是用操 作方法把数据封闭到类中,形成以数据 为核心,以方法为外壳的类。封装能保 护类的数据免受外界的更改。封装的结 果是形成了独立的和完整的程序模块。 4.2 成员变量 l成员变量描述了类和对象的状态,有时 也称为属性、数据、域(field)。 l对成员变量的操作实际上就是改变类和 对象的状态,使之能满足程序的需要。 与类相似,成员变量也有很多修饰符, 用来控制对成员变量的访问,实现对类 和对象的封装。 4.2.1成员变量的声明 l 例4.4 显示当前日期和时间,运行结果见图 : import java.awt.Graphics; import java.applet.Applet; import java.util.Calendar; class Time private Calendar t; private int y, m, d, hh, mm, ss; 程序代码: Time () t=Calendar.getInstance(); y=t.get(t.YEAR); m=t.get(t.MONTH)+1; d=t.get(t.DATE); hh=t.get(t.HOUR_OF_DAY); mm=t.get(t.MINUTE); ss=t.get(t.SECOND); public String getDate() return y+“ 年“+m+“月“+d+“日“; public String getTime() String s=hh+“ 时“+mm+“分“+ss+“ 秒“; return s; public class ShowTime extends Applet Time t=new Time(); public void paint(Graphics g) g.drawString(“当前日期: “+t.getDate(),50,40); g.drawString(“当前时间: “+t.getTime(),50,80); 4.2.2 具有不同访问权限的成员变量 l成员变量的声明语句有如下格式: public private protected package / 访问控制修饰符 static final transient volatile 1访问控制权限 l(1)public 公共变量 由public修饰的变量称为公共变量,只有在确认 任何外部访问都不会带来不良后果的情况下才将 成员声明为公共的。公共变量没有秘密可言,不 具有数据保护功能。 l(2)private私有变量 由private修饰的变量称为私有变量,只能被声 明它的类所使用,拒绝任何外部类的访问。私有 变量是不公开的是对类进行封装时使用的主要方 法。 l(3)protected 受保护变量 由protected修饰的变量称为受保护变量,可被 声明它的类和派生的子类以及同一个包中的类访 问。 l(4)package包变量 由package修饰的变量称为包变量,在声明时 常常省略package关键字。包成员可被声明它的 类和同一个包中的其它类(包括派生子类)所访 问,在其它包中的子类则不能访问父类的包成员 。 4.2.3 静态变量和实例变量 lstatic声明的成员变量被视为类的成员 变量,而不把它当作实例对象的成员变 量。换句话说,静态变量是类固有的, 可以直接引用,其它成员变量仅仅被声 明,生成实例对象后才存在,才可以被 引用。基于这样的事实,也把静态变量 称为类变量,非静态变量称为实例变量 。相应地,静态方法称为类方法,非静 态方法称为实例方法。 从输出结果中可以得出以下几点结论 : l 类的静态变量可以直接引用,例如在程序中 直接使用了StaticDemo.getX(),而非静态 变量则不行。类的静态变量相当于某些程序 语言的全局变量。 l 静态方法只能使用静态变量,不能使用实例 变量。 l 类的静态变量只有一个版本,所有实例对象 引用的都是同一个版本。 l 对象实例化后,每个实例变量都被制作了一 个副本,它们之间互不影响。 归纳分析: l(1)static静态变量与实例变量 static声明的成员变量称为静态变 量或类变量。静态变量可以直接引用, 其它成员变量仅仅在生成实例对象后才 可以被引用。所以称为实例变量。相应 地,静态方法称为类方法,非静态方法 称为实例方法。静态方法只能使用静态 变量,不能使用实例变量。 l(2)final 最终变量 一旦成员变量添加了final修饰符, 在程序运行中变量将不能被改变。这样 的成员变量就是一个常量。例如: final double PI=3.14159; 该语句声明一个常量PI,如果在后 面试图重新对它赋值,将产生编译错误 。另外,常量名一般用大写字母。常量 和直接量一样不占用内存空间。 l(3)transient 过渡变量 Java语言目前对transient修饰符没有明 确说明,它一般用在对象序列化(object serialization)上,说明成员变量不许被序 列化。 l(4)volatile 易失变量 volatile声明的成员变量为易失变量,用 来防止编译器对该成员变量进行某种优化。 这是Java语言的高级特性,仅被少数程序员 使用。 4.3 成员方法 l对象的行为由类的方法实现,其它对象 可以调用一个对象的方法,通过消息的 传递实现对该对象行为的控制。 l下面讨论如何通过方法影响对象的行为 。 4.4.1 成员方法的设计 l类的设计集中体现在成员方法的设计上 。良好的设计可以使类更加强壮,功能 更加完善。成员方法的设计应该从类的 整体行为出发,能正确响应外部消息, 自然地改变对象的状态,并符合相对独 立性、结构清晰、可重用性强等编程要 求。 l来看下面的例子: 例4.5 方法对对象行为的影响,运行结果见图 : import java.awt.*; import java.applet.Applet; class DrawShape private int x, y, shape; public void setPos(int xPos, int yPos) x=xPos; y=yPos; 程序代码: public void setShape(int choice) shape=choice; public void draw(Graphics g) if (shape =1) g.drawRect(x, y, 60, 60); else if (shape =2) g.drawOval(x, y, 60, 60); else g.drawString(“形状参数不对!“, 20, 120); public class M1 extends Applet final int BOX=1, OVAL=2; DrawShape a=new DrawShape(); public void paint(Graphics g) a.setPos(40,20); a.setShape(BOX); a.draw(g); a.setPos(200,60); a.setShape(OVAL); a.draw(g); 4.3.2 成员方法的声明与修饰 l 成员方法相当于其它语言的函数或过程,是 命令语句的集合。成员方法的声明一般放在 成员变量的声明之后,声明语句的格式和顺 序如下: public private protected package / 访问控制修饰符 static final abstract native synchronized 返回值类型 方法名(参数表)throws 异常 类型 不同含义的修饰符 : 1final 最终方法 l方法被声明为最终方法后,将不能被子 类覆盖,即最终方法能被子类继承和使 用但不能在子类中修改或重新定义它。 这种修饰可以保护一些重要的方法不被 修改。 l在OOP中,子类可以把父类的方法重 新定义,使之具有新功能但又和父类的 方法同名、同参数、同返回值,这种情 况称为方法覆盖(override)。 2abstract 抽象方法 l一个抽象类可以含有抽象方法。所谓抽 象方法是指不能实现的方法,因为它没 有方法体,所以抽象方法不能出现在非 抽象类中。 l一个抽象类可以定义一个统一的编程接 口,使其子类表现出共同的状态和行为 ,但各自的细节是不同的。子类共有的 行为由抽象类中的抽象方法来约束,而 子类行为的具体细节则通过抽象方法的 覆盖来实现。 3native 本地方法 l用其它语言编写的方法在Java中称为本地 方法。 lSDK提供了Java本地接口JNI(Java Native Interface),使得Java虚拟机能 运行嵌入在Java程序中的其它语言的代码 。 l嵌入外部语言代码的出发点:Java系统包 不提供对平台依赖性程序的支持时;想利 用现有的其它语言资源时;出于运行速度 的要求而使用其它语言开发的运行模块。 4synchronized 同步方法 l 同步方法用于多线程编程。为避免数据的不 一致性,应将方法声明为同步方法,对数据 进行加锁,以保证线程的安全。 5 void返回值类型 Java要求一个方法必须声明它的返 回值类型。如果方法没有返回值就用关 键字void作为返回值类型,否则应使用 基本数据类型或对象类型说明返回值类 型 1.方法名 l 方法名可以是任何有效的Java标识符。方法 名可以和成员变量同名,也可以和成员方法 同名。同一个类中的方法同名现象在OOP中 称为方法重载(overload),重载可以减轻 程序员的负担。 2参数表 l 方法的调用者正是通过参数表将外部消息传 递给方法加以处理的。在参数表中要声明参 数的类型,并用逗号分隔多个参数。 方法的其他内容 : 5throws 异常类型 l 程序在运行时可能发生异常现象。每一个异 常都对应着一个异常类。在前面介绍的例中 就使用过抛出异常throws IOException(输 入/输出异常)。 6.方法体 l 方法体包含在一对大括号中,即使方法体中 没有语句,一对大括号也是必不可少的。使 用各种语句结构组成方法主体,实现程序的 功能,是设计方法体的目的。 4.3.3 通过方法的参数传递不同 信息 l一个对象和外部交换信息主要靠方法的 参数来传递。如果允许的话,外部对象 也可以直接存取一个对象的成员变量。 大部分还是通过参数来传递。在Java 中,可传递的参数包括任何数据类型, 前面已经使用了基本数据类型的参数传 递、数组的传递和对象的传递。 l在其它语言中,函数调用或过程调用有 传值调用和传地址调用之分。 例4.6 参数传递示例1 class P1 public static void main(String args) int x=10, y=10

温馨提示

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

评论

0/150

提交评论