版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、第4章 类、对象和方法,内容提要,了解类的基础知识 了解如何创建对象 理解如何向引用变量赋值 创建方法,返回值,并且使用参数 使用构造函数 理解new 理解垃圾回收和终止器 使用this关键字,4.1 类的基础知识,所有的Java程序活动都发生在一个类中 类是一个定义对象形式的模板 类指定了数据,及操作数据的代码 使用类的规范来构造对象 对象是类的实例 类是一系列指定如何建造对象的计划 类是一个逻辑抽象,4.1.1类的基本形式,class classname /declare instance variables type var1; type var2; / type varN; /decl
2、are methods type method1(parameters) /body of method type method2(parameters) /body of method / type methodN(parameters) /body of method ,4.1.2 定义类,开发一个封装汽车信息的类 该类名为Vehicle,它存储了汽车的三个信息项:载客数量、油箱容量和耗油均值(每加仑行驶的英里数) class Vehicle int passengers; /number of passengers int fuelcap; /fuel capacity in gallo
3、ns int mpg; /fuel consumption in miles per gallon ,4.1.2 定义类,class定义创建了一种新的数据类型(Vehicle) class声明只是一个类型描述,它不创建任何实际的对象 创建Vehicle对象需使用下面语句 Vehicle minivan = new Vehicle();,4.1.2 定义类,每次创建类的实例时,都可以创建一个包含类定义的实例变量副本的对象。 为访问这些变量,可以使用点(.)运算符。点运算符将对象名和成员名链接在一起。 点运算符的基本形式如下: object.member;,class Vehicle int pa
4、ssengers; /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 fields in minivi
5、an 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 +minivian.passengers+ with a range of +range); ,注意使用点运算符来访问成员,4.1.2 定义类,因为每个对象都有类定义的自己的实例变量副本,所以一个对象的变量的内容与另一对象的变量内
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
7、Vehicle(); 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 tan
8、k of gas range1=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代表独立的对象,问题,一个类包含哪两项内容?
9、 通过对象访问类的成员应使用什么运算符? 每个对象都有类的 副本。,4.2 如何创建对象,Vehicle minivan=new Vehicle(); 该声明完成两个功能。 它声明一个名为minivan的类Vehicle类型的变量。该变量没有定义对象,它只是一个可以引用对象的变量 声明创建了对象的一个实际的副本,并把对象的引用赋给了minivan。这些都是由new运算符完成的,4.2 如何创建对象,new运算符为对象动态分配内存,并返回一个对它的引用。该引用是由new分配的对象内存的地址。然后,把引用存储在变量中。 在Java中,必须动态分配所有的类对象。 两个步骤可以分开重写,如下所示: V
10、ehicle minivan;/declare reference to object minivan =new Vehicle();/allocate a Vehicle object,4.3 引用变量和赋值,当把一个简单类型的变量赋给另一个变量时,等号左边的变量接收右边的变量值的副本。 当把对象赋给其他变量时,是在改变引用变量所引用的对象。例如: Vehicle car1=new Vehicle(); Vehicle car2=car1; car1.mpg=26; System.out.println(car1.mpg); System.out.println(car2.mpg);,4.3
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.,问题,解释当一个对象引用变量被赋给另一个对象引用变量时会发生什么? 假设一个类名为MyClass,试写出如何创建一个名为ob的对象。,4.4 方法,方法是操作类定义的数据,以及多数情况下提供对数据的访问的子例程。 多数情况下,程序的其他部分都是通过类
12、的方法来与类进行交互的。 一个方法包含一个或多个语句。 每个方法只执行一项任务。 每个方法只有一个名称,而方法也是通过使用这个名称被调用。可以为方法任意命名。,4.4 方法,方法的基本形式如下: ret-type name(parameter-list) /body of method ret-type指定了方法返回的数据类型,可以是任何有效类型;如果不返回值,它的返回类型必须为void 方法名由name指定,可以说任何合法的,并且是当前作用域中没有被其他方法使用的标识符 parameter-list是一系列用逗号隔开的类型与标识符对。参数本质上是在调用方法时接传递到方法的变元的值的变量。如果
13、方法没有参数,参数表为空。,向Vehicle类添加方法,考虑前面通过将耗油率和油箱容量相乘来计算汽车的行驶里程的main(),这不是处理这种计算的最好方法。 这种计算最好由Vehicle类自己来处理,原因是:油箱容量、燃油率,这两个数据都被封装在Vehicle类中。通过向Vehicle类添加一个计算行驶里程的方法,可以增强它的面向对象结构。,向Vehicle类添加方法,/Add range to Vehicle. class Vehicle int passengers; /number of passengers int fuelcap; /fuel capacity in gallons
14、int mpg; /fuel 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 ra
15、nge1,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; System.out.println(Minivan can carry +minivian.passengers); minivian.range(); /display r
16、ange of minivan System.out.println(Sportscar can carry +sportscar.passengers); sportscar.range();/display range of sportscar. ,向Vehicle类添加方法,一个很重要的细节:没有在实例变量fuelcap和mpg的前面添加对象名或点运算符就直接引用了它们。 当一个方法使用由它的类定义的示例变量时,可以直接使用,无需显式引用对象,也无需使用点运算符。 原因:方法总是被与其相关的类的对象调用。一旦调用发生,对象就被知晓。,4.5 从方法返回值,引起方法返回的条件有两个: 当遇
17、到方法的闭花括号时 当执行return语句时 return语句有两种形式: 用在void方法(它是不返回值的)中 用于返回值的方法中,4.5 从方法返回值,在void方法中,可通过以下形式的return语句使方法中断执行: return; 当语句执行时,程序控制权跳过方法中其余的代码返回给调用者,例如: void myMeth() int i; for(i=0;i10;i+) if(i=5) return; /stop at 5 System.out.println(); ,4.5 从方法返回值,一个方法可以拥有多个返回语句,特别是当它有两个或多个执行路线时: void myMeth() /
18、if(done) return; / if(error) return; 小心:一个方法中如果有太多的出口会破坏代码,所以要小心使用return语句。,4.6 返回值,返回值是方法最有用的功能之一 返回值可以用于不同的目的: 包含一些计算的结果 指示成功或失败 包含一个状态码 方法使用下面的return语句向调用例程返回值: return value; value是返回的值。,class Vehicle int passengers; /number of passengers int fuelcap; /fuel capacity in gallons int mpg; /fuel cons
19、umption in miles per gallon /Return the range. int range() return mpg *fuelcap; ,返回给定车辆的行驶里程,class RetMeth public static void main (String args) Vehicle minivian = new Vehicle(); Vehicle sportscar= new Vehicle(); int range1,range2; /assign value to fields in minivian minivian.passengers=7; minivian.
20、fuelcap=16; minivian.mpg=21; /assign value to fields in sportscar sportscar.passengers=2; sportscar.fuelcap=14; sportscar.mpg =12; /get the range range1=minivian.range(); range2=sportscar.range(); System.out.println(Minivan can carry +minivian.passengers+ with range of +range1+ Miles); System.out.pr
21、intln(Sportscar can carry +sportscar.passengers+ with range of +range2+ Miles); ,对返回的变量赋值,4.6 返回值,对range()的调用可以直接在println()中进行,如下: System.out.println(“Minivan can carry ” + minivan.passengers + ” with range of ” + minivan.range() + ” Miles”); 还可以在需要一个Vehicle对象的行驶里程时调用range(),例如: if(v1.range()v2.rang
22、e() System.out.println(“v1 has greater range”);,4.7 使用参数,调用方法时,可以向方法传递一个或多个值 向方法传递的值称为变元 在方法中接收变元的变量称为参数 参数声明在方法名后的圆括号中 参数声明语法与用于变量的语法一样 参数位于自己方法的作用域中,/A simple example that uses a parameter. class ChkNum /return true if x is even boolean isEven(int x) if(x%2)=0) return true; else return false; clas
23、s ParmDemo public static void main (String args) ChkNum e= new ChkNum(); if(e.isEven(10) System.out.println(10 is even.); if(e.isEven(9) System.out.println(9 is even); if(e.isEven(8) System.out.println(8 is even); ,x是isEven的整型参数,传递变元给isEven(),4.7 使用参数,一个方法可以有多个参数 声明参数时,只需用逗号将参数分隔开 Factor类定义了一个名为isFa
24、ctor()的方法,用于确定第一个参数是否是第二个参数的因数,4.7 使用参数,class Factor boolean isFactor(int a,int b) if(b%a)=0) return true; else return false; class IsFactor public 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
25、wont be displayed); ,该方法有两个参数,向isFactor()传递两个变元,4.7 使用参数,注意,在调用isFactor()时,变量也是用逗号分隔的。 在使用多个参数时,每个参数都指定了自己的类型,这些类型可以相互不同,例如: int myMeth(int a,double b,float c) /,向Vehicle添加一个带参数的方法,添加新功能:计算给定距离所需的耗油总量 方法名为fuelneeded(),该方法获取要行驶的英里数,返回需要汽油的加仑数。 fuelneeded()定义如下: double fuelneeded(int miles) return (do
26、uble) miles/mpg; ,源程序,问题,何时必须通过一个使用点运算符的对象引用来访问实例变量? 解释变元与参数之间的不同 解释方法返回给调用者的两种途径,练习4-1 创建Help类,类的本质类封装了功能 类通常用来建造大型应用程序的代码块 每个类必须表示一个执行描述清晰的动作的功能单元 类不能太小,也不能包含与类无关的功能,练习4-1 创建Help类,改写练习3-3为一个Help类,好处: 帮助系统定义了一个逻辑单元 想提供什么帮助系统,只需实例化一个帮助对象 更新或修改帮助都不会对使用它的程序产生副作用,练习4-1 创建Help类,清楚组成帮助系统的各个部分 用于显示菜单、输出用户
27、选择、检查响应有效性以及显示所选项信息,程序循环执行,直到输入q 其中菜单、检查响应有效性以及信息显示是构成帮助系统不可缺少的部分 获得用户输入,重复请求是否应该被处理则不是必需的,练习4-1 创建Help类,步骤: 创建helpon()方法,显示帮助信息 创建showmenu()方法,帮助菜单 创建isvalid()方法,检查响应有效性 把前面的方法加入help类中 重写main()方法,以使其使用新的Help类,源程序,4.8 构造函数,实例变量需要使用一组语句来手动设置 更好的方法使用构造函数 构造函数在创建对象时初始化对象 它的名称与类名相同,在语法上与方法相似 构造函数没有显式返回类
28、型 用来为类定义的初值赋值,或执行其他创建完整对象所需要的启动过程,4.8 构造函数,无论是否定义,所有的类都有构造函数 Java自动提供了一个默认的构造函数来初始化所有的成员变量为0。 一旦定义自己的构造函数,就不会载使用默认构造函数了,4.8 构造函数,/A simple constructor. class MyClass int x; MyClass() x=10; class ConsDemo public static void main (String args) MyClass t1=new MyClass(); MyClass t2=new MyClass(); System
29、.out.println(t1.x+ +t2.x); ,这是MyClass的构造函数,4.9 带参数的构造函数,向构造函数添加参数的方式与向方法添加参数的方式一样:只需在构造函数名称后的圆括号内声明参数即可,4.9 带参数的构造函数,/A parameterized constructor. class MyClass int x; MyClass(int i) x=i; class ParmConsDemo public static void main (String args) MyClass t1=new MyClass(10); MyClass t2=new MyClass(88);
30、 System.out.println(t1.x+ +t2.x); ,该构造函数有一个参数,向Vehicle类添加一个构造函数,/Add a constructor. class Vehicle int passengers; /number of passengers int fuelcap; /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; f
31、uelcap=f; mpg=m; /Return the range. int range() return mpg *fuelcap; /Compute fuel needed for a given distance. double fuelneeded(int miles) return (double )miles/mpg; ,Vehicle的构造函数,class VehConsDemo public static void main (String args) /construct complete vehicles Vehicle minivan = new Vehicle(7,1
32、6,21); Vehicle sportscar = new Vehicle(2,14,12); double gallons; int dist = 252; gallons = minivian.fuelneeded(dist); System.out.println(To go “ + dist + miles minivan needs + gallons + gallons of fuel.); gallons = sportscar.fuelneeded(dist); System.out.println(To go “ + dist + miles sportdcar needs
33、 “ + gallons + gallons of fuel.); ,问题,什么是构造函数,何时执行构造函数? 构造函数有返回类型吗?,4.10 深入介绍new运算符,new运算符的基本形式如下: class-var = new class-name(); class-var是一个要创建的类类型的变量; class-name是被初始化的类的类名 圆括号指定了类的构造函数 如果类不定义自己的构造函数,那么new将使用Java默认的构造函数。 new可以用于创建任何类类型的对象。,4.10 深入介绍new运算符,因为内存是有限的,由于内存不足,new可能无法为对象分配内存,这时就会发生一个运行时异常。,4.11 垃圾回收与终止器,动态分配内存方案的关键是回收无用的对象所占的内存,以使内存用于后面的分配。 Java使用方便的方法垃圾回收。 垃圾回收系统会自动回收对象,透明地在后台操作,无需程序员的干预。 工
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2026年传输线路模拟试卷(含答案)
- 2026年国家普通话水平考核模拟试卷及答案详解
- 2026年电子商务技师考试题库及答案详解
- 2026年理疗器械模拟题及答案详解
- 2026年医废处理项目申请报告范文
- 医学影像诊断2026年实习生考试及答案详解
- 2026年二级造价工程师道路桥梁工程计价模拟试卷目(含答案)
- 2026年常用药物用法模拟试题(含答案)
- 2026年17护资模拟试题(含答案)
- 2026年福建事业单位考试答题思路解析模拟试题(含答案)
- 安全员c证湖南省题库及答案解析
- GB/T 755-2025旋转电机定额与性能
- CJ/T 190-2015铝塑复合管用卡压式管件
- 2025年工程项目管理项目生命周期试题及答案
- 销售沙石知识培训课件
- 2025年度婚内出轨离婚协议书附带配偶精神损害赔偿协议
- 《陆用液体装卸臂检验规程》
- 食品加工厂安全生产手册
- 房屋渗漏修补合同样式
- (高清版)AQ 1028-2006 煤矿井工开采通风技术条件
- DL-T1098-2016间隔棒技术条件和试验方法
评论
0/150
提交评论