版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、第五章 类的定义教学内容什么是类5.1定义类5.2方法的定义5.3 构造函数5.4类的定义和使用5.5 方法重载5.6对象的使用5.7教学内容递归理解包5.9控制对类成员的访问5.10 嵌套类5.11finalize( )方法5.12本地方法5.13教学重点了解面向对象思想,掌握对象和类的基本概念、明确Java中的类的定义方法、构造方法、方法重载和this的使用。 掌握对象的使用方法,明确封装的作用与方法。 了解继承的基本概念,明确方法重写的作用,要注意与重载的区别,掌握super关键字的使用、继承中的构造方法调用;了解Finalizer。 掌握多态性的基本概念、明确多态实现的条件,熟练掌握多
2、态性的代码实现 类的定义:类是一类对象的抽象或原形,它定义了该类对象的共同的状态和方法。用户可以使用类的定义来生成该类的对象,生成的对象将可以使用该类的所以组件。类中包含两种内容:(1)成员(field)域:是存储数据项的变量。成员域也称类的数据成员(data member)。(2)方法(method):定义了用户可以进行的操作,也决定了利用类的对象可以做的事情。5.1 什么是类例1. 定义了一个名为SimplePoint 的类public class SimplePoint public int x = 0; /x为成员变量 public int y = 0; /y为成员变量 5.1 什么是
3、类5.1 什么是类当创建一个新的对象时(对该类实例化), 就会为该对象及其成员分配空间,同时对成员变量进行初始化。例2 定义一个名为SimpleRectangle类public class SimpleRectangle public int width = 0;public int height = 0;public SimplePoint origin = new SimplePoint();5.1 什么是类5.1 什么是类5.1 什么是类例3 public class Point public int x = 0; public int y = 0; / a constructor! p
4、ublic Point(int x, int y) this.x = x; this.y = y; new Point(44, 78)类变量(class variable):也称为静态成员变量(static field)。在声明时使用关键字static。只与类有关,被该类的所有对象共享。未创建该类的对象时,这些变量仍然存在。实例变量(instance varible):也称为非静态成员变量(non-static field)。该类型变量与类的每个实例有关。该类的每个实例都有他自己的变量的副本和赋值。5.1.1 类定义中的变量类Sphere的定义public class Sphere /clas
5、s variablestatic double PI=3.14;/instance variabledouble xCenter;double yCenter;double zCenter;double radius;由所有对象共享globexCenteryCenterzCenterradiusballxCenteryCenterzCenterradius方法的定义:提供了使用类定义中指定的变量进行的操作。方法的分类:实例方法(instance method):只可以在特定的对象中执行。类方法(class method):使用static进行声明,即使该类没有对象存在也可以执行。注意:类方法不
6、能引用实例变量。5.1.2 类定义中的方法访问静态成员或静态方法:类名.成员名类名.方法名例如: double rootPi = Math.sqrt ( Math. PI );实例变量和实例方法只能通过对象的引用来调用,因为在定义中已经和一个特定的对象相关。例如:若有对象ball存在,则: double ballVolume = ball.volume();5.1.3 变量和方法的访问定义类:class 类名类的详细定义; 5.2 定义类例如: class Sphere static final double PI=3.14; static int count=0; double radius
7、; double xCenter; double yCenter; double zCenter; 方法概念:是一个自包含的代码块有自己的名称及可以重复使用的属性可以根据需要在程序多个不同的地方被执行可以使用其名字来调用方法方法可以指定返回值的类型,若没有返回值,则应声明方法的返回对象类型为void5.3 方法的定义方法的基本结构如下:return_type methodName(arg1,arg2,argn)statement;方法的形式参数出现在方法名后的大括号中,指定了在方法调用时需要向其传递的信息。当用户调用方法时提供给形参的值称为实参。注意:方法也可以没有参数。5.3 方法的定义有返
8、回值:return return_value;无返回值:return 或 不写注意:如果方法有返回值,则返回值的类型要与声明方法时定义的返回值类型保持一致。5.3.1 由方法返回形参:定义了当调用该方法时传递给该方法的类型及其值,包括参数类型和参数名,并出现在方法定义的形参列表中。实参:定义了执行方法时传递给形参的值,而且实参的值通过执行该方法时的形参名来引用。注意: (1)实参值的类型一定要和定义方法时对应的形参类型保持一致。 (2)对于非类对象的数据,实参到形参的数据采用值传递的方法。5.3.2 形式参数表示例程序: VariableDemofinal形参意义:如果将方法中的形参声明为fi
9、nal,可以防止再调用该方法时,实参的值被修改。说明:final形参对于值传递的方式没有意义,而对于引用类对象的形参有意义,这样做可以防止对实参对象的误操作。5.3.2 形式参数表定义类方法:在定义的方法前面加关键字static。例:class Spherestatic int getCount() return count;注意:这样的方法不能直接引用任何实例变量。因为不存在任何类对象静态方法也能被执行。5.3.3 类方法的定义实例方法可以访问类的任何数据成员,直接使用即可。class Spherestatic final double PI=3.14;static int count=0;
10、double radius;double xCenter;double yCenter;double zCenter; static int getCount() return count; double volume() return 4.0/3.0*PI*radius*radius*radius; 5.3.4 在方法中访问类的数据成员每个实例方法都有一个名为this的变量,它引用调用该方法的当前对象,即当一个方法引用类的一个实例变量时,由编译器默认使用。例如,类中有实例变量value、a、b,则如下两条语句等价。 value = a+b; this.value = this.a+this.
11、b;5.3.5 this变量this是Java的一个关键字,表示某个对象。 this可以出现在实例方法和构造方法中,但不可以出现在类方法中。 this关键字出现在类的构造方法中时,代表使用该构造方法所创建的对象。 this关键字出现在类的实例方法中时,代表正在调用该方法的当前对象。 5.3.5 this变量class Sphere static final double PI = 3.14; / 初始化静态成员 double radius = 5.0; /初始化非静态成员 double xCenter = 10.0; /初始化非静态成员 5.3.6 初始化数据成员初始化块: 指位于括号中的一个
12、代码块,它在类的对象生成之前执行初始化块的分类:1、静态初始化块:使用static定义的代码块,当类装载到系统时将执行一次。静态初始化块只能初始化类的静态数据成员。2、非静态初始化块:对每个要生成的对象执行一次,可以初始化类的实例变量。程序见:5.3.6 初始化数据成员构造函数:函数名与类名相同,且不指定返回对象类型,可以有参数,也可以无参数,一个类中可以有多个构造函数。构造函数功能:在对象实例化时,系统首先调用构造函数,对生成的对象的实例变量进行初始化,其由系统默认调用。注意:如果类中没有显示声明构造函数,则系统会提供一个默认的构造函数,其无参,并且不做任何工作。5.4 构造函数例如:cla
13、ss Sphere double radius, xCenter, yCenter, zCenter; Sphere(double theRadius, double x, double y, double z) radius = theRadius; xCenter = x; yCenter = y; zCenter = z; 5.4 构造函数如果没有为类定义任何构造函数,编译器将自动提供一个默认构造函数,但其没有任何参数,也没有任何语句,仅提供一个生成对象的入口。注意: 如果类中已有构造函数,则系统将不再提供默认构造函数,如果此时需要一个无参构造函数,则需要显示定义一个。5.4.1 默认构
14、造函数声明类类型变量 Sphere ball;注意:此时系统没有生成对象,因此也就没有调用构造函数,只是生成了用于存储该对象的引用。生成类对象 ball = new Sphere(10.0, 1.0, 1.0, 1.0);5.4.2 生成类的对象将对象传递给方法: 把对象当作实参传递给一个方法的时候,采用引用传递的机制。即实参和形参引用的是同一个对象,没有对实际对象进行复制。对象的生存期: 对象的生存期由引用它的变量决定,即对象将在引用它的变量的作用域之外消失。处理消失对象的过程称为垃圾收集。程序见:CreateSpheres.java 和5.4.2 生成类的对象注意:将两个源程序放在一个目录
15、下,在JDK编译器下,只需编译包含main()定义的文件,就可以编译该程序涉及到的所有源文件。方法重载:在一个类中,用同样的名字定义的多个方法。重载条件:各重载函数的形参列表必须不相同。注意: 函数返回值不能作为判断重载的条件。签名:方法的名称、形参的类型及其顺序统称为签名。类中的每个方法的签名都必须唯一,编译器将以此判断该调用那一个函数。5.6 方法重载如果希望通过不同的初始化数据产生产生类的对象,则可以采用重载构造函数的方法。例如:Sphere(double x, double y, double z) xCenter = x; yCenter = y; zCenter = z; radi
16、us = 1.0; +count;5.6.1 多个构造函数Sphere() xCenter = 0; yCenter = 0; zCenter = 0; radius = 1.0; +count;在一个构造函数中调用构造函数: 类的构造函数可以在其第一条可执行语句中调用该类的另一个构造函数,可以省去大量的重复代码。调用方法:可以使用this作为名称,在其后面的括号中根据需要列出适当的参数。5.6.1 多个构造函数Sphere() radius = 1.0; +count;Sphere(double x, double y, double z) this(); / 注意在第一句调用 xCente
17、r = x; yCenter = y; zCenter = z;5.6.1 多个构造函数 Sphere ball = new Sphere(10.0, 10,0, 0.0); Sphere newBall = ball;则newBall将引用与ball相同的对象,而没有生成新对象,在修改这个对象时,ball和newBall都发生变化。可以采用复制构造函数的方法,将原对象作为参数,通过复制对象中的实例变量,来生成新的对象。5.6.2 使用构造函数复制对象例如:Sphere(final Sphere oldSphere) radius = oldSphere.radius; xCenter= ol
18、dSphere.xCenter; yCenter = oldSphere.yCenter; zCenter = oldSphere.zCenter; +count; Sphere ball = new Sphere(10.0, 10,0, 0.0);Sphere newBall = new Sphere(ball);5.6.2 使用构造函数复制对象本例作为上机练习题,让学生自己调试5.7 对象的使用递归:一个方法调用自己的过程被称为递归。递归分类:直接递归间接递归例题:编写一个方法计算一个变量的整数幂。程序见:本例作为上机练习题,又学生自己调试5.8 递归import java.util.Sc
19、anner;public class Digui static long fac(int n) if(n=1) return 1; else return n*fac(n-1); public static void main(String args) int k; long f; Scanner sc=new Scanner(System.in); System.out.println(请输入K的值:); k=sc.nextInt(); f=fac(k); System.out.println(f=+f); 递归级别 执行操作 0 fac(5) 1 fac(4) 2 fac(3) 3 fac
20、(2) 4 fac(1) 4 返回1 fac(1) 3 返回2 fac(2) 2 返回6 fac(3) 1 返回24 fac(4) 0 返回120 fac(5)为了便于管理大型软件系统中数目众多的类,解决类命名冲突的问题,Java引入了包(package)。5.9 理解包javalangSystemioString包(package) :是有唯一命名的类的集合,应着文件系统的目录层次结构包的作用:在一个包中使用的类名不会影响到另一个包中或编写的程序中可能出现的类名。例如:在默认包中的中使用的类String,全名是package语句必须是文件中的第一条语句。也就是说,在package语句之前,除
21、了空白和注释之外不能有任何语句。如果不加package语句,则指定为缺省包或无名包。在package语句中,用“.”来指明包(目录)的层次。5.9 理解包为在包Geometry中包含类Sphere,文件中应包含如下内容: package Geometry; / 包语句,需放在第一行 public class Sphere 其它类若想包含在Geometry中,也必须在类定义的开始处包含同一条语句,并且所有的类文件都存储在与包名相同的目录下。注意:若包中的类想被包外访问,则类和类中的函数都应定义为public。5.9.1 类的打包包和目录结构:一个包中可以有多个分类,例如已经开发了多组处理几何问题
22、的类:(1)对文件:处理2D图形的文件加入:package Geometry.Shapes2D;处理3D图形的文件加入:package Geometry.Shapes3D;(2)对目录:处理2D图形的文件存放在:GeometryShapes2d目录下处理3D图形的文件存放在:GeometryShapes3d目录下5.9.1 类的打包包的编译命令: javac classpath “c:temp” 包路径:是指包含该包目录的上一级目录的路径,注意不包含该包目录名本身。例如,包的源文件存储在C:tempGeometry下,则包路径为:C:temp。 5.9.1 类的打包包的访问方法一:设置环境变量
23、CLASSPATH方法二:使用-classpath来指明包的位置例如:Javac classpath “c:myPackages” my5.9.1 类的打包使用扩展包扩展包是.java文件,存放在JDK的ext目录下,在此目录下的.jar文件,将自动成为可访问的文件,不需要设置CLASSPATH环境变量或-classpath选项。命令格式: jar cvf Geometry.jar Geometry*.class此命令将生成,并在其中加入位于Geometry目录下的所有的.class文件,为使这个包对任何程序都可用,可将其复制到JDK的ext目录下。5.9.1 类的打包导入语句import:把
24、一个包中的所有或任何类加入到程序代码中,例如引入整个包: import Geometry.Shapes3d.*;例如引入包中的某个类: import Geometry.Shapes3d.Shape;5.9.2 将包中的类添加到程序中如前例,包中的类Sphere的全名是,这样可以很好的避免了类的重名问题。 如果不使用导入语句,仍然可以使用某个类,例如: Geometry.Shapes3D.Sphere ball = Geometry.Shapes3D.Sphere(10.0, 1.0, 1.0, 1.0);5.9.3 程序中的包和名称计算圆面积公式:*r*r; 这里的即为一静态成员,可以通过从类
25、Math中导入PI成员名来删除PI前缀Math,例如: import static java.lang.Math.PI;也可采用 import static java.lang.Math.* 来导入该类的所有静态成员,此时即可直接使用sqrt(),random()等方法,但这样也增加了名字冲突的概率。5.9.4 导入静态类成员一个类的方法和变量根据其设定的访问属性,如果属于同一个包,或其声明为public,则可以被其它类访问。5.10 控制对类成员的访问5.10.1 使用访问属性属性允许的访问default(无访问属性)来自同一包中任何类的方法访问public来自任何类的方法的访问privat
26、e只允许来自该类内部的方法访问protected来自同一包中任何类以及该类的任何地方的任何子类的方法访问5.10.2 指定访问属性指定类成员的访问属性,必须在声明语句的开始部分加上相应的关键字。例如:public class Point public Point(double xVal, double yVal)x=xVal; y=yVal; public double getX() return x; /访问器方法 public double setX(double inputX) x=inputX; /增变方法 private double x, y;5.10.3 选择访问属性一般,一个p
27、ublic类的变量应该声明为private,并将其外部调用的方法声明为public。注意:1、如果类中一些成员被设置成final,其又被类外使用,可将其声明为public。2、若成员仅供该类内部使用,应指定为private。3、若某些成员只是一种使用函数和标准数值的容器,可将其指定为public。例如Math中的函数。5.11 嵌套类嵌套类:在一个类中定义另外一个类,这个类就叫做嵌套类或内部类或内置类(inner class) 。内部类可以将逻辑上相关的一组类组织起来,并由外部类(outer class)来控制内部类的可见性。当建立一个inner class时,其对象就拥有了与外部类对象之间的
28、一种关系,这是通过一个特殊的this reference形成的,使得内部类对象可以随意的访问外部类中所有的成员。顶层类:包含嵌套类,但本身不是嵌套类的类。5.11 嵌套类public class Outside public class Inside class Outer private int index = 100; void print() Inner i = new Inner(); i.print(); class Inner void print() System.out.println(index); class Test public static void main(String args) Outer o = new Outer(); o.print(); public class Outer private String myString = outer; private String outerString =outer outer!; void test() System.out.print(test ); System.out.println(myString); new Inner().testInner(); private void test2() System.out.pr
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2026年绿色施工技术在隧道工程中的应用
- 2026年电气防爆防护措施的实施
- 2026年绿色建筑中光伏系统的集成设计
- 货运驾驶员超载安全培训
- 货车司机安全培训标语课件
- 生物D打印技术助力个性化治疗
- 医疗行业市场预测与展望
- 2026年河南地矿职业学院单招职业技能考试模拟试题带答案解析
- 2026年福州工商学院单招综合素质笔试参考题库带答案解析
- 医疗礼仪:医护人员礼仪修养的重要性
- 2026年广东农垦火星农场有限公司公开招聘作业区管理人员备考题库及参考答案详解
- 技术股入股协议书
- DL-T5796-2019水电工程边坡安全监测技术规范
- 魁北克腰痛障碍评分表(Quebec-Baclain-Disability-Scale-QBPDS)
- 八年级上册历史【全册】知识点梳理背诵版
- 《工会法》及《劳动合同法》教学课件
- 股权转让协议书常电子版(2篇)
- 2023年副主任医师(副高)-推拿学(副高)考试历年高频考点真题演练附带含答案
- 产品质量法课件
- 《食品包装学(第三版)》教学PPT课件整套电子讲义
- plc电机正反转-教案
评论
0/150
提交评论