




已阅读5页,还剩151页未读, 继续免费阅读
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
第4章 类与对象 第4章 类与对象 4.1 类与对象的概念 4.2 封装机制 4.3 数据成员 4.4 成员方法 第4章 类与对象 4.1 类与对象的概念 程序设计所面对的问题域客观世界,是由许多事物 构成的,这些事物既可以是有形的(比如一辆汽车),也可以 是无形的(比如一次会议)。在面向对象的程序设计中,客观 世界中的事物映射为对象。对象是面向对象程序设计中用来 描述客观事物的基本单位。客观世界中的许多对象,无论其 属性还是其行为常常有许多共同性,抽象出这些对象的共同 性便可以构成类。所以,类是对象的抽象和归纳,对象是类 的实例。 第4章 类与对象 4.1.1 抽象原则 所谓抽象(abstraction),就是从被研究对象中舍弃个别 的、非本质的,或与研究主旨无关的次要特征,而抽取与研 究工作有关的实质性内容加以考察,形成对所研究问题正确 的、简明扼要的认识。例如,“马”就是一个抽象的概念,实 际上没有任何两匹马是完全相同的,但是我们舍弃了每匹马 个体之间的差异,抽取其共同的、本质性的特征,就形成了 “马”这个概念。 第4章 类与对象 抽象是科学研究中经常使用的一种方法,是形成概念的 必要手段。在计算机软件开发领域,所有编程语言都提供抽 象机制,人们所能够解决的问题的复杂性直接取决于抽象的 层次和质量。编程语言的抽象是指求解问题时是否根据运行 解决方案的计算机结构来描述问题,它是以“机器语言汇 编语言面向过程的语言面向对象的语言”这样的路径发 展的。 随着不同抽象层次的进展,目前主要强调的是过程抽象 和数据抽象。 第4章 类与对象 1. 过程抽象 过程抽象(procedural abstraction)是指任何一个完成确定 功能的操作序列,其使用者都可把它看做一个单一的实体, 尽管这个操作可能是由一系列更低级的操作完成的。 过程抽象隐藏了过程的具体实现。例如,用于求一个正 整数平方的过程可以有下面的不同实现方式。 方式1: int square(int k) return k*k; 第4章 类与对象 方式2: int square(int k) int result=0; for(int i=0; iy?x:y); if(xy) return true; else return(false); 都是合法的,且“return z;”与“return(z);”等价。 第4章 类与对象 4.4.5 形式参数与实际参数 一般来说,可通过如下的格式来引用成员方法: 成员方法名(实参列表) 但在引用时应注意下述问题: (1) 对于无参成员方法来说,是没有实参列表的,但方 法名后的括号不能省略。 (2) 对于带参数的成员方法来说,实参的个数、顺序必 须与形式参数的个数、顺序保持一致,实参的数据类型与形 参的数据类型按照Java类型转换规则匹配,各个实参间用逗 号分隔。实参名与形参名可以相同也可以不同。 第4章 类与对象 (3) 实参可以是表达式,此时要注意使表达式的数据类 型与形参的数据类型按照Java的类型转换规则匹配。 (4) 实参变量(基本数据类型变量)对形参变量的数据传 递是“值传递”,即只能由实参传递给形参,而不能由形参传 递给实参。程序中执行到引用成员方法时,Java把实参值拷 贝到一个临时的存储区(栈)中,形参的任何修改都在栈中进 行,当退出该成员方法时,Java自动清除栈中的内容。 下面我们通过一个程序来说明上述各点。 第4章 类与对象 【示例程序C4_12.java】 实际参数与形式参数的传递 使用1。 public class C4_12 static void add(double x,double y) double z; z=x+y; System.out.println(“z=”+z); x=x+3.2;y=y+1.2; System.out.println(“x=”+x+“ty=”+y); 第4章 类与对象 static double add1(double y1,double y2) double z; z=y1+y2+2.9; return z; public static void main(String args) int a=2,b=7; double f1=2,f2=4,f3; add(a,b);/按Java的类型转换规则达到形参类型 System.out.println(“a=“+a+“tb=“+b); / f3=add1(f1, f2, 3.5); 错,实参与形参的参数个数不一致 f3=2+add1(f1,f2); 第4章 类与对象 System.out.println(“f1=”+f1+“tf2=”+f2+“tf3=”+f3); 该程序的运行结果如下: z=9.0 x=5.2 y=8.2 a=2 b=7 f1=2.0 f2=4.0f3=10.9 第4章 类与对象 【示例程序C4_13.java】 实际参数与形式参数的传 递使用2。 public class C4_13 static void add(double x,double y) double z; z=x+y; System.out.println(“z=”+z); static double add1(double y1,double y2) double z; z=y1+y2+2.9; return z; 第4章 类与对象 public static void main(String args) int a=2; double f1=2,f2=4; add(a,add1(f1,f2); 该程序的运行结果如下: 10.9 第4章 类与对象 4.4.6 成员方法的引用方式 成员方法的引用可有下述几种方式。 1方法语句 成员方法作为一个独立的语句被引用。例如,程序 C4_12.java中的“add(a,b);”语句就是这种形式。 2方法表达式 成员方法作为表达式中的一部分,通过表达式被引用。 例如,程序C4_12.java中的“f3=2+add1(f1,f2);”语句就是这种 形式。 第4章 类与对象 3方法作为参数 一个成员方法作为另一个成员方法的参数被引用。例如,程 序C4_13.java中的“add(a,add1(f1,f2);”语句就是这种形式的代表 。更为典型的是,在递归的成员方法中,一个成员方法作为它自 身的参数被引用。 4通过对象来引用 这里有两重含义,一是通过形如“引用变量名.方法名”的形式 来引用与之关联的对象的方法。二是当一个对象作为成员方法的 参数时,通过把与之关联的引用变量作为参数来引用对象的成员 方法。例如,程序C4_3.java中的“dane.showDog(g,25,25);”语句, 成员方法showDog( )本身通过引用变量dane来引用对象的方法; 同时,通过作为参数的引用变量g引用Graphics类的对象的成员方 法drawString( )。 第4章 类与对象 4.4.7 引用成员方法时应注意的事项 首先,当一个方法引用另一个方法时,这个被引用的方 法必须是已经存在的方法。除了这个要求之外,还要视被引 用的成员方法存在于何处而做不同的处理。 (1) 如果被引用的方法存在于本文件中,而且是本类的 方法,则可直接引用。我们前面列举的例子基本上都是这种 情况。 (2) 如果被引用的方法存在于本文件中,但不是本类的 方法,则要由类的修饰符与方法的修饰符来决定是否能引用 。 第4章 类与对象 (3) 如果被引用的方法不是本文件的方法而是Java类库 的方法,则必须在文件的开头处用import 命令将引用有关库 方法所需要的信息写入本文件中。例如,前几章用来在屏幕 指定位置上显示一个字符串的drawString( ) 方法是Java类库 Graphics类中的一个方法,而Graphics类存放在java.awt包中 ,因此,我们在程序文件的开头处写上了“import java.awt.*;”语句,指出awt包中的方法在本文件中要引用。 (4) 如果被引用的方法是用户在其他的文件中自己定义 的方法,则必须通过加载用户包的方式来引用。这部分内容 将在5.5节“接口与包”中讲述。 第4章 类与对象 4.4.8 成员方法的递归引用 我们前面讲述的程序都以严格的层次方式在一个方法中 调用另一个方法。但是,对于某些实际问题,方法调用自身 会使程序更为简洁清晰,而且会使程序的执行逻辑与数理逻 辑保持一致。例如,数学中对于N! 的定义是: 第4章 类与对象 这个定义是递归的,即在N! = N(N - 1)! 中,(N - 1)! 实 际上是N! 的减1递推。对于这样的问题,我们可以构造循环 来求解,即用1 2 3 (n - 1) n的算式求得结果。但 是,由于它的定义本身是递归的,用递归算法实现则更符合 数理逻辑。例如,求4! 的过程可表示成图4.13所示的形式。 第4章 类与对象 图4.13 求4! 的递归过程 第4章 类与对象 成员方法的递归引用就是指在一个方法中直接或间接引 用自身的情况。例如: 第4章 类与对象 在这个例子中,方法f1( )中引用了f1( )本身,这种引用 是直接引用。 第4章 类与对象 在这个例子中,方法f1( )在引用方法f2( )的过程中,又 引用了方法f1( )本身;同样,方法f2( )在引用方法f1( )的过 程中,又引用了方法f2( )本身,这种引用是间接引用。 第4章 类与对象 【示例程序C4_14.java】 编程计算4! 的值。 public class C4_14 static int fac(int n) int fa; if(n=0) fa=1; else fa=n*fac(n-1); /递归引用自身 return fa; 第4章 类与对象 public static void main(String args) int n=4; int f1=fac(n); /引用fac( )方法 System.out.println(“4!=”+f1); 该程序的运行结果如下: 4!=24 该程序中fac( )方法的递归引用如图4.14所示。 第4章 类与对象 图4.14 计算4! 的成员方法fac的递归引用关系 第4章 类与对象 从图中可以看到,求4! 时,main方法引用fac(4)方法, fac(4)引用fac(3),fac(3)引用fac(2),fac(2)引用fac(1),fac(1) 引用fac(0),fac(0)方法得到确定值1,回归得到fac(1)=1,再 回归得到fac(2)=2,再回归得到fac(3)=6,最后再回归得到 fac(4)=24,fac( )方法共被引用了5次。 第4章 类与对象 【示例程序C4_15.java】 编程求出Fibonacci数列的第 8项。 public class C4_15 public static void main(String args) int n=8; int f8=fibo(n); System.out.println(“f8=”+f8); 第4章 类与对象 static int fibo(int n) if(n=1)return 1; else if(n=2)return 1; else return (fibo(n-1)+fibo(n-2); 该程序的运行结果如下: f8=21 第4章 类与对象 4.4.9 用static修饰的静态方法 用static修饰符修饰的方法被称为静态方法,它是属于 整个类的类方法。不用static修饰符限定的方法,是属于某 个具体类的对象的方法。static方法使用特点如下: (1) static方法是属于整个类的,它在内存中的代码段将 随着类的定义而被分配和装载。而非static的方法是属于某 个对象的方法,当这个对象创建时,在对象的内存中拥有这 个方法的专用代码段。 (2) 引用静态方法时,可以使用与对象关联的引用变量 名作为前缀,也可以使用类名作为前缀。 第4章 类与对象 (3) static方法只能访问static数据成员,不能访问非static 数据成员,但非static方法可以访问static数据成员。 (4) static方法只能访问static方法,不能访问非static方法 ,但非static方法可以访问static方法。 (5) static方法不能被覆盖,也就是说,这个类的子类不 能有相同名及相同参数的方法。 (6) main方法是静态方法。在Java的每个Application程 序中,都必须有且只能有一个main方法,它是Application程 序运行的入口点。 第4章 类与对象 例如: class F int d1; static int d2; void me( ) static void me1( ) static void me2( ) me1( ); /合法引用 d1=34; /错,引用了非static数据成员 me( ); /错,引用了非static方法 d2=45; /合法 第4章 类与对象 class F1 extends F void me1( ) /错,不能覆盖类的方法 第4章 类与对象 4.4.10 数学函数类方法 作为static方法的典型例子, 我们来看看Java类库提供 的实现常用数学函数运算的标准数学函数方法,这些方法都 是static方法。标准数学函数方法在java.lang.Math类中,使 用方法比较简单,其格式如下: 类名.数学函数方法名(实参列表) java.lang.Math类提供的数学函数方法见表4.2。 第4章 类与对象 表4.2 java.lang.Math类提供的数学函数方法 第4章 类与对象 第4章 类与对象 【示例程序C4_16.java】 数学函数类方法的使用。 public class C4_16 public static void main(String args) double a=2,b=3; double z1=Math.pow(a,b); /引用Math类的pow方法求a的b 次方 double z2=Math.sqrt(9); /引用Math类的sqrt方法求9的平 方根 System.out.print(“z1=”+z1); System.out.println(“tz2=”+z2); 该程序的运行结果如下: z1=8.0 z2=3.0 第4章 类与对象 4.4.11 用final修饰的最终方法 在面向对象的程序设计中,子类可以利用重载机制修改 从父类那里继承来的某些数据成员及成员方法。这种方法在 给程序设计带来方便的同时,也给系统的安全带来了威胁。 为此,Java语言提供了final修饰符来保证系统的安全。用 final修饰符修饰的方法称为最终方法,如果类的某个方法被 final修饰符所限定,则该类的子类就不能覆盖父类的方法, 即不能再重新定义与此方法同名的自己的方法,而仅能使用 从父类继承来的方法。可见,使用final修饰方法,就是为了 给方法“上锁”,防止任何继承类修改此方法,以保证程序的 安全性和正确性。 第4章 类与对象 注意:在4.2.3节中我们已经讲过,final修饰符也可用于 修饰类,而当用final修饰符修饰类时,所有包含在final类中 的方法,都将自动成为final方法。 【示例程序C4_17.java】 final修饰方法的使用。 class A1 final int add(int x,int y) /用final修饰符修饰的最终方法 return(x+y); int mul(int a,int b) int
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 留学规划测试题及答案
- 心理咨询师考试中非暴力沟通技巧运用试题及答案
- 鸟类识别测试题及答案
- 过敏专题测试题及答案
- 逐步掌握系统规划与管理师知识点试题及答案
- 系统架构设计师考试行业转型带来的机遇试题及答案
- 理想的饮食方案在公共营养师考试中的体现试题及答案
- 春季感冒考试题及答案
- 送分测试题及答案
- 雄安农行面试题及答案
- 油气管道高后果区管段识别分级表
- 班前安全活动记录(真石漆班组)
- 县级城投公司人事管理制度
- 脚手架稳定计算
- 无损检测超声波检测课件
- 生产中断影响及生产组织管理考核办法
- 【图文】GB8624-2012建筑材料及制品燃烧性能分级(精)
- (完整版)【昆明】重庆机场鸟害防治材料课件
- 企业部门单位工伤事故报告书
- ZL40轮式装载机工作装置设计(全套图纸)
- 人教版中考英语高频词汇汇总
评论
0/150
提交评论