Java程序设计-04面向对象的基本概念.ppt

上传人:max****ui 文档编号:6361399 上传时间:2020-02-23 格式:PPT 页数:36 大小:770.31KB
返回 下载 相关 举报
Java程序设计-04面向对象的基本概念.ppt_第1页
第1页 / 共36页
Java程序设计-04面向对象的基本概念.ppt_第2页
第2页 / 共36页
Java程序设计-04面向对象的基本概念.ppt_第3页
第3页 / 共36页
点击查看更多>>
资源描述
计算机科学与技术学院赵志崑zhaozk Java程序设计 面向对象的方法 面向对象的程序设计程序的基本构件是类和对象 不是过程或函数面向对象的分析类和对象是名词 过程是动词面向对象的方法更接近人的思维方式提高软件开发效率面向对象的程序设计只是一个环节分析 设计 编码 维护 Java的面向对象特性 初级特性 基本的概念 即类和对象 中级特性 核心的机制 即封装 继承和多态 高级特性 由初级特性和中级特性引出的一些问题 如构造函数的使用 覆盖的规则 静态变量和函数等 类和对象 面向对象技术最基本的概念是类和对象 类是一个样板 以操作 表示和算法的形式完整地定义了一组对象的行为 它通常也是面向对象语言中的模块化 封装和数据抽象的基础 对象是类的一个实例 是一个软件单元 它由一组结构化的数据和在其上的一组操作构成 抽象数据类型 类实际上为实际的物体在计算机中定义了一种抽象数据类型 抽象数据类型是仅由数据类型和可能在这个数据类型上进行的操作定义的 使用者只能通过操作方法来访问其属性 不用知道这个数据类型内部各种操作是如何实现的 变量 方法和消息 对象的三个基本要素 变量 指对象的数据 用来保存对象的状态 又称为实例字段 方法 指对象的功能单元 消息 软件对象通过相互间传递消息来相互作用和通信 一个消息由三部分组成 1 接受消息的对象2 要完成方法的名字3 方法需要的参数如myCar speedUP 面向对象的程序设计 所有东西都是对象 程序是一大堆对象的组合 通过消息传递 各对象知道自己该做些什么 分而制之 每个对象都有自己的存储空间 可容纳其他对象 由小到大 每个对象都有一种类型 举一反三 同一类所有对象都能接收相同的消息 类 定义类采用下面的语句 class类名 成员定义 说明 类的成员包括变量和函数 而且可以有多个 成员函数可以使用成员变量 成员函数也可以调用其它成员函数 对于成员函数来说 成员变量类似于C 中的全局变量 但其作用范围仅限于类内部 一个类就划定了一个范围 在此范围内有 全局变量 和一些函数 classStudent longid chargender intclassID voidchangeClass intc classID c 类和源代码文件 一个源文件中可以写多个类 和源文件名字相同的类叫作主类 只有主类声明前面可以有public 一个源文件中可以没有主类 将源文件编译后 每个类都会生成一个 class文件 构造函数 构造函数是类的一个特殊的成员函数 用于初始化对象 函数名和类名相同不需要说明返回值类型 不是void 规则 每个类至少有一个构造函数 一个类可以有多个构造函数 如果没有为类定义构造函数 系统会自动为其定义一个缺省的构造函数 不带参数 一旦为类定义了构造函数 则系统不会再为其定义缺省构造函数 classStudent longid chargender intclassID publicStudent id 0 gender F classID 0 publicStudent longaID charaGender intaClassID id aID gender aGender classID aClassID 对象和引用 用类声明的变量不是对象 而是对象引用 简称引用 StudentxiaoZhang 声明一个Student类型的引用声明引用并不创建对象 一个引用占4个字节 相当于对象指针创建对象须使用new运算符 格式是 new类的构造函数 例如 newStudent 创建一个Student对象 无参构造函数newStudent 1 M 2 有参数的构造函数让引用指向对象xiaoZhang newStudent 通过引用访问对象 访问对象成员使用 运算符xiaoZhang id 200328013203194L xiaoZhang changeClass 1 类 对象和引用的声明 声明一个类 class类名 变量声明 方法声明 classStudent longid 学号chargender 性别intclassID 班级号 注意不能用class作属性名voidchangeClass intc 更改班级classID c 声明一个对象引用 类名引用名StudentxiaoZhang 创建一个对象 new类构造函数xiaoZhang newStudent 如果缺少这一步编译器会报错使用对象 引用名 变量名 方法名xiaoZhang id 200328013203194 存储器分配 StudentxiaoZhang 声明一个Student对象引用xiaoZhangxiaoZhang newStudent 创建一个对象先执行newStudent 再执行xiaoZhang xiaoZhangxiaoZhangxiaoZhang id 200328013203194 使用对象xiaoZhang 00000000 00000000 对象析构 Java不支持析构函数 因为Java能够自动收集垃圾 所以不需要人工的内存回收 自动收集垃圾 当对象没有用处后 Java会自动的释放其占用的内存 好处 可靠性提高 使内存管理与类接口设计分离 减少了跟踪内存管理错误的时间 代价 对性能的影响 暂停 配置复杂性和不确定的结束 分代收集 1 2及以后的JDK使用了多种策略混合的垃圾收集方式 称为分代收集 其中根据对象的年龄将堆分为几个部分 不同的代是用不同的收集算法收集的 引用计数 每一个对象都有一个关联的引用计数 对该对象的活跃引用的数量 如果对象的引用计数是零 那么它就是垃圾 跟踪收集器 从根集开始沿着引用跟踪 直到检查了所有可到达的对象 可以在程序注册表中 每一个线程堆栈中的 基于堆栈的 局部变量中以及静态变量中找到根 参数传递 Java语言在参数传递中只支持值传递方式如果方法的参数是基本数据类型 8个 在方法内改变形参的值不影响方法外的实参的值 如果方法的参数是对象引用 在方法内通过形参改变对象的内容 方法退出后实参指向的对象的内容也改变 因为形参和实参指向的是同一个对象 voidinc intn n intx 5 inc x x classCount intn voidinc Countc c n Countx newCount x n 5 inc x x n 引用与对象的内存分配 StudentxiaoMing newStudent StudentxiaoFang newStudent xiaoMing gender M xiaoFang gender F 说明 结果xiaoMing gender为 M 因为引用xiaoMing和xiaoFang指向不同的对象 xiaoMing xiaoFang 的结果为false 此时对象相等的判断应该用equals方法 两个引用指向不同的对象 StudentxiaoMing newStudent StudentxiaoFang xiaoMing xiaoMing gender M xiaoFang gender F 说明 结果xiaoMing gender为 F 因为引用xiaoMing和xiaoFang指向同一个对象 xiaoMing xiaoFang 的结果为true xiaoMing equals xiaoFang 结果也为true 两个引用指向同一个对象 原始数据类型的内存分配 intxiaoMing 100 intxiaoFang xiaoMing xiaoFang 200 说明 结果xiaoMing为100 因为原始数据类型不存在指向同一个对象的问题 xiaoMing xiaoFang 的结果为false 参数传递的例子 方法的参数是引用时 形参是对象引用的复制品 通过形参访问的和实参访问的是同一个对象 方法的参数是基本数据类型时 形参是实参的一个复制品 classStudent intjavaScore classJavaClass score StudentaStudent intaScore aStudent为引用型aStudent javaScore aScore aScore 100 Students1 newStudent JavaClassc1 newJavaClass intx 90 c1 score s1 x s1 javaScore值为100 x的值还是90 变量和作用域 局部 local 变量 在一个方法内定义的变量 也被称作自动 automatic 临时 temporary 或栈 stack 变量 局部变量只在方法内部起作用 当一个方法被执行时 局部变量被创建 当一个方法被终止时 局部变量被清除 局部变量必须使用之前初始化 否则编译时将出错 方法 包括构造函数 的入口参数是局部变量 实例变量 在方法外而类的内部定义的变量 在使用newXxxx 调用构造一个对象时被创建 类的实例变量有默认的初始值 可以不用显式初始化 booleanfalseChar u0000 null float0 0fdouble0 0dbyte byte 0short short 0int0long0L局部变量可以取消非局部变量的作用方法内声明的局部变量与类变量或实例变量可以重名 此时缺省为局部变量 若要使用类变量或实例变量 应使用this关键字 变量作用域举例 classStudent longid chargender intclassID voidchangeClass intclassID this classID classID inty 0 for intx 0 x 10 x y x for intx 0 x 100 x y x 实例变量 局部变量 类的管理 当程序中的类非常多时 特别是由多人合作开发时 如何管理类 需要解决类名冲突的问题 有没有类似的问题 包 定义 Java允许把多个类收集在一起成为一组 称为包 用来管理类 目的 便于组织类 使自己的类和他人提供的类分离 避免命名冲突 还可以提高编译速度 分级 包可以嵌套 从而分成层次 如java util 类似于硬盘上的目录组织 一可以使每个包中的类不至于过多 二可以保证类名的唯一性 Java库中的包 标准Java库被分成许多包 并且分层 所有的包都在java和javax包层次中 package 声明包 关键字package将源文件中的所有类添加到一个包中 如果源文件中没有package语句 那么此文件的所有类将被放到默认的包中 默认的包没有包名 类的完整名称 包层次 类名school Student执行类的命令 javaschool StudentJDK1 2以后的版本拒绝加载用户定义的以java 开始的类 以防止对java类库的恶意改写 Student javapackageschool publicclassStudent classCourse package语句必须放在源文件的头部 在所有的类定义代码之前 包名称全部采用小写字符 类的可见性 将类组织到包中 那么类就有可见性的问题 类声明时可以使用public说明可见性 或者不使用可见性说明 默认为friendly 不允许使用其他修饰符 public可见的类对包外是可见的 可以被其他包中的类使用 friendly可见的类是包内可见的 只能被本包中的类使用 每个源文件中只有主类 与源文件同名的类 能够是public的 import 引入包 使用包 一个类可以使用自己所在包中的所有类 也可以使用来自其他包中的所有public类 使用其他包中的public类有两种方式 类名前加上完整的包名 如 java util Datetoday newjava util Date 使用import关键字 import的作用是给出一个指向此包中的类的快捷方式 import可以引入某个特定的类importjava util Date Datetoday newDate import也可以引入包中的所有类importjava util Datetoday newDate 注意 只能用 来引入一个包中的所有类 并不能嵌套引入下层包 例如 不能使用importjava 或者importjava 引入所有包 只能引入类 不能引入对象 如不能用importSystem out Java缺省自动引入java lang包中所有类 相当于importjava lang 同名类的问题 问题 两个不同包中含有同名类 如java util包和java sql包中都有一个Date类 下面的程序会出现编译错误 因为编译器不知道使用哪个Date类 importjava util importjava sql Datetoday 编译错误解决方法 用一条特定的import语句指明用哪个类 importjava util importjava sql importjava util Date Datetoday 编译错误若两个Date类都要使用 则只能在每个类前面加上完整的包名 java util Datetoday newjava util Date java sql DatesqlDate newjava sql Date 类文件的管理 类 class 文件的存放位置要和类所在的包对应将包层次对应到文件目录层次例如 zzk school Student类应存放到zzk school目录下执行命令 从当前目录开始查找相应的子目录和文件javazzk school Student命令 需要从当前目录能够找到zzk school Student class文件 这是一种相对位置 源代码文件的存放位置如果类A中用到了另一个类B 那么编译A时 编译器需要访问B的class文件 或者找到B的源文件也行 此时编译器会先编译B 所以一般情况下 java源代码文件的存放位置也会和类的包层次对应 编译命令 编译zzk school Student java文件 需要在zzk的上层目录执行命令javaczzk school Student java 虚拟机如何定位类 虚拟机需要某个类时 需要找到该类文件 class文件 以及该类用到的其他的类 类被存储在文件系统的子目录中 路径必须与所在包名相匹配 例如 javahello Hello 调用虚拟机 类所在的包 类名 packagehello publicclassHello 调用Java虚拟机时命令行所在的目录 类文件的位置 classpath环境变量 可以使用java命令的 classpath选项设置类的查找路径 可以简写为 cp 多个路径之间用 隔开 如 java classpath helloHello Java虚拟机在加载类的时候以这样一种方式查找具体的类文件 classpath 包存储的目录 具体的类文件 如classpath中有一个c java classdir条目 需要加载的类是hello Hello class 在加载这个类的时候 虚拟机会查找c java classdir hello 目录 如果Hello class在这个目录中 虚拟机就可以找到 如果这个类不在这个目录中 同时也不在任何一个其它classpath中 那么虚拟机会抛出一个ClassNotFoundException 也可以将多个类文件及其目录结构保存在一个jar文件中 虚拟机查找类的路径顺序 虚拟机寻找类文件所使用路径的顺序 首先自动搜索jre lib和jre lib ext目录下的rt jar和其他的jar文件 然后依次搜索 classpath中说明的路径 注 查找文件时使用以包名为相对路径的文件名 例如importhello Hello对于当前目录来说就是查找hello Hello class文件 Classpath的顺序和类版本冲突Java虚拟机在加载类的时候查找classpath是有顺序的 如果在classpath中有多个条目都有同一个名称的类 那么在较前位置的类会被加载 后面的会被忽略 这种按照顺序的类加载可能会导致类的版本冲突 很多时候如果不注意这一点 可能会导致奇怪的异常 编译器如何定位类 编译器在采用与虚拟机同样的查找文件方式之外 还要多做一些事情 确定对象所属的确切类 如果源代码中使用了一个对象 而没有明确指出类所在的包 那么编译器要检查所有import语句确定类所在的包 如果发现两个包中都有同名的类 则报告编译错误 检查源文件是否有更改 编译器找到类 class 文件后 还要找到源文件 java 并比较两个文件的最后更新时间 若源文件比类文件新 则要重新编译源文件生成类文件 编译器与虚拟机如何定位类 编译器查找路径与虚拟机查找路径的区别 编译器总是查找当前目录 而虚拟机只有在类路径中包含当前目录 的情况下才查找当前目录 如果没有设置类路径 缺省的类路径中包含当前目录 这就是说 使用javac会搜索当前目录下是否有需要的文件 但是java cpdirHello则只搜索 dir目录下是否有Hello class文件 而不搜索当前目录 编译器只从当前目录下的类开始编译 如果Hello java不放在当前目录而是放在classpath目录 那么javacHello java将找不到文件 如果Hello java在当前目录下 而Hello类中用到的其他类放在classpath目录中 则编译可以通过 相反 java命令则可以执行不在当前目录下的类 设置CLASSPATH变量 Java和javac命令都有 classpath选项 但是如果每次使用都需要设置类路径 会非常冗长麻烦 因此 Java提供了另外一种选择 设置CLASSPATH环境变量 Win95 98 ME下 编辑autoexec bat文件 添加一行SETCLASSPATH c java classdir 注意不要落了分号后面表示当前目录的点号 号两边不要有空格 WinNT 2000 XP下 控制面板 系统 高级 环境变量 在用户环境变量或者系统环境变量中添加一项 变量名称为CLASSPATH 值为c java classdir UNIX Linux下 编辑shell的启动文件 若使用CShell 则向位于主目录的 cshrc文件中添加一行 setenvCLASSPATH home user classdir 若使用bash 则向位于主目录的 bash profile文件中添加一行 exportCLASSPATH home user classdir 源文件与类文件的存放 目录结构 开发时 源文件 java 和类文件 class 一般放在相同目录下 便于编译和执行 发布时 如果源代码不需要保密 那么存放格式和开发时相同 如果源代码不希望给别人看到 或者程序不希望别人改动 那么按照相同的目录结构只提供类文件即可 单个类 若只在某个特定程序中使用的类 把类放在当前目录下 若需要在多个程序中共享使用的类 把类放在一个或多个特定目录下 并按包的层次组织文件和目录层次 例如 可以每个用户一个目录 将这些保存共享源文件和类文件的目录添加到CLASSPATH环境变量中 作业 实验内容 第一步 设计四个类Student类属性包括 姓名 分数 级别 Teacher类setScore Studentstudent Floatscore 设置student的分数 同时调用Rank类的rank方法评级 Rank类rank Studentstudent 根据student的分数评级为A B C D ETest类main方法 创建一个Student对象 一个Teacher对象 并用Teacher对象为Student对象设置分数第二步 将四个类放入包中 Student Teacher和Rank类放入一个包 命名为 你的姓名拼音 schoolTest类放入以你的姓名拼音命名的包中 即上面三个类的上一层 感谢 本课程全部ppt和源代码可以从 网上课堂 下载
展开阅读全文
相关资源
正为您匹配相似的精品文档
相关搜索

最新文档


当前位置:首页 > 图纸专区 > 课件教案


copyright@ 2023-2025  zhuangpeitu.com 装配图网版权所有   联系电话:18123376007

备案号:ICP2024067431-1 川公网安备51140202000466号


本站为文档C2C交易模式,即用户上传的文档直接被用户下载,本站只是中间服务平台,本站所有文档下载所得的收益归上传人(含作者)所有。装配图网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。若文档所含内容侵犯了您的版权或隐私,请立即通知装配图网,我们立即给予删除!