资源预览内容
第1页 / 共58页
第2页 / 共58页
第3页 / 共58页
第4页 / 共58页
第5页 / 共58页
第6页 / 共58页
第7页 / 共58页
第8页 / 共58页
第9页 / 共58页
第10页 / 共58页
亲,该文档总共58页,到这儿已超出免费预览范围,如果喜欢就下载吧!
资源描述
类、对象和方法类、对象和方法内容提要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 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 capacity in gallons int mpg; /fuel consumption in miles per gallon4.1.2 定义类oclass定义创建了一种新的数据类型(Vehicle)oclass声明只是一个类型描述,它不创建任何实际的对象o创建Vehicle对象需使用下面语句Vehicle minivan = new Vehicle();4.1.2 定义类o每次创建类的实例时,都可以创建一个包含类定义的实例变量副本的对象。o为访问这些变量,可以使用点(.)运算符。点运算符将对象名和成员名链接在一起。o点运算符的基本形式如下:object.member;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 VehicleDemo public static void main (String args) Vehicle minivian = new Vehicle(); int range; /assign value to fields 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 +minivian.passengersminivian.passengers+ with a range of +range); 注意使用点运算符来访问成员4.1.2 定义类o因为每个对象都有类定义的自己的实例变量副本,所以一个对象的变量的内容与另一对象的变量内容是不同的o两个对象除了都是同一类型的对象以外,它们之间没有什么联系。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(); 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 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代表独立的对象问题o一个类包含哪两项内容?o通过对象访问类的成员应使用什么运算符?o每个对象都有类的 副本。4.2 如何创建对象oVehicle minivan=new Vehicle();o该声明完成两个功能。n它声明一个名为minivan的类Vehicle类型的变量。该变量没有定义对象,它只是一个可以引用对象的变量n声明创建了对象的一个实际的副本,并把对象的引用赋给了minivan。这些都是由new运算符完成的4.2 如何创建对象onew运算符为对象动态分配内存,并返回一个对它的引用。该引用是由new分配的对象内存的地址。然后,把引用存储在变量中。o在Java中,必须动态分配所有的类对象。o两个步骤可以分开重写,如下所示:Vehicle 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尽管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一个方法包含一个或多个语句。o每个方法只执行一项任务。o每个方法只有一个名称,而方法也是通过使用这个名称被调用。可以为方法任意命名。4.4 方法o方法的基本形式如下:ret-type name(parameter-list) /body of methodnret-type指定了方法返回的数据类型,可以是任何有效类型;如果不返回值,它的返回类型必须为voidn方法名由name指定,可以说任何合法的,并且是当前作用域中没有被其他方法使用的标识符nparameter-list是一系列用逗号隔开的类型与标识符对。参数本质上是在调用方法时接传递到方法的变元的值的变量。如果方法没有参数,参数表为空。向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 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; /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 range of minivan System.out.println(Sportscar can carry +sportscar.passengers); sportscar.range();/display range of sportscar. 向Vehicle类添加方法o一个很重要的细节:没有在实例变量fuelcap和mpg的前面添加对象名或点运算符就直接引用了它们。o当一个方法使用由它的类定义的示例变量时,可以直接使用,无需显式引用对象,也无需使用点运算符。o原因:方法总是被与其相关的类的对象调用。一旦调用发生,对象就被知晓。4.5 从方法返回值o引起方法返回的条件有两个:n当遇到方法的闭花括号时n当执行return语句时oreturn语句有两种形式: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参数声明语法与用于变量的语法一样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.isEven(9) System.out.println(9 is even);if(e.isEven(8) System.out.println(8 is even); x是isEven的整型参数传递变元给isEven()4.7 使用参数o一个方法可以有多个参数o声明参数时,只需用逗号将参数分隔开oFactor类定义了一个名为isFactor()的方法,用于确定第一个参数是否是第二个参数的因数4.7 使用参数class Factorboolean isFactor(int a,int b)if(b%a)=0) return true;else return false;class IsFactorpublic 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,double b,float c)/向Vehicle添加一个带参数的方法o添加新功能:计算给定距离所需的耗油总量o方法名为fuelneeded(),该方法获取要行驶的英里数,返回需要汽油的加仑数。ofuelneeded()定义如下:double fuelneeded(int miles) return (double) miles/mpg;源程序源程序问题o何时必须通过一个使用点运算符的对象引用来访问实例变量?o解释变元与参数之间的不同o解释方法返回给调用者的两种途径练习4-1 创建Help类o类的本质类封装了功能o类通常用来建造大型应用程序的代码块o每个类必须表示一个执行描述清晰的动作的功能单元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创建showmenu()方法,帮助菜单n创建isvalid()方法,检查响应有效性n把前面的方法加入help类中n重写main()方法,以使其使用新的Help类源程序源程序4.8 构造函数o实例变量需要使用一组语句来手动设置o更好的方法使用构造函数o构造函数在创建对象时初始化对象o它的名称与类名相同,在语法上与方法相似o构造函数没有显式返回类型o用来为类定义的初值赋值,或执行其他创建完整对象所需要的启动过程4.8 构造函数o无论是否定义,所有的类都有构造函数oJava自动提供了一个默认的构造函数来初始化所有的成员变量为0。o一旦定义自己的构造函数,就不会载使用默认构造函数了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 parameterized 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 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; fuelcap=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 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 “ + dist + 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运算符onew运算符的基本形式如下:class-var = new class-name();nclass-var是一个要创建的类类型的变量;nclass-name是被初始化的类的类名n圆括号指定了类的构造函数o如果类不定义自己的构造函数,那么new将使用Java默认的构造函数。onew可以用于创建任何类类型的对象。4.10 深入介绍new运算符o因为内存是有限的,由于内存不足,new可能无法为对象分配内存,这时就会发生一个运行时异常。4.11 垃圾回收与终止器 o动态分配内存方案的关键是回收无用的对象所占的内存,以使内存用于后面的分配。oJava使用方便的方法垃圾回收。o垃圾回收系统会自动回收对象,透明地在后台操作,无需程序员的干预。o工作方式:当不存在对某对象的任何引用时,该对象就被认定为没有存在的必要了,它所占用的内存就要被释放。被回收的内存可以被用于下面的分配。4.11 垃圾回收与终止器o垃圾回收只在存在一个或多个不再使用的对象时才发生(偶尔发生)。o需满足两个条件:n有对象要回收n需要回收这些对象o垃圾回收要占用时间o无法知道垃圾回收发生的准确时间finalize()方法ofinalize()方法用于确保对象完全终止o在对象最后被垃圾回收器销毁之前调用ofinalize()方法中,要指定在对象被销毁前必须执行的动作ofinalize()方法的基本形式:protected void finalize() /finalization code herenprotected是一个防止类以外的代码访问finalize()的说明符finalize()方法o调用finalize()是在垃圾回收之前o当对象不在作用域中时,是不会调用它o不知道何时执行finalize()o把它作为一个“后备”过程来确保对某些资源的合理处理,或用于特殊用途的应用程序,而不是程序在普通操作中使用的方法练习4-2 演示垃圾回收o垃圾回收只是在后台偶尔运行一次o通常是在有许多无用对象时o为了演示finalize()方法,需创建、销毁大量的对象源代码源代码4.12 this关键字o当调用一个方法时,会向它自动传递一个隐式变量,它是对调用对象的一个引用。这个引用叫做thiso考虑程序:创建一个Pwr类,该类计算数值不同幂的结果。oreturn val; return this.val;4.12 this关键字o使用this引用编写的完整的Pwr类:class Pwrdouble b;int e;double val; Pwr(double base, int exp)this.b=base;this.e=exp;this.val=1;if(exp=0) return;for(;exp0;exp-) this.val=this.val*this.base; double get_val()return this.val;4.12 this关键字othis有一些重要用途n例如:Java语法允许一个参数名或一个局部变量名与实例变量名一致。这时,局部变量名会隐藏实例变量。通过使用this,就可以得到访问隐藏实例变量的访问权Pwr(double b, int e)this.b=b;this.e=e;val=1;if(e=0) return;for(;e0;e-) val=val*b; 它引用b实例变量,而不是参数
网站客服QQ:2055934822
金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号