面向对象PartJava.ppt_第1页
面向对象PartJava.ppt_第2页
面向对象PartJava.ppt_第3页
面向对象PartJava.ppt_第4页
面向对象PartJava.ppt_第5页
已阅读5页,还剩241页未读 继续免费阅读

下载本文档

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

文档简介

1 面向对象程序设计 ForJAVA 教材 JAVA语言导学出版 机械工业出版社编著 MaryCampione KathyWalrathet al参考文献 JAVA语言程序设计 基础篇编著 Y DanielLiang出版 机械工业出版社 2 第11章Java起步 3 Java简史 Internet迅猛发展Java语言正式问世被美国著名杂志PCMagazine评为1995年十大优秀科技产品之一 JamesGosling领导的Green小组开发了面向数字家电的Oak语言 推出了Java2平台 性能上有所提高 而且对Java的基本模式进行了完善 并提供了更为丰富的API 1991 1995 1998 4 Java2版本划分 5 Java语言主要特性 WriteOnceRunAnywhere JVM 在语言级支持多线程 C 必须第三方库 取消了多重继承 指针 自动地内存垃圾回收 分布式 Java程序可以在多台机器上协同计算 RMI 动态性 JVM的ClassLoader支持类的动态装载 甚至允许动态地重新装入已修改的代码 同时应用程序继续执行 反射机制 可靠性 由于取消指针 内存自动回收 使得程序更为健壮 安全性 ClassLoader将类装载入JVM运行前会进行安全检查 用户可以配置安全策略 6 Java程序及其运行机制 Java虚拟机 在真实机器中用软件模拟实现的一种抽象的机器 Java虚拟机规范 负责解释和执行Java程序编译后产生的字节码 JavaAPI是Java系统提供的预先定义好的软件组件的集合 它们提供许多可供程序员调用的常用功能丰富的API为程序员提供了极大的方便 但也是学习的难点 7 Java语言规范 API JDK IDE Java语言规范 JavaLanguageSpecification JLS Java语言的语法和语义技术性定义 应用程序接口 ApplicationProgramInterface API Java预定义类和接口 Java开发工具包 JavaDevelopmentKit JDK 包含软件库 编译器 解释器以及其它工具 集成开发环境 IntegratedDevelopmentEnvironment IDE 在图形界面中 完成编辑 编译 调试和在线帮助等功能 8 JavaAPI手册及JDK 9 Java程序运行机制 操作系统 源代码 可执行代码 目标码 编译 连接 运行 源代码 字节码 编译 解释执行 Java解释器 传统语言的运行机制 Java语言的运行机制 10 Java程序类型 Java应用程序 JavaApplication 是独立完整的程序在命令行调用独立的解释器软件即可运行主类必须有main方法 这也是程序的入口Java小程序JavaApplet 是指在浏览器里运行的Java小程序 一般来说客户端是指用户所使用的浏览器 JavaServlet 是在服务器端执行的Java程序 为了能够支持Servlet的运行 服务器端必须安装包含Java虚拟机的服务器软件 Tomcat WebLogic WebSphere 这种能够支持服务端小程序的服务器一般被称为应用服务器 Servlet容器 11 Java开发环境 JDK J2SDK JavaDeveloperKit JDK1 2 J2SDK1 3 J2SDK1 4 JDK5 0 J2SDK1 5 JDK6 0Java集成开发环境 IDE VisualJ 不再支持 不要使用 NetBeansJBuilderEclipseWSAD JCreator 建议开始不要使用IDE 使用JDK 通过命令行方式编译和运行Java程序 不要过度依赖IDE 12 JDK的安装与设置 从 13 Java运行环境配置 建议创建一个批处理文件 bat文件 在批处理文件里设置环境变量rem假设JDK安装在D JDK6目录下setJAVA HOME D JDK6 binsetpath path JAVA HOME setclasspath classpath E ch05 bin 14 Java实用程序简介 javac Java编译器 将Java源代码编译为字节码 java Java解释器 用来解释执行Java程序的字节码文件 class appletviewer 小程序浏览器 一种执行HTML文件上的Java小程序类的Java浏览器 javadoc 根据Java源代码及其说明语句生成的HTML文档 jdb Java调试器 可以逐行地执行程序 设置断点和检查变量 javah 产生可以调用Java过程的C过程 或建立能被Java程序调用的C过程的头文件 Javap Java反汇编器 显示编译类文件中的可访问功能和数据 同时显示字节代码含义 所有这些命令可以列出帮助信息command help 15 编辑源代码 一般情况下 我们可以使用系统平台下的任何文本编辑器进行源代码的编辑 在Windows平台下常用的是Window系统自带的 记事本 程序或 写字板 程序Java源码大小写敏感Java源码文件的扩展名 javaJava源程序文件也不能随意命名 其文件名必须与程序中主类 public 的类名完全相同 包括大小写在内一个Java源文件里只能有一个public类 16 创建 编译和执行Java程序 创建和编辑源代码可以使用任何文本编译器创建和编辑源代码 文件名必须与公共的类名一致 文件后缀为 java编译在控制台中执行 javac源文件名生成 class字节码文件执行在控制台中执行 java类名 17 MyFirstJavaApp java 注意类名和文件名相同 含main的类必须用public Java也支持多行注释 包含在 中的为javadoc注释 在每个包 Package 每个类 及属性方法前加上javadoc注释可以自动生成基于HTML的帮助文档packageCh11 defineapackagecontainingalldemosourcecodeofchapter11 TheMyFirstJavaAppclassimplements ansimpleapplicationthatdisplay HelloWorld totheconsole authorXiwuGu publicclassMyFirstJavaApp paramargs commandlinearguments publicstaticvoidmain String args JAVA是纯OOP 没有全局函数 main也必须 封装在类里System out println HelloWorld out是System的类变量 静态数据成员 PrintStream类型 println是out的方法 18 编译JAVA程序 设置好path及classpath在JAVA源文件所在目录下输入javacMyFirstJavaApp java在当前目录下会生成MyFirstJavaApp class可以指定输出的 class文件保存的目录javacMyFirstJavaApp java dbin 将输出的 class文件保存在当前目录的子目录bin下 19 运行Java程序 要执行一个Java程序非常简单 只需在字节码文件所在目录下输入下列命令就可以了 java字节码文件名注意不要 class后缀 20 Suggestionfordevelopingprogrammingskill Thebestwaytostartprogrammingistohaveaterminalrunninganinteractivelanguageandafriendsittingnearbywhoalreadyknowsthelanguageandhassomethingelsetodobutcanbeinterruptedwithquestions Andyoujusttrystuff tillmoreandmoreyougetthefeelofit Andyoufindyourselfwritingprogramsthatwork Nelson Ted ComputerLib MicrosoftPress 1987 21 第12章面向对象编程 22 面向对象的编程概念 对象和类类和对象的UML表示面向过程vs面向对象消息继承接口 23 什么是对象 对象 软件对象 是变量和相关方法的软件组合 是对现实世界世界对象的抽象对象具有状态和行为同一类对象的行为一致 但状态不同 24 什么是类 类 class 定义了同一类对象共有的属性和方法 类是对象的模板 蓝图 对象是类的实例 25 类的示例 下面是一个圆类 classCircle doubleradius 1 0 Circle radius 1 0 Circle doubler radius r doublefindArea returnradius radius 3 14159 数据字段 方法 构造函数 Circle c1radius 1 0 Circle c2radius 10 0 Circle c3radius 15 0 26 类和对象的UML表示 类的UML表示 类名 数据字段 方法 对象的UML表示 对象名 类名 数据字段值 构造函数 27 面向过程vs面向对象 面向过程以数据结构来描述问题以过程 函数 来描述算法数据结构和算法是分离的 不易维护及软件复用面向对象数据结构及算法描述被封装在类里用类的继承来实现软件复用支持多态只要接口不变 父类的具体实现改变了不会影响子类 易于维护 28 消息及其组成 消息的发送者A及目的对象B希望对象B要执行的方法的名称 ChangeGears方法所需参数 lowerGear 汽车 驾驶员 ChangeGears lowerGear 单独的一个对象没什么作用 一个复杂的软件系统的功能通过多个对象间的交互实现 对象之间的交互是通过相互发送消息实现的 当对象A 驾驶员 希望对象B 汽车 执行时方法 切换到低档 时 对象A发送消息给对象B 消息包括 消息发送具体实现 在对象A的某个方法里调用对象B的ChangeGears lowerGear 29 继承 继承是子类能自动地共享父类中定义的数据和方法的机制 30 单重继承和多重继承 单重继承 一个子类只有一个直接父类多重继承 一个子类可以有多个直接父类JAVA只支持单重继承JAVA继承都是public继承 因此在JAVA术语里只有子类 父类 没有基类和派生类 java lang Object类是所有JAVA类的祖先类 31 接口 interface 接口interface也是一种类 包含常量和方法的定义 无论如何 接口定义的所有变量都是publicstaticfinal类型 所有方法都是publicabstract方法 注意 abstract方法即C 的纯虚函数 因此 接口相当于抽象类 不能拥有对象 接口是无关对象进行彼此交互的协议 无关对象是指在类的层次结构中没有相关性 32 接口示例 publicinterfaceFlyer voidtakeOff voidland voidfly classAirplaneimplementsFlyer publicvoidtakeOff 加速直到离地升空 收起起落架 publicvoidland 放下起落架 减速并降低副翼直到降落 刹车 publicvoidfly 保持引擎运转 接口方法的访问Flyerf newAirPlane f takeOff f fly f land 33 接口和继承 34 接口 Java类可以实现多个接口 若要能产生实例对象 则必须覆盖定义每个接口的函数 接口中的常量也可以被隐藏 可使用接口名限定访问被隐藏的接口常量 如果类被定义为public的 通常要求存储在与类同名的Java文件 35 Main java 因classMain为public的interfaceI1 ints 1 t 2 缺省是且只能是publicstaticfinal的intf 缺省是publicabstract interfaceI2 ints 1 缺省是且只能是publicstaticfinal的intf 缺省是publicabstract classTestimplementsI1 I2 intt 隐藏了I1 注意这里的t是实例变量publicintf returnI1 t I2 s publicclassMain publicstaticvoidmain String args 36 Java程序结构 Java程序由若干包构成 可以使用无名的缺省包 JAVA里的包作用相当于C 的namespace包由package定义 包由一系列的类和接口构成同一个包不能定义同名类和接口 一个包可以引用其它包定义的公共类和接口 import 包必须和目录名建立对应 而类名则和该目录下的java文件的主文件名对应 程序的入口main函数必须位于一个public类中main 且main函数必须在类中必须是publicstatic的 37 第13章Java语言基础 38 数据类型 原子类型和引用类型 原子类型为值类型 39 原子类型 类型char 采用unicode编码 每字符2字节类型byte 一字节有符号整型类型short 两字节有符号整型类型int 4字节有符号整型类型long 8字节有符号整型类型float 4字节单精度浮点数类型double 8字节双精度浮点数类型boolean 1字节布尔类型 实际使用1位二进制 常量有true和false整数常量后带L或l表示long类型 浮点数后带D或d表示双精度浮点数 带F或f表示单精度浮点数 40 引用类型 相当于C 的指针类型 在堆上上分配内存 但内存分配与回收由java自己完成由class interface和数组构成的类型都是引用类型与C 指针不同的是 每次访问Java的引用类型变量时 访问的是 相当于C 指针所指向的 存储单元的值或内容 所有引用类型都是从Object对象派生的 引用类型变量必须用new进行实例化 即在堆上分配内存和调用构造函数初始化 Objectx newObject 原子类型自动在栈上分配内存 只需要初始化 例如 intx 3 41 原子类型变量 值类型 和引用类型变量的区别 变量表示存储数据的内存单元 原子类型变量存储的是原子类型的值 引用类型变量存储的是对象的引用 当变量未引用任何对象时 它是值为null 42 标识符 Java中使用标识符 identifier 来命名变量 常量 方法 类 包等实体 标识符命名规则标识符是由字母 数字 下划线 美元符号 组成的字符序列 标识符必须以字母 下划线 美元符号 开头 不能以数字开头 标识符不能是保留字 标识符不能为true false或null 标识符可以为任意长度 43 Java保留字 44 变量名 变量名使用合法的表示符做变量名称 变量名可以被对象名 类名中或包名 类名限定 必要时要多级限定 如类变量System out java lang Math PI 这类变量叫成员变量 局部变量通常指的是函数中声明的变量 其作用范围就是该函数 成员变量是指类的成员 可分为类变量和实例变量 实例变量必须依赖于对象的存在而存在 在类的函数成员以外访问时 通常需要实例变量是可见的 且需要使用 对象 实例变量 进行限定访问 只读变量使用final关键字声明 finaldatatypeCONSTANT NAME value 约定 变量名 方法名以小写字母开始 若后面连接单词 则单词首字母大写 如radius getRaidus 常量全部使用大写字母 约定 类名每个单词的首字母大写 如AirPlane 45 运算符 operator 包括单目 双目和三目的 三目运算符为 算术运算符 单目 双目 单目 也分前置和后置 其意义和C 一致但 不允许出现在 左边如 i 1 错关系运算符 op2 op1右移op2位 左边填符号位 即最高位 op1 op2 op1右移op2位 左边填0 46 运算符 位逻辑运算符 按位与 按位或 按位求反 按位异或 位逻辑运算符只能用于整数类型 byte short int long 赋值及简捷赋值运算符 Java要求赋值运算符左边必须是变量 不能是表达式 算术简写 位简写 移位简写 三目运算符 数组下标运算符 成员访问运算符 对象创建运算符 newRTTI类型识别运算符 instanceof函数调用运算符 以逗号分开的参数列表 强制类型转换运算符 目标类型 47 运算符 JAVA里布尔值的结果为true和false 而不像C 是0或1 并且不能将其他类型强制转换为布尔类型instanceof用于判定前一个变量 或对象 是否为后面的类型 类 的实例 48 表达式 expression 表达式由字面量 literal 变量 操作符和方法调用构成 用于求出单个值Java的表达式没有C 的左值概念 表达式求值 evaluate 要注意操作符优先级和结合性 见书P62表20 49 语句 statements 语句是完整的可执行单元 以分号结束以下表达式加上 就成为了语句赋值表达式 方法调用对象创建表达式 new表达式 Java的语句基本同C 除异常可有finally外 无论出现异常与否 都必须执行finally的部分 C 实际上也有 不过保留字为 finally 条件语句 if if else if elseif switch循环 while do while for异常处理 try catch finally 50 第14章对象基础和简单数据对象 51 对象的生命周期 对象的生命周期 创建 使用 清除 52 对象的创建 创建 类型名引用变量 new类名 构造器的参数 必须用new创建 new会自动地调用类的构造函数 一个类可以定义多个重载的构造器 如果new创建的对象没有赋给任何变量 该对象除当时访问外 将无法在以后访问 构造器没有返回类型 构造器的名字与类名相同 即使将返回类型说明为void 也会导致其成为非构造函数 每个Java类 不含接口 都至少有一个构造器 如果类没有显示定义 系统会默认地为该类提供一个不包含任何参数的无参构造器 53 对象的创建 CirclemyCircle newCircle 1 声明一个引用变量 变量类型为Circle 变量名为myCircle 2 创建对象 返回对象的引用 3 将对象的引用赋值给变量myCircle 以上语句等价于 CirclemyCircle 声明一个Circle类型的引用 变量 其值为null 称为空引用myCircle newCircle 创建对象 并将 该对象的引用赋给myCircle 使myCircle引用被创建的对象 null 引用类型CirclemyCircle myCircle 对象的引用 myCircle newCircle myCircle 54 对象的使用 对象的使用有两种方式 操作或者检查它的变量 数据成员 调用它的方法要使用对象的实例成员 首先要得到该对象的引用 对于基于RMI的分布式对象 可以通过名字透明地得到一个运程对象的引用 屏蔽了网络协议 网络地址 端口号等细节 当获得一个对象 不管是本地的还是运程的 的引用后 就可以访问对象的属性或调用其方法 55 对象的使用 类的成员分两种 实例成员与类成员 实例成员包括实例变量与实例方法实例成员依赖于实例 即对象 存在 同一个类的不同实例都拥有一份实例变量的拷贝 对某个实例变量的操作不影响到其它实例变量 实例变量与对象生命周期一样 随对象的创建而创建 随对象的消亡而消亡 必须通过实例的引用来调用实例方法 所谓的依赖 类成员包括类变量与类方法类成员不依赖于实例存在 无任何对象时也可访问 即值已存在 同一个类的不同实例共享同一个类变量 对类变量的改变会影响所有实例 类变量的生存期不依赖于对象 其它类可以不用通过该类的实例 直接通过类名就访问它们 同样 类方法也可直接通过类名访问 56 实例变量与静态变量 实例变量 instancevariable 未用static修饰的成员变量 属于类的具体实例 对象 只能通过引用变量访问 即 对象名 变量名 类变量 staticvariable 是用static修饰的变量 在一个类的所有实例间共享 也称类变量 静态变量可以通过类名访问 即类名 变量名 也可用对象名访问 二个对象的radius实例变量存储于不同空间 彼此不影响 所有对象共享静态成员变量存贮在公共内存某个对象对其修改会影响其他对象 57 静态常量 静态常量是用staticfinal修饰的变量 例如 Math类中的常量PI定义为 publicstaticfinaldoublePI 3 14159265358979323846 58 类方法 类方法 staticmethod 是用static修饰的方法 例如 mainMath random类方法可以通过类名和对象名调用 类方法只能访问类的静态成员 不能访问类中的实例成员 59 实例方法 实例方法 staticmethod 是没有用static修饰的方法 实例方法只能通过对象名 引用 调用 实例方法可以访问类的静态成员和实例成员 60 成员的访问 实例成员通过对象限定使用 类成员可通过类名限定使用 也可通过对象限定使用 提倡用第一种使用形式 classTest 等价于classTestextendsObject 即Test继承自Object对象 intt staticintw 3 定义及初始化wpublicTest intx t x 在构造函数中初始化w与否根据需要确定 注意JAVA在类的定义结束后不要 同时JAVA类的方法都必须在类体里实现publicclassMain publicstaticvoidmain String args Testx newTest 3 inty x t t的访问权限不是private 是defaulty x w 不提倡以这种形式使用 为什么 y Test w 61 Object对象 所有类都直接或间接继承自Object类 Object为父类 所有可实例化类的内存管理都是由Object通过引用计数完成的 A继承自B的关系使用extends说明 如classAextendsB 子类在其构造器的第一条语句缺省调用父类无参构造函数 如果子类中没有显式地调用父类的构造函数 编译器会自动地在子类构造函数第一条语句前加上super 也可以显示地调用 必须是子类构造函数的第一条语句 62 Object对象 Object对象负责了对象内存管理 包括垃圾自动回收 Object类定义了所有类都必须有的基本状态和行为 clone 对象克隆 缺省是浅拷贝 一般需要覆盖 finalize 相当于析构 equals 比较二个对象是否相等 hashCodetoString 将对象转换为字符串 getClass 得到一个对象的类别信息 RTTI notify notifyAll以及wait 线程同步 其中clone finalize的访问权限是protected 其它为public 此外 getClass notify notifyAll及wait被定义为final方法 不能被子类覆盖 63 classA Object对象负责管理内存 通过对象的引用次数判定内存可否回收intx publicA intx this x x publicclassMain 注意生命期和作用域的不一致staticAf Aa newA 3 Ab a Ac newA 4 returna 对象2生命起止在f内publicstaticvoidmain String args Ax f f返回 c的作用域结束导致对象2的引用计数为0 f返回 a b的作用域结束 返回值赋给x 导致对象1引用计数为1 main返回 x的作用域结束对象1的引用计数 0 64 对象的生命周期 由于JAVA在对象的引用计数 0时才清除对象 导致作用域和生命周期的不一致 在上例中 引用a的作用域在f内 但a引用的对象的生命周期在函数f结束后还没结束这是JAVA和C 的一个重要区别 C 如果函数返回一个引用 该引用了函数内的局部对象 则函数返回的引用引用的是一个失效的对象 编译没问题 但会产生runtimeerror JAVA 函数返回一个引用可以引用函数内生成的对象 函数返回后通过该引用还是可以访问该对象 因为该对象的生命周期没结束 65 finalize 方法 finalize 方法在Object中有缺省实现 在用户自定义的类中 它可以被覆盖 但一般在最后要调用父类的finalize 方法 来清除对象所使用的所有资源 相当于C 的析构函数 在对对象进行垃圾收集前 Java运行时系统会自动调用对象的finalize 方法来释放系统资源 注意 finalize 是protected 不可在类外通过对象进行调用 在变量的生命期结束时 例如前例中的变量c 系统并不一定马上调用垃圾收集程序 即与C 的析构函数立即执行有所不同 某些情况下 程序员可能需要实现finalize 方法来释放不由垃圾收集器所控制的资源 例如 需要关闭对象打开的文件 考虑到finalize 只在垃圾收集前被调用 而垃圾收集可能被延迟 在急需关闭文件以供其它任务打开时 最好强制系统进行垃圾收集 即调用System gc 从而引起finalize 执行 一般情况下 如果自定义的对象仅使用了内存 而且不是通过native函数 例如通过C Java不自动回收C 分配的内存 申请的 就没有必要自己实现finalize 方法 66 对象相等的判定 用来判定是否引用同一个对象 如上例中判定a b的结果为true 如果存在另一个对象Ad newA 3 判定a d 则结果为false 即两个对象的地址不同 Object提供了函数equals 来判断对象是否相等 但其实现是比较二个引用是否指向同一个对象 因此往往需要在自定义类型中覆盖该函数 一般来说 如果自定义类型中包含了引用类型的实例变量 成员 则需要覆盖equals hashCode clone 缺省行为是浅拷贝赋值 toString 通常是必须覆盖的 用于将当前对象转化为可打印的字符串 67 Object类的equals方法 Object是所有Java类的祖先类 它实现了一些有用的方法 如前面介绍的eauals方法publicbooleanequals Objectobject 检验两个对象是否相等语法 object1 equals object2 该方法只是比较二个引用变量是否相等 即object1和object2是否指向同一个对象 而不是比较二个引用变量指向的对象的内容是否相等 所以子类很有必要覆盖该方法 classCircle privatedoubleradius 1 0 Circle Circle doubler radius r publicbooleanequals Objecto if oinstanceofCircle returnthis radius Circle o radius elsereturnfalse 例如二个Circle对象 如果半径相等就相等 我们可以在Circle类里覆盖该方法 68 Object类中的clone方法 protectedObjectclone 复制对象 缺省为浅拷贝 对象引用变量的赋值是不能复制对象的 要创建有单独内存空间的新对象 使用clone 方法newobject someobjet clone newobject someobject子类要实现clone方法 首先应该实现Cloneable接口 同时覆盖从Object类继承的clone方法 并将该方法改为public 69 Object类中的toString方法 publicStringtoString 返回代表这个对象的字符串 Object类的默认实现是返回由 包名 类名 hashCode组成 Circlecircle newCircle circle toString Circle 15037e5Object的toString方法提供的信息不是很有用 因此通常子类应该覆盖该方法 提供更有意义的信息 classCircle privatedoubleradius 1 0 Circle Circle doubler radius r publicStringtoString return Acirclewithradius radius 字符串 数值结果为字符串 70 简单数据对象 除了提供原子类型如char int等原子类型外 Java还提供了这些类型的包装类 Wrapper 如Character Integer等 作用包装提供了额外的信息 例如通过Integer类型 我们能够获知最小或最大的整数值是多少 由值类型变成了引用类型 用于需要对象引用的场合 比如函数需要引用参数voidswap inti1 inti2 callbyvaluevoidswap Integero1 Integero2 callbyref这些类还定义了一些有用的方法 用于将值转换为其他类型 转换为字符串等等 BigInteger和BigDecimal从精度上扩展了原始数据类型 这些类可用于反射 Reflection 反射机制允许程序收集JVM中任何对象或类的信息 71 简单数据对象 Number Byte Short Integer Long Float Double Character Boolean Object 每个Wrapper类对应一种原子数据类型 每个Wrapper类实现了接口Comparable BigInteger BigDecimal 72 包装类的构造函数 构造函数以一个对应的基本数据类型为参数以字符串为参数 除了Character 如Integer类和Double类的构造函数如下 publicDouble doublevalue publicDouble Stringvalue 例如DoubledoubleObject newDouble 5 0 DoubledoubleObject newDouble 5 0 包装类没有无参构造方法 73 数值包装类的常量 每一个数值包装类都有常量MAX VALUE和MIN VALUE MAX VALUE对应本数据类型的最大值 对Byte Short Integer和Long MIN VALUE对应最小值对Float和Double MIN VALUE对应最小正值如System out println Themaximumintegeris Integer MAX VALUE System out println Theminimumpositivefloatis Float MIN VALUE 74 从包装类对象 基本数据类型 Byte Short Integer Long Float Double类都分别实现方法byteValue shortValue intValue longValue floatValue doubleValue 这些方法原型如下publicbytebyteValue Byte类实例方法publicshortshortValue Short类实例方法publicintintValue Integer类实例方法publiclonglongValue Long类实例方法publicfloatfloatValue Float类实例方法publicdoubledoubleValue Double类实例方法如inti newInteger 10 intValue 另外每个类的toString 方法将数值转换成字符串 75 字符串转换成数值 Byte Short Integer Long Float DoublepublicstatictypeparseType Strings publicstatictypeparseType Strings intradix 如inti Integer parseInt 11 2 3inti Integer parseInt 12 8 10inti Integer parseInt 1A 16 26doubled Double parseDouble 3 14 3 14 76 静态方法valueOf 该方法创建一个新的对象 并将它初始化为指定字符串的值如 DoubledoubleObject Double valueOf 12 4 IntegerintegerObject Integer valueOf 12 77 基本类型与包装类之间的自动转换 JDK1 5允许基本类型和包装类之间的自动转换 将基本类型的值转换为包装类对象 称为装箱 boxing 将包装类对象转换为基本类型的值 称为开箱 unboxing IntegerintObject 2 装箱IntegerintObject1 2 intObject2 3 inti intObject1 开箱 78 数据的格式化 高级算术功能 自学 79 字符 字符串对象 JavaAPI提供了三个处理字符数据的类 Character String StringBuffer String是一个finalclass 不能被其它类继承 Character用于处理单个字符 String用于处理字符串常量 而StringBuffer用于可变字符串的处理 80 Character类 Character类的作用将char类型的数据封装成对象包含处理字符的方法和常量Character char 构造函数静态方法isDigit方法判断一个字符是否是数字isLetter方法判断一个字符是否是字母isLetterOrDigit方法判断一个字符是否是字母或数字isLowerCase方法判断一个字符是否是小写isUpperCase方法判断一个字符是否是大写toLowerCase方法将一个字符转换成小写toUpperCase方法将一个字符转换成大写 81 Character类 实例例方法compareTo Character 比较两个字符对象包含的值 该实例方法返回一个整数值 表示当前对象中的值是大于 等于还是小于参数所包含的值 equals Object 比较当前对象包含的值与参数对象包含的值 如果两个对象包含的值相等 那么这个实例方法返回true Character类覆盖了该方法 因此比较的是对象的内容 toString 这个实例方法将当前对象转换为字符串 charValue 这个实例方法以原始char值的形式返回当前字符对象包含的值 82 Character类示例 Charactera newCharacter a Characterb newCharacter b intdiff pareTo b 比较大小 1booleanb1 a equals b falseStrings a toString a booleanb2 Character isDigit a falseCharacterc Character toUpperCase b B booleanb3 Character isUpperCase c truecharc a charValue 83 字符串 String Java提供两个类用于存储和操作字符串String用于其值不能改变的字符串StringBuffer用于可被修改的字符串由于String对象存贮的是不可变的字符串 因此比StringBuffer更高效 对于程序任何位置出现的双引号标记的字符串常量 系统都会自动创建一个String对象 相同字符串常量仅建立一个共享对象 可通过String对象的方法对字符串常量进行操作 84 String的构造函数很多 85 创建字符串对象 第一种方法是用new运算符如 StringstrRef newString stringLiteral Stringmessage newString WelcometoJava 调用String String 构造函数 这种方法不推荐第二种方法是直接用赋值形式StringstrRef stringLiteral 如 Stringmessage WelcometoJava 但 这二种方法有着本质的不同 第二种方法效率高的多 86 二种方式的区别 对于程序任何位置出现的双引号标记的字符串常量 系统都会自动创建一个String对象 因此Stringmessage newString WelcometoJava 实际上创建了另一个完全相同的对象 而且需要调用构造函数 其过程为 1 以字符串对象 WelcometoJava 为参数调用构造函数String String 产生新的字符串对象 2 将新对象的引用赋给引用变量message WelcometoJava WelcometoJava newString message 87 二种方式的区别 Stringmessage WelcometoJava 由于字符串常量 WelcometoJava 已经是一个字符串对象 因此上面的语句的语义是将对象 WelcometoJava 的引用赋值给message 导致message也该对引用了该对象这个过程中没有调用构造函数产生新的第二个字符串对象 WelcometoJava message 88 小测试 代码1Stringsa newString Helloworld Stringsb newString Helloworld System out println sa sb 代码2Stringsc Helloworld Stringsd Helloworld System out println sc sd false true 相同字符串常量仅建立一个共享对象 89 字符串 String 对任何可包装类型如Character String等的常量 其常量对象 字面量 Literal 的引用被共享 地址相同 Characterc1 a a 为Character类型的字面量 常量 Characterc2 a System out println c1 c2 trueIntegerintObj1 1 1为Integer类型的字面量 常量 IntegerintObj2 1 System out println intObj1 intObj1 true可通过String对象的方法对字符串常量进行操作 如 inti Hello length 5 90 String对象是不可变的 字符串对象创建之后 其内容是不可修改的 Strings abc s s defg System out println s 程序运行的结果是什么 abcdefg s的内容不是改变了吗 不是s的内容变了 而是s引用了新的字符串对象 91 调用intlength 方法可以获取字符串的长度 Stringmessage WelcometoJava message length 返回15charcharAt index 方法可以获取指定位置的字符 index的值必须在0到length 1之间 message charAt 0 返回字符 W 字符串长度和获取单个字符 92 截取子串 substring用于截取字符串的一部分 返回新字符串 publicStringsubstring intbeginIndex intendIndex 返回字符串的子串 子串从beginIndex开始 直到endIndex 1publicStringsubstring intbeginIndex 返回字符串的子串 子串从beginIndex开始 直到字符串的结尾 Strings message subString 0 11 s内容为 Welcometo Strings message subString 11 s内容为 Java 93 搜索字符或子字符串 String类提供的indexOf 和lastIndexOf 方法返回字符串中特定字符或子字符串在字符串中的位置 indexOf 返回字符或字串第一次出现的位置索引值lastIndexOf 返回字符或字串最后一次出现的位置索引值 94 搜索字符或字符串 indexOf返回字符串中字符或字符串匹配的位置 返回 1表示未找到 WelcometoJava indexOf W returns0 WelcometoJava indexOf x returns 1 WelcometoJava indexOf o 5 returns9 WelcometoJava indexOf come returns3 WelcometoJava indexOf Java 5 returns11 WelcometoJava indexOf java 5 returns 1 WelcometoJava lastIndexOf a returns14 95 比较字符串 booleanequals Object 方法用于比较两个字符串是否包含相同的内容 两个字符串内容相同 返回true两个字符串内容不同 返回falsebooleanequalsIgnoreCase String 忽略大小写比较内容是否相同booleanstartsWith String 判断是否以某个字符串开始booleanendsWith String 判断是否以某个字符串结束 96 比较字符串 booleanregionMatch booleanignoreCase intthisOffset Stringother intotherOffset intlen 比较部分内容是否相同boolean 是否忽略大小写thisOffset 要比较的this字符串从索引thisOffset开始比较other 要比较的另外一个字符串otherOffset 要比较的other字符串从索引otherOffset开始比较len 要比较的字符数intcompareTo String 方法用于比较两个字符串的大小 即第一个不同字符的差值 pareTo s2 的返回值 当两个字符串相同时 返回 当s1按字典排序在s2之前 返回小于 的值当s1按字典排序在s2之后 返回大于 的值 97 比较字符串 Strings0 Java Strings1 Welcometo s0 Strings2 WelcometoJava Strings3 welcometojava booleanb s1 s2 false 用于比较两个变量是否引用同一个对象b s1 equals s2 true equals用于比较两个字符串的内容是否相同b s2 equals s3 falseb s2 equalsIgnoreCase s3 true equalsIgnoreCase忽略大小写b s2 regionMatches 11 s0 0 4 true regionMatches比较部分字符串b s3 regionMatches 11 s0 0 4 falseb s3 regionMatches true 11 s0 0 4 true 忽略大小写b s2 startsWith s

温馨提示

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

评论

0/150

提交评论