版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、第4章 类、对象和方法内容提要o 了解类的基础知识o 了解如何创建对象o 理解如何向引用变量赋值o 创建方法,返回值,并且使用参数o 使用构造函数o 理解newo 理解垃圾回收和终止器o 使用this关键字4.1 类的基础知识o 所有的Java程序活动都发生在一个类中o 类是一个定义对象形式的模板o 类指定了数据,及操作数据的代码o 使用类的规范来构造对象o 对象是类的实例o 类是一系列指定如何建造对象的计划o 类是一个逻辑抽象4.1.1类的基本形式class classname /declare instance variables type var1; type var2; / type
2、varN; /declare methods type method1(parameters) /body of method type method2(parameters) /body of method / type methodN(parameters) /body of method 4.1.2 定义类o 开发一个封装汽车信息的类o 该类名为Vehicle,它存储了汽车的三个信息项:载客数量、油箱容量和耗油均值(每加仑行驶的英里数)class Vehicle int passengers; /number of passengers int fuelcap; /fuel capaci
3、ty in gallons int mpg; /fuel consumption in miles per gallon4.1.2 定义类o class定义创建了一种新的数据类型(Vehicle)o class声明只是一个类型描述,它不创建任何实际的对象o 创建Vehicle对象需使用下面语句Vehicle minivan = new Vehicle();4.1.2 定义类o 每次创建类的实例时,都可以创建一个包含类定义的实例变量副本的对象。o 为访问这些变量,可以使用点(.)运算符。点运算符将对象名和成员名链接在一起。o 点运算符的基本形式如下:object.member;class Veh
4、icle int passengers; /number of passengers int fuelcap; /fuel capacity in gallons int mpg; /fuel consumption in miles per gallon /This class declares an object of type Vehicle. class VehicleDemo public static void main (String args) Vehicle minivian = new Vehicle(); int range; /assign value to field
5、s in minivian minivian.passengers=7; minivian.fuelcap=16; minivian.mpg=21; /compute the range assuming a full tank of gas range=minivian.fuelcap*minivian.mpg; System.out.println(Minivan can carry + with a range of +range); 注意使用点运算符来访问成员4.1.2 定义类o 因为每个对象都有类定义的自己的实例变量副本,所以一个对象的变量的内容与另一对象的变量内容是不同的o 两个对
6、象除了都是同一类型的对象以外,它们之间没有什么联系。class Vehicle int passengers; /number of passengers int fuelcap; /fuel capacity in gallons int mpg; /fuel consumption in miles per gallon /This class declares an object of type Vehicle. class TwoVehicle public static void main (String args) Vehicle minivian = new Vehicle();
7、 Vehicle sportscar=new Vehicle();int range1,range2; /assign value to fields in minivian minivian.passengers=7; minivian.fuelcap=16; minivian.mpg=21; /assign value to fields in sportscar sportscar.passengers=2; sportscar.fuelcap=14; sportscar.mpg =12; /compute the range assuming a full tank of gas ra
8、nge1=minivian.fuelcap*minivian.mpg; range2=sportscar.fuelcap*sportscar.mpg; System.out.println(Minivan can carry +minivian.passengers+ with a range of +range1); System.out.println(Sportscar can carry +sportscar.passengers+ with a range of +range2); minivian和sportcar代表独立的对象问题o 一个类包含哪两项内容?o 通过对象访问类的成员
9、应使用什么运算符?o 每个对象都有类的 副本。4.2 如何创建对象o Vehicle minivan=new Vehicle();o 该声明完成两个功能。n 它声明一个名为minivan的类Vehicle类型的变量。该变量没有定义对象,它只是一个可以引用对象的变量n 声明创建了对象的一个实际的副本,并把对象的引用赋给了minivan。这些都是由new运算符完成的4.2 如何创建对象o new运算符为对象动态分配内存,并返回一个对它的引用。该引用是由new分配的对象内存的地址。然后,把引用存储在变量中。o 在Java中,必须动态分配所有的类对象。o 两个步骤可以分开重写,如下所示:Vehicle
10、 minivan;/declare reference to objectminivan =new Vehicle();/allocate a Vehicle object4.3 引用变量和赋值o 当把一个简单类型的变量赋给另一个变量时,等号左边的变量接收右边的变量值的副本。o 当把对象赋给其他变量时,是在改变引用变量所引用的对象。例如:Vehicle car1=new Vehicle();Vehicle car2=car1;car1.mpg=26;System.out.println(car1.mpg);System.out.println(car2.mpg);4.3 引用变量和赋值o 尽管
11、car1和car2都引用相同的对象,但它们之间是没有关系的。例如:Vehicle car1=new Vehicle();Vehicle car2=car1;Vehicle car3=new Vehicle();car2=car3;/now car2 and car3 refer to the same object.问题o 解释当一个对象引用变量被赋给另一个对象引用变量时会发生什么?o 假设一个类名为MyClass,试写出如何创建一个名为ob的对象。4.4 方法o 方法是操作类定义的数据,以及多数情况下提供对数据的访问的子例程。o 多数情况下,程序的其他部分都是通过类的方法来与类进行交互的。o
12、 一个方法包含一个或多个语句。o 每个方法只执行一项任务。o 每个方法只有一个名称,而方法也是通过使用这个名称被调用。可以为方法任意命名。4.4 方法o方法的基本形式如下:ret-type name(parameter-list) /body of methodnret-type指定了方法返回的数据类型,可以是任何有效类型;如果不返回值,它的返回类型必须为voidn方法名由name指定,可以说任何合法的,并且是当前作用域中没有被其他方法使用的标识符nparameter-list是一系列用逗号隔开的类型与标识符对。参数本质上是在调用方法时接传递到方法的变元的值的变量。如果方法没有参数,参数表为空
13、。向Vehicle类添加方法o 考虑前面通过将耗油率和油箱容量相乘来计算汽车的行驶里程的main(),这不是处理这种计算的最好方法。o 这种计算最好由Vehicle类自己来处理,原因是:油箱容量、燃油率,这两个数据都被封装在Vehicle类中。通过向Vehicle类添加一个计算行驶里程的方法,可以增强它的面向对象结构。向Vehicle类添加方法/Add range to Vehicle.class Vehicleint passengers; /number of passengers int fuelcap; /fuel capacity in gallons int mpg; /fuel
14、consumption in miles per gallon /Display the range. void range() System.out.println(Range is +fuelcap*mpg); range()方法包含在Vehicle类中fuelcap和mpg是直接使用的,没有利用点运算符class AddMeth public static void main (String args) Vehicle minivian = new Vehicle(); Vehicle sportscar= new Vehicle(); int range1,range2; /assig
15、n value to fields in minivian minivian.passengers=7; minivian.fuelcap=16; minivian.mpg=21; /assign value to fields in sportscar sportscar.passengers=2; sportscar.fuelcap=14; sportscar.mpg =12; System.out.println(Minivan can carry +minivian.passengers); minivian.range(); /display range of minivan Sys
16、tem.out.println(Sportscar can carry +sportscar.passengers); sportscar.range();/display range of sportscar. 向Vehicle类添加方法o 一个很重要的细节:没有在实例变量fuelcap和mpg的前面添加对象名或点运算符就直接引用了它们。o 当一个方法使用由它的类定义的示例变量时,可以直接使用,无需显式引用对象,也无需使用点运算符。o 原因:方法总是被与其相关的类的对象调用。一旦调用发生,对象就被知晓。4.5 从方法返回值o 引起方法返回的条件有两个:n 当遇到方法的闭花括号时n 当执行re
17、turn语句时o return语句有两种形式:n 用在void方法(它是不返回值的)中n 用于返回值的方法中4.5 从方法返回值o在void方法中,可通过以下形式的return语句使方法中断执行:return;o当语句执行时,程序控制权跳过方法中其余的代码返回给调用者,例如:void myMeth() int i; for(i=0;iv2.range() System.out.println(“v1 has greater range”);4.7 使用参数o 调用方法时,可以向方法传递一个或多个值o 向方法传递的值称为变元o 在方法中接收变元的变量称为参数o 参数声明在方法名后的圆括号中o 参
18、数声明语法与用于变量的语法一样o 参数位于自己方法的作用域中/A simple example that uses a parameter.class ChkNum/return true if x is evenboolean isEven(int x)if(x%2)=0) return true;else return false;class ParmDemopublic static void main (String args) ChkNum e= new ChkNum();if(e.isEven(10) System.out.println(10 is even.);if(e.isE
19、ven(9) System.out.println(9 is even);if(e.isEven(8) System.out.println(8 is even); x是isEven的整型参数传递变元给isEven()4.7 使用参数o 一个方法可以有多个参数o 声明参数时,只需用逗号将参数分隔开o Factor类定义了一个名为isFactor()的方法,用于确定第一个参数是否是第二个参数的因数4.7 使用参数class Factorboolean isFactor(int a,int b)if(b%a)=0) return true;else return false;class IsFac
20、torpublic static void main (String args) Factor x= new Factor();if(x.isFactor(2,20) System.out.println(2 is factor);if(x.isFactor(3,20) System.out.println(this wont be displayed); 该方法有两个参数向isFactor()传递两个变元4.7 使用参数o 注意,在调用isFactor()时,变量也是用逗号分隔的。o 在使用多个参数时,每个参数都指定了自己的类型,这些类型可以相互不同,例如:int myMeth(int a,
21、double b,float c)/向Vehicle添加一个带参数的方法o 添加新功能:计算给定距离所需的耗油总量o 方法名为fuelneeded(),该方法获取要行驶的英里数,返回需要汽油的加仑数。o fuelneeded()定义如下:double fuelneeded(int miles) return (double) miles/mpg;源程序源程序问题o 何时必须通过一个使用点运算符的对象引用来访问实例变量?o 解释变元与参数之间的不同o 解释方法返回给调用者的两种途径练习4-1 创建Help类o 类的本质类封装了功能o 类通常用来建造大型应用程序的代码块o 每个类必须表示一个执行描
22、述清晰的动作的功能单元o 类不能太小,也不能包含与类无关的功能练习4-1 创建Help类o 改写练习3-3为一个Help类,好处:o 帮助系统定义了一个逻辑单元o 想提供什么帮助系统,只需实例化一个帮助对象o 更新或修改帮助都不会对使用它的程序产生副作用练习4-1 创建Help类o 清楚组成帮助系统的各个部分n 用于显示菜单、输出用户选择、检查响应有效性以及显示所选项信息,程序循环执行,直到输入qn 其中菜单、检查响应有效性以及信息显示是构成帮助系统不可缺少的部分n 获得用户输入,重复请求是否应该被处理则不是必需的练习4-1 创建Help类o 步骤:n 创建helpon()方法,显示帮助信息n
23、 创建showmenu()方法,帮助菜单n 创建isvalid()方法,检查响应有效性n 把前面的方法加入help类中n 重写main()方法,以使其使用新的Help类源程序源程序4.8 构造函数o 实例变量需要使用一组语句来手动设置o 更好的方法使用构造函数o 构造函数在创建对象时初始化对象o 它的名称与类名相同,在语法上与方法相似o 构造函数没有显式返回类型o 用来为类定义的初值赋值,或执行其他创建完整对象所需要的启动过程4.8 构造函数o 无论是否定义,所有的类都有构造函数o Java自动提供了一个默认的构造函数来初始化所有的成员变量为0。o 一旦定义自己的构造函数,就不会载使用默认构造
24、函数了4.8 构造函数/A simple constructor.class MyClassint x;MyClass()x=10;class ConsDemopublic static void main (String args) MyClass t1=new MyClass();MyClass t2=new MyClass();System.out.println(t1.x+ +t2.x); 这是MyClass的构造函数4.9 带参数的构造函数o 向构造函数添加参数的方式与向方法添加参数的方式一样:只需在构造函数名称后的圆括号内声明参数即可4.9 带参数的构造函数/A parameter
25、ized constructor.class MyClassint x;MyClass(int i)x=i;class ParmConsDemopublic static void main (String args) MyClass t1=new MyClass(10);MyClass t2=new MyClass(88);System.out.println(t1.x+ +t2.x); 该构造函数有一个参数向Vehicle类添加一个构造函数/Add a constructor.class Vehicleint passengers; /number of passengers int fu
26、elcap; /fuel capacity in gallons int mpg; /fuel consumption in miles per gallon /This is a constructor for Vehicle. Vehicle(int p,int f,int m) passengers=p; fuelcap=f; mpg=m; /Return the range. int range() return mpg *fuelcap; /Compute fuel needed for a given distance. double fuelneeded(int miles) r
27、eturn (double )miles/mpg; Vehicle的构造函数class VehConsDemopublic static void main (String args) /construct complete vehiclesVehicle minivan = new Vehicle(7,16,21);Vehicle sportscar = new Vehicle(2,14,12);double gallons; int dist = 252; gallons = minivian.fuelneeded(dist); System.out.println(To go “ + d
28、ist + miles minivan needs + gallons + gallons of fuel.); gallons = sportscar.fuelneeded(dist); System.out.println(To go “ + dist + miles sportdcar needs “ + gallons + gallons of fuel.); 问题o 什么是构造函数,何时执行构造函数?o 构造函数有返回类型吗?4.10 深入介绍new运算符o new运算符的基本形式如下:class-var = new class-name();n class-var是一个要创建的类类
29、型的变量;n class-name是被初始化的类的类名n 圆括号指定了类的构造函数o 如果类不定义自己的构造函数,那么new将使用Java默认的构造函数。o new可以用于创建任何类类型的对象。4.10 深入介绍new运算符o 因为内存是有限的,由于内存不足,new可能无法为对象分配内存,这时就会发生一个运行时异常。4.11 垃圾回收与终止器 o 动态分配内存方案的关键是回收无用的对象所占的内存,以使内存用于后面的分配。o Java使用方便的方法垃圾回收。o 垃圾回收系统会自动回收对象,透明地在后台操作,无需程序员的干预。o 工作方式:当不存在对某对象的任何引用时,该对象就被认定为没有存在的必要了,它所占用的内存就要被释放。被回收的内存可以被用于下面的分配。4.11 垃圾回收与终止器o 垃圾回收只在存在一个或多个不再使用的对象时才发生(偶尔发生)。o 需满足两个条件:n 有
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 拨叉头加工课程设计
- 环保行业工程师工作总结
- IT行业客户服务心得
- 门诊部医生的工作总结
- 2024年苏教版九年级语文上册教学工作总结(共16篇)
- 2024年税务师题库(原创题)
- 《期货市场投资分析》课件
- 2024年规章制度会议记录(16篇)
- 【人教版九上历史】知识清单
- 2025关于房地产销售代理合同模板
- 广东省广州市越秀区2022-2023学年八年级上学期期末物理试卷
- 统编版语文四年级上册《期末作文专项复习》 课件
- 2024年黑龙江省机场集团招聘笔试参考题库含答案解析
- 食品从业人员安全学习培训记录
- 内科季度护理质量分析课件
- 2024年安全生产月活动安全知识竞赛题库含答案
- 销售回款专项激励政策方案(地产公司)
- 孕产妇健康管理服务规范课件
- 生物系统建模与仿真课件
- 风电项目核准及开工行政审批流程(备案核准、施工许可)
- ××市××学校巩固中等职业教育基础地位专项行动实施方案参考提纲
评论
0/150
提交评论