




已阅读5页,还剩35页未读, 继续免费阅读
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
第三篇 Java语言的面向对象机制 第五章 类和对象,5.1 简单的类 5.2 域 5.3 访问控制 5.4 创建对象 5.5 构造与初始化 5.6 方法 5.7 this引用 5.8 方法的名复用 5.9 main方法 5.10 native方法 5.11 小结,第五章 类和对象,类:汇集一套数据并定义所有访问、使用和修改这些数据的方法。 基于Java的面向对象设计需严格区别“做什么”与“怎么做”,方法的约定规定了当调用一个对象的方法时将会发生什么。,5.1 简单的类,类的基本成份:域(数据)和方法(处理数据的代码)。 类的三种成员: 域(field):与类及其对象相关联的数据变量,以保存类或对象的状态。 方法(method):包含类的可执行代码,定义了对象的行为。 内嵌类(nested class)和内嵌接口(nested interface):在其他类或接口中说明的类或接口。 上述类的说明创建了一个类型名,对该类型对象的引用可简单地说明如下: 此时mercury引用被初始化为null。在显式地创建对象之前, mercury引用的对象尚未真正存在,5.1 简单的类,public class Body public long idNum; public String nameFor; public Body orbits; public static long nextID = 0; / 与天体相关的类,public class StopLight int RedGreenYellow; changeLight( ) RedGreenYellow = + RedGreenYellow; /交通信号类,Body mercury;,Body mercury = new Body( );,5.1 简单的类,类修饰符(指定类的特殊性质),注意:每个源文件中最多只能有一个public类。因为Java要求含有public类的源文件名必须与该类名相同。,类中作为成员的变量。 与C+不同,可对类中的域赋予初始值。 对每个对象各自的域赋值,意味着每个对象都有自己独特的状态。除非静态域,否则不同对象间的域不会互相影响。,5.2 域,public class Body public long idNum; / 唯一地标识一个天体 public String nameFor; / 该天体的名字 public Body orbits; / 该天体围绕着转的其它天体 public static long nextID = 0; / 后继天体的标识 ,5.2 域初始化,初始化可采用(类型必须正确) 常量 域 方法调用 / 不能引发检测性异常-尚未建立捕捉异常的代码 上述三个的组合构成的表达式,double zero = 0.0; /常量 double sum = 4.5+3.7; /常量表达式 double zeroCopy = zero; /域 double rootTwo = Math.sqrt(2); /方法调用 double someVal = sum + 2 * Math.sqrt(rootTwo); /组合,静态域(类变量、类域):类的所有对象共享的域。由该类创建的所有对象共享这个域的单个值。 类的静态域在加载类时初始化。 访问: 类内部:直接用域名。 / nextID 类外部:通过类名和域名 或 类的对象引用和域名 Body.nextID mercury.nextID 即使mercury引用为null,第二种访问方式也是正确的。,5.2 域静态域,final域:被初始化后就不能再改变。 final域的初始化: 定义时初始化 类初始化后(static final) 对象创建完成后(没有static的final),5.2 域final域,5.2 域举例说明,类中有两种类型的变量:直接在类中定义的变量和在具体方法的中定义的变量。 直接在类中定义的变量:类中在任何方法之外声明的变量,被称为类的域,域可以被类的所有方法访问。 在具体方法的中定义的变量:在方法中声明的变量,是该方法的局部变量,局部变量只能在方法内访问。因为方法的变量与方法的生命周期相同,所以它们不能够被其它的类访问,用户也不能对方法变量使用任何访问修饰符。 访问变量的能力取决于两个因素:创建变量时使用的修饰符和变量声明在类中的位置。,5.2 域举例说明,class CashRegister public int total; int sales_value; Outputlog log; void printReceipt(int total_sale) Tape.println(“Total Sale = $ “ + total-sale); Tape.prinltn(“Thank you for shopping with us.“); void sellItem(int value) log.sale(value); total += value; int totalSales() int num_of_sales, total = 0; num_of_sales = log.countSales(); for(int i = 1; i = num_of_sales; i+) total += sales_valuei; return(total); ,访问控制:控制谁能访问一个类或接口中的哪些成员,甚至于控制谁能访问该类或接口。通过访问修饰符实现。 一个类的所有成员都可被类本身的代码访问。 为控制其它类的访问,类的成员(域和方法)有下述四种访问修饰符,类中每个成员有且仅有一个可见性控制。,5.3 访问控制,用new创建对象。必须指定要创建的对象的类型和构造对象的每个实参。 Java运行环境将分配足够的空间来存储对象的实例变量并初始化。初始化完成后,运行环境将返回这个新建对象的引用。实例是类的对象。,5.4 创建对象,Body sun = new Body(); sun.idNum = Body.nextID+; For = “Sol”; sun.orbits = null; / in solar system, sum is middle Body earth = new Body(); earth.idNum = Body.nextID+; For = “Earth”; earth.orbits = sun;,采用构造器的理由: 一些类没有参数来设置初始状态 当构造某种对象时,需提供初始状态,避免重复输入初始信息 对象创建时要有正确的初始状态 非public构造器可限制对象的创建使用者,5.5 构造与初始化,构造器是具有特殊属性和特殊用途的特殊方法。构造器用于在建立类的对象时设置某些属性和执行某些复杂的任务。 构造器使用与所属类相同的名字。 构造器可以有多个参数,也可以没有。 构造器不是方法,因为其没有返回类型。 新创建对象的实例变量先被赋予缺省值,然后执行显式的初始化器,最后调用构造器的语句体。 构造器可具有任何类成员同样的访问修饰符,但它不是类成员。,5.5 构造与初始化,class Body public long idNum; public String name = “”; public Body orbits = null ; private static long nextID = 0; Body() idNum = nextID+; ,Body sun = new Body(); /idNum = 0 = “Sol”; Body earth = new Body(); /idNum = 1 = “Earth”; earth.orbits = sun;,用户可以创建几个构造器,它们拥有不同的参数集。 一个构造器可以调用同类中的另外一个构造器:使用this( )做为第一个可执行语句,称为显式构造器调用。若有实参this(实参) 注意:构造器不能被声明为abstract、static、synchronized或final。 若在类中没有显式地提供一个构造器,Java将提供一个不做任何事情的缺省无参构造器 若类是public的,那么缺省构造器也是public的。,5.5 构造与初始化,Body(String bodyName,Body orbitsAround) this(); name = bodyName; orbits = orbitsAround; ,Body sun = new Body(“Sol”,null); Body earth = new Body(“Earth”,sun);,Body(String bodyName) this(bodyName, null); /另一个构造器,构造不环绕任何天体的Body对象,拷贝构造器:当前对象类型作为形参,使用时创建一个新对象,作为以对象形式传递的实参的一个拷贝。 通常知识复制所有域的值。 Java不提供缺省的拷贝构造器。,5.5 构造与初始化,Body(Body other) idNum = other.idNum; name = ; orbits = other.orbits; ,初始化块:对域进行更复杂的初始化。 出现在类说明中的语句块,位于所有成员、构造器说明之外,对该对象的域进行初始化。 它如同放在该类的每个构造器的开头一样执行。 如果有多个块,则按照出现的次序执行。,5.5 构造与初始化初始化块,class Body public long idNum; public String name = “”; public Body orbits = null; private static long nextID = 0; idNum = nextID+; public Body(String bodyName, Body orbitsAround) name = bodyName; orbits = orbitsAround; ,初始化块取代无参构造器,对类的静态域进行更复杂的初始化。 静态初始化块说明为static,只能访问类中的静态成员,在加载类时执行。 类中的静态初始化顺序是从左向右,从上向下。 举例:创建静态素数数组,并对其成员进行初始化。,5.5 构造与初始化静态初始化,class Primes static int knownPrimes = new int4; static knownPrimes0 = 2; for(int i = 1; i knownPrimes.length; i+) knownPrimesi = nextPrimes(); /declaration of nextPrimes() ,5.6 方法,类的方法:是类的本质所在,负责管理要执行的任务。 方法说明包括两个部分:方法首部和方法体。方法首部的格式是: 访问控制符 访问修饰符 返回类型 方法名(参数)throws ExceptionList,class Bodyprint public static void main(String args) Body sun = new Body(“Sol”,null); Body earth = new Body(“Earth”, sun); System.out.println(“Body” + + ”orbits” + + “and has ID” + earth.idNum);,方法的基调:方法名和用圆括号括起来的一组形参。,修饰符:允许用户为方法设置属性 抽象方法不能以static、final、synchronize、native、strictfp修饰。,5.6 方法访问修饰符,静态方法:给整个类调用,而非类实例化的对象。也称为类方法。 静态方法只能访问类的静态变量和静态方法。 静态方法无this引用,因为没有被操作的特定对象。,5.6 方法静态方法,class StaticCall private static int i =0; private static int j =1; public static void sc( ) i+; j+; public static void main(String args) StaticCall s; /s = new StaticCall(); StaticCall.sc( ); System.out.println(“The value=“+StaticCall.i); ,5.6 方法方法调用,方法的调用方式:对象引用 “.” 方法名 如果一个方法不返回任何值,那么返回类型的位置填以void。 toString是一种特殊的方法。如果一个对象具有一个没有参数并且返回一个String的toString方法,那么当这个对象被用于使用“”操作符进行一个字符串连接操作时,这个方法被自动调用,得到一个String。,public String toString() String desc = idNum + “ (” + name + “)”; if (orbits != null) desc += “ orbits ” + orbits.toString(); return desc; Body myBody = new Body(); myBody.toString();,System.out.println(“Body ” + sun); System.out.println(“Body ” + earth);,Body 0 (Sol) Body 1 (Earth) orbits 0 (Sol),5.6 方法方法的执行和返回,被调用方法停止执行并返回调用位置的三种情况: 执行return语句;/只能返回一个值 到达方法的末尾; 引发未捕获的异常。,5.6 方法方法的执行和返回,对一个给定的银行账户确定权限:存款、取款、撤销账户等。,class Permissions public boolean canDeposit, canWithdraw, canClose; /权限类,域表明可能具有的各种权限。 class Account private long number; /账号 private long balance; /余额 public Permissions permissionsFor(Person who) Permissions perm = new Permissions(); perm.canDeposit = canDeposit(who); perm.canWithdraw = canWithdraw(who); perm.canClose = canClose(who); return perm; / .define canDeposit(Person) et al. /账户类,参数表是将要传递给方法的信息列表。它可以是下面的格式并且可以由多个参数组成: 数据类型 变量名,数据类型 变量名, 如果没有参数要传递,那么Java允许参数为空。如: public static final void cleanBoard( ),5.6 方法形参值,Java方法的所有参数都是“以值调用”(call by value)。 以值调用:在被调用时,方法的形参的值是调用处实参值的一个拷贝。方法内可改变形参的值,而对实参无影响。 若形参是对象引用,则传给方法的是对象的引用,而不是对象本身。,5.6 方法形参值,PassByValue方法(传递的是基本类型double),5.6 方法形参值,class PassByValue public static void halveIt(double arg) arg /= 2; System.out.println(“halved:arg = “+arg); public static void main(String args) double one = 1.0; System.out.println(“before:one = “ + one); halveIt(one); System.out.println(“after:one = “+one); ,结果: before:one = 1.0 halved:arg = 0.5 after:one = 1.0,PassRef方法(传递的是类Body的对象引用),5.6 方法形参值,class PassRef public static void commonName(final Body bodyRef) bodyR = “Dog Star“; bodyRef = null; public static void main(String args) Body sirius = new Body(“Sirius“,null); System.out.println(“before:“+sirius); commonName(sirius); System.out.println(“after:“+sirius); ,public String toString() String desc = idNum + “ (” + name + “)”; if (orbits != null) desc += “ orbits ” + orbits.toString(); return desc; ,PassRef方法(传递的是类Body的对象引用),5.6 方法形参值,结果: before:0(Sirius) after:0(Dog Star),class PassRef public static void commonName(final Body bodyRef) bodyR = “Dog Star“; bodyRef = null; public static void main(String args) Body sirius = new Body(“Sirius“,null); System.out.println(“before:“+sirius); commonName(sirius); System.out.println(“after:“+sirius); ,public String toString() String desc = idNum + “ (” + name + “)”; if (orbits != null) desc += “ orbits ” + orbits.toString(); return desc; ,为强制一个访问是只读的,必须隐藏这个域。把域设置为private值,并提供一个public或protected方法,使类外代码使用方法来读取它的值。 访问方法:对内部数据规范访问的方法。,5.6 方法 使用方法来控制访问,class Body private long idNum ; /now “private” public String name = “”; public Body orbits = null; private static long nextID = 0; Body() idNum = nextID+; public long id() return idNum; /. ,this引用:把当前对象的引用作为参数传给其它方法。 this单独用 / 用作方法的实参数 this.域名/方法名(实参量) / this可省 this(实参量) / 显示构造器调用 若在方法中,域或方法前没有this,那么可视为有一个隐含的this存在。 当一个域名被变量或参数的说明隐藏时,才使用this。,5.7 this引用,class Moose String hairdresser ; Moose(String hairdresser) this.hairdresser = hairdresser; ,方法的基调(signature):方法名、形参的数目和类型 名复用(overload):不同的形参数目或类型,可有同样的方法名。即将同一个名字用以表示多种含义。,5.8 方法的名复用(overload),Java使用一个“最佳选择”的算法来完成匹配: 、找出所有可能适合该调用的方法构成一个集合。这些方法都有同样的名字,且它们的形参类型都能接受实参的赋值。如果只有一个方法精确地匹配了所有实参,就调用这个方法。 、如果集合中一个方法的所有参量类型均可赋给另一方法的参量类型的话,就去掉另一个方法,因为它不是最特定的。重复这一过程,直到再没有能去掉的方法。 、如果集合内只剩下一个方法,该方法就是最佳选择并调用它。如果剩下的方法多于一个,那么这个方法调用就具有歧义性,因而调用无效,编译报错。,5.8 方法的名复用(overload),举例1:,5.8 方法的名复用(overload),class X int m1(int i) return i; float m1(float f) return f; public static void main(String args) X x = new X(); System.out.println(x.m1(1234); System.out.println(x.m1(5678.345f); ,举例: void moorge(Dessert d, Scone s) void moorge(Cake c, Dessert d) void moorge(ChocolateCake cc, Scone s) moorge(dessertRef, sconeRef); moorge(chocolatecakeRef, desse
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2023年度计算机四级题库检测试题打印含完整答案详解【网校专用】
- 个人歌唱活动策划与执行要点
- 物料能量衡算精要
- 酒店微笑问好服务培训纲要
- 2026届山东省曲阜市石门山镇中学九年级化学第一学期期中学业水平测试模拟试题含解析
- 2026届山东省德州市六校化学九上期末统考模拟试题含解析
- 2026届山东滨州阳信县九年级英语第一学期期末教学质量检测模拟试题含解析
- 2026届河南省驻马店九上化学期中预测试题含解析
- 河南省南阳市宛城区等2地2025-2026学年高二上学期开学英语试题(含答案)
- 2025年腔镜技能大赛试题及答案
- 吊篮临时用电施工方案
- 2025-2030中国小麦加工行业市场发展分析及发展趋势与投资前景研究报告
- 肠系膜上动脉夹层护理查房
- 减盐减油知识课件
- 手术体位安全管理制度
- 慈善基金会财务管理制度
- 八马加盟合同样本
- 院校讲解空乘专业
- 国企项目投资合同
- 垃圾中转站安全培训
- 《柑橘病虫害防治》课件
评论
0/150
提交评论