Java程序设计-4-对象和类.ppt_第1页
Java程序设计-4-对象和类.ppt_第2页
Java程序设计-4-对象和类.ppt_第3页
Java程序设计-4-对象和类.ppt_第4页
Java程序设计-4-对象和类.ppt_第5页
已阅读5页,还剩62页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

Java程序设计 类和对象 对象和类 学习目标: n理解类和对象的概念及区别 n掌握类的定义以及类之间的关系描述 n理解对象间的通信方式 n认识UML基本图示含义,能够应用UML图示描述设计模型 n理解构造函数的作用 n理解对象的生存周期 n理解并掌握变量的作用域 n理解关键字this的用法 n理解并掌握方法的声明和调用 n掌握基本的范型和枚举类型的机制 n理解包,掌握包的作用 4.1 什么是对象 n对象是什么? u对象就是组成现实世界的个体,它们之间存 在着错综复杂的关系,正是这种关系的存在 构成了丰富多彩的世界。面向对象的分析就 是要把这些对象以及对象之间的关系找出来 。 n现实生活中的对象 u学生、课程、教师、选课单. u一个银行转帐监视系统中的帐户、交易、审 查策略. 4.1.1 对象里面是什么 n对象三要素 u对象的名称(标识符) u表现对象状态的属性集 u展示对象能力的行为集 4.1.1 对象里面是什么(cont.) 对象的符号 对象的简化符号 4.1.2 对象的生存周期 n对象是通过某个时刻某个客观存在的状态集 来表现的。世界上没有恒存的事物,所以对 象也具备从创建到消亡的生存周期。 n一个对象只有被创建出来,才具备生命力, 当它达到某个条件,便归于消亡。 4.1.2 对象的生存周期 (cont.) n1.声明、创建对象 u修饰符 类型 变量名 =初值,变量名=初值 uStudent student = null; uStudent student = new Student(“18052301“); n注:对象引用变量的声明和一般变量的声明没有任 何区别,可能出现的位置都是一样的。 4.1.2 对象的生存周期 (cont.) n2.使用对象 u如:System.out.println(“Welcome!”); ustudent.showAcademicRecord();/这句代码意思是告 诉对象student,执行showAcademicRecord(),列出 student这个对象的学业成绩。 n成员访问运算符(.) u可以访问那些访问修饰符非private的成员 u对于那些访问修饰符为private的属性,就不能直接访 问信息隐藏 u通过对象引用某个方法时,无论该方法是否需要传递参 数,都要在调用方法名时在后面加上括号,表示方法调 用 4.1.2 对象的生存周期 (cont.) n特殊的对象创建形式 uint areaOfRectangle = new Rectangle(100, 50).area(); u应该先执行new Rectangle(100, 50),虚拟 机会生成一个临时对象引用,然后调用该对 象的area(),计算area,最终将area的值赋 值给整型变量areaOfRectangle。 4.1.2 对象的生存周期 (cont.) n3 消亡 uobjectReference = null; n垃圾回收 uSystem.gc(); 4.2 进一步了解对象 n封装 n对象之间的关系消息、组合和聚合 n类 4.2 进一步了解对象(cont.) n1.封装 u对于软件世界,对象就是一个由属性集和方法 集构成的独立存在。在面向对象领域中把这种 构成称为封装(Encapsulation),封装技术带 来的直接优势就是信息隐藏(Information- hiding)和模块化(Modularity),就是在进行设 计时所追求的低耦合、高内聚。 u对象封装通过访问控制修饰符的限定,决定了 信息的批露范围,减少了由于直接访问而造成 的不当修改和引用,而且对象本身是一个独立 的实体,内部的运行过程外界无法直接控制, 因此模块化的程度进一步得到了提高。 4.2 进一步了解对象(cont.) n2 对象之间的关系 u对象间的关系包括在结构上的关联和聚合, 在协作上的消息传递机制 n关联 u关联关系提供了给定类的对象之间的一个链 接,需要相互通信的对象可以使用这种链接 。对象之间的消息一般就是沿着关联关系发 送的。 4.2 进一步了解对象(cont.) n一个关联的例子 关联的多重性 关联是有方向性 4.2 进一步了解对象(cont.) n聚合和组合 u聚合则表示把对象组合在一起,变成一个更大的 对象。这种包含关系就像整体和部分关系。这种 包含关系可以是强的(值聚合)或弱的(引用聚合) ,在UML中,值聚合称为组合,而引用聚合则称为 聚合。或者更简单的区别就是如果一个整体对象 被删除,那么其部分对象是否也同时不再存在。 4.2 进一步了解对象(cont.) n消息 u消息包含了接收对象名称、要求的服务(方法名) 、传递的参数这些信息,消息的处理过程依赖于 对象。 练习题 n定义合适的对象,描述他们的属性和功能 u请你定义汽车对象,描述他们的属性和功能 u汽车和驾驶员的关系是什么? n设想一下你的超市购物经历,如果让你描述 那样的环境,你会用什么样的对象来概括, 请描述他们。 4.3类是对象的抽象 n在Java语言中,要想表示对象,首先必须有 对象所属的类存在,无论这个类是J2SDK开发 包提供的、第三方提供的或者就是开发人员 自己定义的。 n类封装了一组对象的公共属性和方法 4.3.1类的结构 n一个类的定义 nimport java.util*; npublic class Student n /首先定义该类对象的属性 n private String id; n private String name; n /定义构造函数,一个类可以有多种构造对象的方法 n public Student() n . n n /以下开始定义该类对象的方法 n public void addAcademicRecord(AcademicRecord ar) n n n 4.3.1类的结构(cont.) n类的修饰符class 类名 extends 父类名 implements接口名 n 修饰符 类型成员变量1; n 修饰符 类型成员变量2; n static n /类初始化块 n n 构造函数1(参数1, 参数2, ) n 函数体; n n 构造函数2(参数1, 参数2, ) n 函数体; n n 修饰符 类型成员方法1(参数1, 参数2, ) throws 异常列表 n 方法体; n n 修饰符 类型成员方法2(参数1, 参数2, ) throws 异常列表 n 方法体; n n 4.3.1类的结构(cont.) n类的表示 在UML中符号,+、-分别表示public、private、 protected修饰符 4.3.1类的结构(cont.) n一些类声明的实例 n简单类 nclass Student n n n可被任一其它类访问的类- public npublic class Student n n n一个不可被继承的最终类- final npublic final class Student n n n一个抽象的类-abstract npublic abstract class Student n n n一个继承了父类Student的类- extends npublic class Postgraduate extends Student n n n一个继承了父类Student,并且 实现了一个接口的类 npublic class Postgraduate extends Student implements TakeTactics n n 4.3.3属性声明 n属性用于描述对象状态 u访问权限修饰符 类型 变量名; u访问权限修饰符 类型 变量名 =初值; u访问权限修饰符 类型 变量名 =初值 ,变量名 = 初值; npublic class Student n String id; n private String name; n public char gender=M; n private List academicRecordList; n 4.3.3属性声明(cont.) 元素必选作用 public | private | Protected|default 访问控制范围修饰符加上缺省没有任何访问控制范围 修饰符的五种情况,规定了成员变量的可见范围 static声明该变量为类变量,见4.4.3一节 final声明该变量为最终变量,一旦赋值则不可修改 transient标记该变量不被串行化,既变量值不能用于基于 socket的网络访问 volatile一个变量被声明为 volatile,表明它可以被异步修改, 编程时需要注意 type 每个变量必须规定它的类型,可以是基本类型(int, float, double等),也可以是引用类型(某种类,如 Student, List等) name变量的名称,要符合标识符的规定,在同一个作用域 范围内名称不能重复。 4.3.3属性声明(cont.) n1 类属性和对象属性 uclass Calendar u static final int DAYS_OF_JANUARY = 31; /一月的天数 u u static final int DAYS_OF_DECEMBER = 31; /十二月的天数 u uclass Bank u static final float ir_1=0.02; /一年期储蓄利率 ,这是类变量 u String address; /因为每个银行都有自 己的所在地,故是对象变量 u u n2 属性的访问 u通过成员运算符访问 u通过getXxx()、setXxx()方法访问 n示例: uPublic class Student u private String name; u public String getName() u return ; u u public void setName(String name) u u n 4.3.3属性声明(cont.) n3. 访问控制范围修饰符 表4-5 访问控制范围修饰符可见区域 名称修饰符类子类包所有类 公共public 友好- 保护protected 私有private Java名字空间及访问规则 npublic: 任何其它类、对象只要可以看到这个类 的话,那么它就可以存取变量的数据,或使用方 法。 nprotected:同一类,同一包可以使用。不同包 的类要使用,必须是该类的子类。 nprivate:不允许任何其他类存取和调用。 n(default,前边没有修饰字的情况):在同一程 序包中出现的类才可以直接使用它的数据和方法 . n关于变量声明 u(01)只在你需要使用时,才去声明变量,不要 提前声明。 u(02)声明变量时,需要合理地进行初始化。 u(03)不要在循环体内部声明变量,这样会影响 效率。 4.3.4 定义方法 n1 方法 u方法是自包含的有名代码块,并且具有可重用的特性 。方法由对象通过调用方法名得到执行,一些方法有 某种类型的返回值,一些没有。有返回值的方法通常 在表达式中被调用,作为表达式的一部分参与运算; 而没有返回值的方法通常在调用语句中被调用,使它 完成某种功能。 n方法调用 uSystem.out.println(“Welcome!“); uint max=Math.max(10,20); 4.3.4 定义方法(cont.) n2方法声明 u修饰符 方法返回类型 方法名 (类型 参数1, 类型 参数2, ) throws 异常列表 u 方法体; u 元素必选作用 public|private | protected | 访问控制范围修饰符加上缺省没有任何访问控制范围 修饰符的四种情况,规定了成员方法的可见范围, static声明该方法为类方法, final声明该方法为不可被子类所重写(overridden)的最 终方法 abstract声明该方法为抽象类中的抽象方法,必须在非抽象的 子类中实现具体操作 native该方法被其它语言所实现 synchronized保证该方法被互斥访问,参见多线程部分 return type 该方法的返回值类型,可以是基本数值型,也可以任 一引用类型,当没有返回值时,类型声明为void name方法的名称 (参数列表)用于接收方法调用时,外界传来的参数,可以没有参 数,但( )不能省略,参数之间用逗号隔开,每个参数 都必须独立有自己的类型声明 throws 异常列表用逗号隔开的异常列表,参见异常部分 n3.方法调用 u调用对象方法的过程很简单,可以直接通过对象名用成员运算符来访问 。 u没有返回值的方法调用: uSystem.out.println(“Welcome!“); u有返回值的方法调用: uint max=0; u umax=Math.max(10,20); /调用比较最大值的方法,返回其中的最大值 u或: uString age=“18“; uint ageNum=0; u uageNum = Integer.parseInt(age); /将数值字符串转换为整数 n4. 形参和实参 u某些方法在执行时,需要接收一些外部的值,对象在执 行这些方法时,就需要把这些值传递到方法代码中,这 就需要一个传递的通道。这个通道就是利用声明方法时 定义的形式参数列表,如图4-2中的定义。 u位于方法名后括号里的形式参数指定了执行方法需要的 值的个数和类型,那么在实际执行时,就需要按照声明 的要求(类型、顺序、个数)提供确定的值,这个实际执 行时,传递到方法的值称为实际参数,它可以用常量表 示,也可以用变量表示,变量既可以是基本类型,也可 以是引用类型。 npublic class ParaSample npublic int max(int v1,int v2) nreturn v1v2?v1:v2; n npublic static void main(String args) nint x=100; nParaSample sample=new ParaSample( ); nSystem.out.println(sample.max(x,90); /此处调用了对象sample的方法max n n n值传递和引用传递 u形式参数定义了接收执行时传递过来的值, 但是对于基本类型和引用类型,有本质的区 别。 n返回值及方法类型 u前面提到方法的返回值有两种类型,一种有 返回值,一种没有。没有返回值的可以直接 构成调用语句,如System.out.println(), 而有返回值的则可以构成表达式的一部分, 参与运算。 u一个方法如果要返回某种类型的值,可以用 return语句,程序执行时,如果遇到return 语句,则无条件退出当前的执行过程,返回 上级调用点,或者该程序运行结束。 ureturn 表达式; uReturn; 4.3.4 定义方法(cont.) n类方法和成员方法 u类似于变量,方法基于是否有static修饰也 可以分为类方法和对象方法(实例方法)。访 问时,类方法可以直接通过类名来引用,而 实例方法必须通过对象名来访问,也就是说 要想使用实例方法,首先要创建一个该类的 对象才行。 n由于类方法是属于整个类的,并不属于类的哪个对象,所类方 法的方法体中不能有与类的对象有关的内容。即类方法体有以 下限制,如果违反这些限制,就会导致程序编译错误。 n类方法中不能引用对象变量; n类方法中不能调用类的对象方法; n在类方法中不能使用super、this关键字。 n而对象的方法,则必须首先创建对象实例,然后才能使用,例 如: nStudent student = new Student(“0607102“);/根据学号创 建实例 nstudent.showAcademicRecord(); /显示学号为0607102的成绩 单 n而和类方法相比,对象方法则几乎没有什么限制: n(1) 对象方法中可以引用对象变量,也可以引用类变量; n(2) 对象方法中可以调用类方法; n(3) 对象方法中可以使用super、this关键字。 4.3.4 定义方法(cont.) n方法重载(OverLoadding) u方法的名称、形式参数的类型和次序、个数形成了方法的签 名特征,一个类中不允许出现签名完全相同的方法声明。 u例如: uSystem.out.println(“Welcome!“); /输出一个字符串 uSystem.out.println(intNumber); /输出一个整数 uSystem.out.println(floatNumber); /输出一个单精度实 数 uSystem.out.println(student); /输出一个student对象 练习题 n定义合适的类,描述他的属性和功能 u请你定义汽车类,描述他的属性和功能 n设想一下你的超市购物经历,如果让你描述 那样的环境,你会用什么样的对象来概括, 轻描述他们。 4.3.5 对象构造 n1 构造函数 u构造函数有两个特征区别于方法: u构造函数从无返回值,不可以为其指定任何类型的返回值,包 括void。 u构造函数的名称总是和类名保持完全一致。 n2 默认的构造函数当一个类没有明确的构造函数 uStudent student=new Student(); n3 使用构造函数 u创建对象,如 new ParaSample()、new Integer(5)。 u在构造函数的函数体的第一条语句,可以调用同类中的 另一个构造函数或者是父类的构造函数,其它语句不可 使用 4.4类和对象的使用 n1 创建对象 u利用new运算符创建 ustudent=new Student(“0625001“); u利用类本身提供的方法 uCalendar today= Calendar.getInstance(); 4.4类和对象的使用(cont.) nthis u每个类可以创造多个对象,每个对象都拥有 一个this变量指向自己,供自己的方法内部 代码中使用,可以通过this,获得当前对象 的属性值,也可以调用自身对象的其它方法 4.4类和对象的使用(cont.) nStatic的作用 u共享数据 u共享操作 u类初始化 n共享数据 upublic class MathUtil u /定义了一个类静态常量PI upublic static final double PI=3.1415926; u n这个PI被static修饰后,要想使用,必须通过“类名 .静态成员变量名“这种方法使用。其它例子如前面 程序经常使用的System.out.println(),out是 System类的一个静态成员,其类型是PrintStream ,所以就通过类名System就直接引用了。再比如, Integer.MAX_VALUE则表示的是一个整型类能够表示 的最大数。 n共享操作 u在前面的程序中,读者已经熟悉了经常出现在类中的 main方法,根据前面对方法修饰符的定义,static表 示修饰的方法是一个属于类所有的方法,可以通过“ 类名.方法名()“来调用。之所以规定如此的特性, 是因为在实际中某些对象所应具备的能力不因对象的 改变而改变,而是按照一个所有该类对象均应遵循的 规则来执行,如三角函数的计算、字符串的处理等, 把这些能力定义到每个对象中没有必要,所以就出现 了应把它们归属为类所有,由所有对象共享。 n类初始化 u在讲构造函数的时候,提到构造函数通常是对象在被创建时执 行某些初始化的工作,那么,类在初次加载到内存的时候,如 果希望也能执行一些初始化的工作,应该如何实现呢?答案就 是:应该把类加载时执行的代码放在“初始化块“中。在Java中 ,初始化块是放在一个如下格式的大括号()中: ustatic u u u它在类体当中存在的位置是独立的,可以放在任何合适的位置 。 u这个初始化块和构造函数不一样的地方是它没有函数名,也没 有访问控制修饰符,只有一个static来表明它的作用。 u而且,该初始化块只是在类加载时被执行一次,而且只被执行 一次。其代码执行优先于对象创建。 4.4类和对象的使用(cont.) n对象消亡处理- finalize() uprotected void finalize() u /* u * 此处可放有关该对象被删除时刻,应 该执行的代码。 u * 例如连接池对象在释放时,应该检查 所有的连接是否已经关闭等。 u */ u n实例运算符instanceof npublic class TestInstanceof npublic static void main(String args) nStudent student =new Student(); n/判断student是否是Student的实例 nboolean res = student instanceof Student; nif(res) n/如果是Student类型 nelse n/如果不是Student类型 n n n 4.5变量作用域 位置类方 法 类初始 化块 所有对 象 成员方 法 代码 快 备注 类变量 成员变量所有成员 方法 方法参数同一方法 内 代码块变 量 同一代码 块 异常捕获 参数 异常处理 块内 课堂练习 n类和对象的区别 n构造函数和普通方法的区别是什么 n方法的签名包含哪些内容 n重载的特征是什么 n值传递和引用传递的区别是什么 npublic class Foo n int i; n static String s; n void imethod() n static void smethod() n n设f是Foo的一个实例,则下述语句正确吗? uSystem.out.println(f.i); uSystem.out.println(f.s); uf.imethod(); uf.smethod(); uSystem.out.println(Foo.i); uSystem.out.println(Foo.s); uFoo.imethod(); uFoo.smethod(); n类之间的关系有聚合、关联等类型,请画出 下面类之间的关系。 u公司和雇员 u课程和师资 u房子和窗户 u书架和书 n写一个名为Rectangle的类表示矩形,有两个属 性width和height和颜色color, width和 height是double型的,而color是String型的, 假定所有矩形颜色相同。要求提供属性访问方 法和一个计算矩形面积的方法getArea()的方法 ,通过构造函数提供width和height值。 n写一个程序测试该类,验证面积计算方法的正 确性。 n一个Fan有自己的品牌和型号,其功能有 start,stop,speed,start和stop可以改变 Fan的状态status(on/off),speed可以调整 Fan的速度(档级在0、1、2、3),请分析并 提供一个类的定义。 4.6 包 n包是有着唯一命名的类的集合,它将开发者 认为相关的类分组管理,实际上Java中所有 的类都在一个具体的包中。 n在逻辑上,包就是把相关的类组合在一起管 理。 n在物理上,包就是目录,相关的类归类放在 某个目录下。 例如: n在jdk软件包中,如日期类、格式化类等都在 java.util包下,而基本语言类都在 java.lang下,输入输出类都在java.io下。 n一般项目中公用类库,可以放在mon 下,com通常代表公司,common代表公共类, 这是两级目录,com是一级,common是第二级 。 一个开发假定: n操作系统:windows系列 n源程序所在位置:D:javademosrc u(注:此目录将被称为源程序根目录-“) nclass文件所在根位置D:javademoclasses n1.创建包 u 创建包就是在根目录下根据包的层次,逐级创 建子目录。如假定我们准备把一个类Student放 在my.school下,你应该如此做: u在D:javademosrc目录下,创建子目录my u在子目录my下,创建子目录school n2.将类放在指定目录下 n将类Student放在子目录school下 nStudent类的第一行语句必须是package my.school upackage my.school; upublic class Student u u n将PostGraduate类放在my目录下 upackage my; uimport my.school.Student; upublic class PostGraduate extends Student u u n3.访问其它包内的类 u一个类如果不希望被包外的其他类所访问 ,就不要在声明class的时候加上public修 饰 u如果在一个类中需要引用其它包内可见类, 就需要在一个类的声明之前,包的声明之 后的中间位置导入该类,如PostGraduate 类导入Student类: uimport my.school.Student; u或者 uimport my.school.*; n引用处在一个包内的类无须导入 n引用java.lang包无须导入 4. 编译包 uD:javademosrc ujav

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论