孙鑫JAVA无难事课件整理_第1页
孙鑫JAVA无难事课件整理_第2页
孙鑫JAVA无难事课件整理_第3页
孙鑫JAVA无难事课件整理_第4页
孙鑫JAVA无难事课件整理_第5页
已阅读5页,还剩226页未读 继续免费阅读

下载本文档

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

文档简介

学习Java前的准备工作 主讲人 孙鑫 http www sunxin orgDownload 相关概念 老师 什么是JDK啊 即JavaDevelopKit Java开发工具包 老师 你们讲的是Java1还是Java2 1998年12月 SUN公司发布了JDK1 2 开始使用 Java2 这一名称 目前我们已经很少使用JDK1 1版本 所以我们所说的Java都是指Java2 J2SDK当然就是Java2SoftwareDevelopKit 老师 什么是JRE JRE JavaRuntimeEnvironment 即Java运行环境 通常已包含在J2SDK中了 如果我们仅仅是为了运行Java程序 而不是从事Java开发 我们可以直接下载JRE 在我们的系统上安装 http www sunxin orgDownload Java的开发工具包 JDK J2SE Java2Platform StandardEdition 标准版J2EE Java2Platform EnterpriseEdition 企业版J2ME Java2Platform MicroEdition 精简版 http www sunxin orgDownload J2SEv1 4 2相关下载 Java2Platform StandardEdition v1 4 2 http www sunxin orgDownload Java技术与应用 主讲人 孙鑫 http www sunxin orgDownload Java的起源 Java来自于Sun公司的一个叫Green的项目 其原先的目的是为家用消费电子产品开发一个分布式代码系统 这样我们可以把E mail发给电冰箱 电视机等家用电器 对它们进行控制 和它们进行信息交流 开始 准备采用C 但C 太复杂 安全性差 最后基于C 开发了一种新的语言Oak Java的前身 Oak是一种用于网络的精巧而安全的语言 Sun公司曾以此投标一个交互式电视项目 但结果被SGI打败 可怜的Oak几乎无家可归 恰巧这时MarkArdreesen开发的Mosaic和Netscape启发了Oak项目组成员 他们用Java编制了HotJava浏览器 得到了Sun公司首席执行官ScottMcNealy的支持 触发了Java进军Internet Java的取名也有一则趣闻 有一天 几位Java成员组的会员正在讨论给这个新的语言取什么名字 当时他们正在咖啡馆喝着Java 爪哇 咖啡 有一个人灵机一动说就叫Java怎样 得到了其他人的赞赏 于是 Java这个名字就这样传开了 Java的起源 http www sunxin orgDownload 我们为什么要用Java 因为Java是简单的面向对象的健壮的安全的解释的与平台无关的多线程的动态的语言 http www sunxin orgDownload 我们为什么要用Java 简单的Java最初是为对家用电器进行集成控制而设计的一种语言 因此它必须简单明了 Java语言的简单性主要体现在三个方面 1 Java的风格类似于C 因而C 程序员初次接触Java语言 就会感到很熟悉 从某种意义上讲 Java语言是C及C 语言的一个变种 因此 C 程序员可以很快地掌握Java编程技术 2 Java摒弃了C 中容易引发程序错误的一些特性 如指针 结构 枚举以及内存管理等 3 Java提供了丰富的类库 可以帮助我们很方便的开发Java程序 http www sunxin orgDownload 我们为什么要用Java 面向对象的面向对象可以说是Java最重要的特性 所以它支持继承 重载 多态等面向对象的特性 Java语言的设计是完全面向对象的 它不支持类似C语言那样的面向过程的程序设计技术 http www sunxin orgDownload 我们为什么要用Java 健壮的Java致力于检查程序在编译和运行时的错误 Java也是一种强类型的语言 其类型检查比C 还要严格 类型检查帮助我们检查出许多开发早期出现的错误 Java自己负责内存管理 提供了垃圾内存回收机制 有效的避免了C 中最头疼的内存泄漏问题 http www sunxin orgDownload 我们为什么要用Java 安全的Java的安全性可从两个方面得到保证 一方面 在Java语言里 删除了指针和释放内存等C 功能 避免了非法内存操作 另一方面 通过Java的安全体系架构来确保Java代码的安全性 当我们从网上下载Java代码在本地执行时 Java的安全架构能确保恶意的代码不能随意访问我们本地计算机的资源 例如 删除文件 访问本地网络资源等操作都是被禁止的 http www sunxin orgDownload 我们为什么要用Java 解释的Java代码是解释执行的 我们使用Java编译器将Java代码编译成字节码 这是一种中间代码 然后由Java解释器解释执行 而C 程序是编译执行的 C 程序代码被编译为本地机器指令 然后执行 http www sunxin orgDownload 我们为什么要用Java 与平台无关的Java作为一种网络语言 其源代码被编译成一种结构中立的中间文件格式 只要有Java运行系统的机器都能执行这种中间代码 Java源程序被编译成一种与机器无关的字节码格式 在Java虚拟机上运行 http www sunxin orgDownload 我们为什么要用Java 多线程的Java语言的一个重要特性就是在语言级支持多线程的程序设计 多线程就好像我们做一张桌子 如果你一个人完成这张桌子 就好像单线程 那么你需要先做桌面 做完桌面后 再做4个桌子腿 如果现在有5个人来做桌子 在程序中开辟5个线程 其中1个人做桌面 另外4个人分别做4个桌子腿 那么这两种方式效率的高低 相信大家都能区分出来 http www sunxin orgDownload 我们为什么要用Java 动态的Java的动态特性是其面向对象设计方法的扩展 它允许程序动态地装入运行过程中所需要的类 这是我们采用C 语言进行面向对象程序设计所无法实现的 在C 程序设计过程中 每当在类中增加一个实例变量或一个成员函数后 引用该类的所有子类都必须重新编译 否则将导致程序崩溃 Java从以下几个方面采取措施来解决这个问题 Java编译器不是将对实例变量和成员函数的引用编译为数值引用 而是将符号引用信息在字节码中保存下来 传递给解释器 再由解释器在完成动态连接类后 将符号引用信息转换为数值偏移量 一个在存储器中生成的对象不在编译过程中决定 而是延迟到运行时由解释器确定 这样 对类中的变量和方法进行更新时就不至于影响现存的代码 解释执行字节码时 这种符号信息的查找和转换过程仅在一个新的名字出现时才进行一次 随后代码便可以全速执行 在运行时确定引用的好处是可以使用已被更新的类 而不必担心会影响原有的代码 如果程序连接了网络中另一系统中的某一类 该类的所有者也可以自由地对该类进行更新 而不会使任何引用该类的程序崩溃 Java还简化了使用一个升级的或全新协议的方法 如果你的系统运行Java程序时遇到了不知怎样处理的程序 Java能自动下载你所需要的功能程序 http www sunxin orgDownload Java跨平台的原理 Java的跨平台是通过Java虚拟机 JVM JavaVirtualMachine 来实现的 http www sunxin orgDownload Java跨平台的原理 Java源文件的编译过程Java应用程序的开发周期包括编译 下载 解释和执行几个部分 Java编译程序将Java源程序翻译为JVM可执行代码 字节码 这一编译过程同C C 的编译有些不同 当C编译器编译生成一个对象的代码时 该代码是为在某一特定硬件平台运行而产生的 因此 在编译过程中 编译程序通过查表将所有对符号的引用转换为特定的内存偏移量 以保证程序运行 Java编译器却不将对变量和方法的引用编译为数值引用 也不确定程序执行过程中的内存布局 而是将这些符号引用信息保留在字节码中 由解释器在运行过程中创建内存布局 然后再通过查表来确定一个方法所在的地址 这样就有效的保证了Java的可移植性和安全性 http www sunxin orgDownload Java跨平台的原理 Java解释器的执行过程运行JVM字节码的工作是由解释器来完成的 解释执行过程分三步进行 代码的装入 代码的校验和代码的执行 装入代码的工作由 类装载器 classloader 完成 类装载器负责装入运行一个程序需要的所有代码 这也包括程序代码中的类所继承的类和被其调用的类 当类装载器装入一个类时 该类被放在自己的名字空间中 除了通过符号引用自己名字空间以外的类 类之间没有其他办法可以影响其它类 在本台计算机上的所有类都在同一地址空间内 而所有从外部引进的类 都有一个自己独立的名字空间 这使得本地类通过共享相同的名字空间获得较高的运行效率 同时又保证它们与从外部引进的类不会相互影响 当装入了运行程序需要的所有类后 解释器便可确定整个可执行程序的内存布局 解释器为符号引用同特定的地址空间建立对应关系及查询表 通过在这一阶段确定代码的内存布局 Java很好地解决了由超类改变而使子类崩溃的问题 同时也防止了代码对地址的非法访问 随后 被装入的代码由字节码校验器进行检查 校验器可发现操作数栈溢出 非法数据类型转换等多种错误 通过校验后 代码便开始执行了 http www sunxin orgDownload Java跨平台的原理 Java字节码的两种执行方式1 即时编译方式 解释器先将字节码编译成机器码 然后再执行该机器码 2 解释执行方式 解释器通过每次解释并执行一小段代码来完成Java字节码程序的所有操作 通常采用的是第二种方法 由于JVM规格描述具有足够的灵活性 这使得将字节码翻译为机器代码的工作具有较高的效率 对于那些对运行速度要求较高的应用程序 解释器可将Java字节码即时编译为机器码 从而很好地保证了Java代码的可移植性和高性能 http www sunxin orgDownload Java跨平台的原理 JVM规格描述JVM的设计目标是提供一个基于抽象规格描述的计算机模型 为解释程序开发人员提供很好的灵活性 同时也确保Java代码可在符合该规范的任何系统上运行 JVM对其实现的某些方面给出了具体的定义 特别是对Java可执行代码 即字节码 Bytecode 的格式给出了明确的规格 这一规格包括操作码和操作数的语法和数值 标识符的数值表示方式 以及Java类文件中的Java对象 常量缓冲池在JVM的存储映象 这些定义为JVM解释器开发人员提供了所需的信息和开发环境 Java的设计者希望给开发人员以随心所欲使用Java的自由 JVM是为Java字节码定义的一种独立于具体平台的规格描述 是Java平台独立性的基础 http www sunxin orgDownload Java跨平台的原理 Java程序执行与C C 程序执行的对比分析如果把Java源程序想象成我们的C 源程序 Java源程序编译后生成的字节码就相当于C 源程序编译后的80 x86的机器码 二进制程序文件 JVM虚拟机相当于80 x86计算机系统 Java解释器相当于80 x86CPU 在80 x86CPU上运行的是机器码 在Java解释器上运行的是Java字节码 Java解释器相当于运行Java字节码的 CPU 但该 CPU 不是通过硬件实现的 而是用软件实现的 Java解释器实际上就是特定的平台下的一个应用程序 只要实现了特定平台下的解释器程序 Java字节码就能通过解释器程序在该平台下运行 这是Java跨平台的根本 当前 并不是在所有的平台下都有相应Java解释器程序 这也是Java并不能在所有的平台下都能运行的原因 它只能在已实现了Java解释器程序的平台下运行 http www sunxin orgDownload Java开发工具包 JDK 的下载 下载网址 http www sunxin orgDownload Java的面向对象编程 主讲人 孙鑫 http www sunxin orgDownload 面向对象编程概述 简单的说 面向对象编程 ObjectOrientedProgramming 简称OOP 描述的是对象之间的相互作用 面向对象编程与面向过程编程的区别 过程化程序设计先确定算法 再确定数据结构 面向对象编程先确定数据结构 再确定运算 面向过程编程的程序员 习惯于建立数据结构存放数据并定义方法 函数 来操作数据 面向对象编程的程序员则构造一个对象模型 将数据与方法组织在一起 http www sunxin orgDownload 对象对象的状态对象的行为 我们可以把现实世界的事物抽象成对象 对象一般都有两个特征 状态 state 和行为 behavior 软件的对象概念是由现实世界对象抽象而来 把现实世界对象的状态保存在软件对象的变量中 现实世界对象的行为通过软件对象的方法 函数 来实现 http www sunxin orgDownload 类和对象 把相似的对象划归成一个类 在软件中 类 就是一个模板 它定义了通用于一个特定种类的所有对象的状态 变量 和行为 方法 类是创建对象的模板 对象是类的实例 http www sunxin orgDownload 面向对象程序设计 从程序设计的角度看 类是面向对象程序中最基本的程序单元 类实质上定义的是一种数据类型 这种数据类型就是对象类型 所以我们可以使用类名称来声明对象变量 声明对象变量之后 还不能使用对象 必须用运算符new创建对象实体之后 才能使用对象 http www sunxin orgDownload 面向对象编程的难点 掌握面向对象的困难之处在于思路的转换 我们通常习惯于考虑解决问题的方法 而不是考虑将问题抽象成对象再去解决它 http www sunxin orgDownload 一个简单的例子 编写一个驾驶汽车的方法面向过程的程序设计 编写一个方法 voiddrivecar 面向对象的程序设计 将一辆汽车看成一个对象 将所有汽车对象的共性抽取出来 设计一个类Car 类中有一个方法voiddrive 用Car这个类实例化一个具体的对象car 调用 car drive http www sunxin orgDownload 类的构造方法 构造方法的名字和类名相同 并且没有返回值 构造方法主要用于为类的对象定义初始化状态 我们不能直接调用构造方法 必须通过new关键字来自动调用 从而创建类的实例 Java的类都要求有构造方法 如果没有定义构造方法 Java编译器会为我们提供一个缺省的构造方法 也就是不带参数的构造方法 http www sunxin orgDownload new关键字的作用 为对象分配内存空间 引起对象构造方法的调用 为对象返回一个引用 http www sunxin orgDownload 缺省构造方法 当我们用缺省的构造方法初始化对象时 系统用默认值初始化对象的成员变量 各种数据类型的默认值为 数值型0booleanfalsechar 0 对象null http www sunxin orgDownload 方法的重载 overload 重载构成的条件 方法的名称相同 但参数类型或参数个数不同 才能构成方法的重载 http www sunxin orgDownload 特殊变量this this变量代表对象本身当类中有两个同名变量 一个属于类 类的成员变量 而另一个属于某个特定的方法 方法中的局部变量 使用this区分成员变量和局部变量 使用this简化构造函数的调用 http www sunxin orgDownload 特殊变量this 关于实例方法和实例数据成员的进一步说明一个类所有的实例 对象 调用的成员方法在内存中只有一份拷贝 尽管在内存中可能有多个对象 而数据成员在类的每个对象所在内存中都存在着一份拷贝 this变量允许相同的实例方法为不同的对象工作 每当调用一个实例方法时 this变量将被设置成引用该实例方法的特定的类对象 方法的代码接着会与this所代表的对象的特定数据建立关联 http www sunxin orgDownload 关键字static 静态方法和静态变量是属于某一个类 而不属于类的对象 静态方法和静态变量的引用直接通过类名引用 在静态方法中不能调用非静态的方法和引用非静态的成员变量 反之 则可以 可以用类的对象obj去调用静态的方法method 如 obj method http www sunxin orgDownload 常量的定义 使用关键字final定义常量 例如 finaldoublePI 3 1415926 作为一种约定 在定义常量时 通常采用大写形式 final常量可以在声明的同时赋初值 也可以在构造函数中赋初值 为了节省内存 我们通常将常量声明为静态的 static http www sunxin orgDownload 类的继承 理解继承是理解面向对象程序设计的关键 在Java中 通过关键字extends继承一个已有的类 被继承的类称为父类 超类 基类 新的类称为子类 派生类 在Java中 不允许多继承 http www sunxin orgDownload 方法的覆盖 override 在子类中定义一个与父类同名 返回类型 参数类型均相同一个方法 称为方法的覆盖 覆盖发生在子类与父类之间 http www sunxin orgDownload 特殊变量super 特殊变量super 提供了对父类的访问 可以使用super访问父类被子类隐藏的变量或覆盖的方法 每个子类构造方法的第一条语句 都是隐含地调用super 如果父类没有这种形式的构造函数 那么在编译的时候就会报错 http www sunxin orgDownload 多态性 通过覆盖父类的方法来实现 在运行时根据传递的对象引用 来调用相应的方法 http www sunxin orgDownload 面向对象的程序设计 问题 求一个长方形的周长和面积 以面向过程的程序设计方式思考 1 确定长方形周长和面积的算法 2 编写两个方法 函数 分别计算长方形的周长和面积 3 求周长的方法 函数 和求面积的方法 函数 需要两个参数 分别是长方形的长和宽 http www sunxin orgDownload 面向过程的程序设计代码 classRectangle staticintperimeter intlength intwidth return2 length width staticintarea intlength intwidth returnlength width publicstaticvoidmain String args System out println perimeter Rectangle perimeter 5 4 System out println area Rectangle area 5 4 http www sunxin orgDownload 面向对象的程序设计 问题 求一个长方形的周长和面积 以面向对象的程序设计方式思考 1 一个长方形可以看成一个长方形对象 2 一个长方形对象有两个状态 长和宽 和两个行为 求周长和求面积 3 将所有长方形的共性抽取出来 设计一个长方形类 4 通过长方形对象的行为 就可以求出某个具体的长方形对象的周长和面积 http www sunxin orgDownload 面向对象的程序设计 Demo http www sunxin orgDownload 位运算 主讲人 孙鑫 http www sunxin orgDownload 计算机中数据的表示方法 计算机是一种电子设备 由复杂的电子元器件组合而成 一个电子元器件有带电和不带电两种状态 通常我们将带电状态表示为数值1 不带电状态表示为数值0 多个这样的元器件的组合可以表示更多状态 也就是可以表示更多的数据 如000表示0 001表示1 010表示2 011表示3 依此类推 111表示7 一个元器件可表示一位 bit 数据 这种表示数据的方式就叫二进制 在实际的电子设备中 我们将8个这样的元器件形成一个单元 这样的单元叫一个字节 byte 一个字节能表示多少个数呢 表示数值的范围是0 255 一个字节由8个二进位组成 其中最右边的一位称为 最低有效位 或 最低位 最左边的一位称为 最高有效位 或 最高位 每一个二进位的值是0或1 http www sunxin orgDownload 计算机中数据的表示方法 二进制计数的缺点 书写太长 容易出错 一般计算机的数据位数都是4的整数倍 所以 在计算机里通常采用16进制计数法 用数字可以表示各种信息 计算机里只有数值 当你在内存中看到一个数值时 这个数值可能代表各种意义 生活中的数值也可以代表其他意义 如1234可以代表密码 存款额 电报信息 根据上下线索 我们就能够知道这数值代表的意义 http www sunxin orgDownload 原码 反码和补码 原码将最高位作为符号位 以0代表正 1代表负 其余各位代表数值本身的绝对值 以二进制表示 为了简单起见 我们用1个字节来表示一个整数 7的原码为 00000111 7的原码为 10000111问题 0的原码为 00000000 0的原码为 10000000 http www sunxin orgDownload 原码 反码和补码 反码一个数如果为正 则它的反码与原码相同 一个数如果为负 则符号位为1 其余各位是对原码取反 为了简单起见 我们用1个字节来表示一个整数 7的反码为 00000111 7的反码为 11111000问题 0的反码为 00000000 0的反码为 11111111 http www sunxin orgDownload 原码 反码和补码 补码利用溢出 我们可以将减法变成加法 对于十进制数 如果从9得到结果5 可以用减法 9 4 5因为4 6 10 我们将6作为4的补数 将上式的减法改写为加法 9 6 15去掉高位1 也就是减去10 得到结果5 对于16进制数 如果从C得到结果5 可以用减法 C 7 5因为7 9 16 我们将9作为7的补数 将上式的减法改写为加法 C 9 15去掉高位1 也就是减去16 得到结果5 http www sunxin orgDownload 原码 反码和补码 补码在计算机中 如果我们用1个字节表示一个数 一个字节有8位 超过8位就进1 在内存中情况为 100000000进位1被丢弃 http www sunxin orgDownload 原码 反码和补码 1 11111001 补码一个数如果为正 则它的原码 反码 补码相同 一个数如果为负 则符号位为1 其余各位是对原码取反 然后整个数加1 为了简单起见 我们用1个字节来表示一个整数 7的补码为 00000111 7的补码为 第 步11111000第 步 http www sunxin orgDownload 原码 反码和补码 补码0的补码表示 0的补码 00000000 0的补码 第 步11111111第 步进位1被丢弃 1 100000000 第 步 http www sunxin orgDownload 原码 反码和补码 补码已知一个负数的补码 将其转换为十进制数 步骤 1 先对各位取反 2 将其转换为十进制数 3 加上负号 再减去1 例如 11111010 最高位为1 是负数 先对各位取反得00000101 转换为十进制数得5 加上负号得 5 再减1得 6 http www sunxin orgDownload 位运算符 为了方便对二进制位进行操作 Java给我们提供了四个二进制位操作符 按位与 按位或 按位异或 按位取反 http www sunxin orgDownload 位运算符 按位与一个房间里有两个开关控制房间的灯的明暗 当两个开关同时处于打开状态时 灯才能亮 开关1开关2灯的状态关关暗开关暗关开暗开开亮 http www sunxin orgDownload 位运算符 按位与011011010011011100100101结论 按位与 只有壹 1 壹 1 为1 http www sunxin orgDownload 位运算符 按位或一个房间里有两个开关控制房间的灯的明暗 当任何一个开关处于打开状态时 灯就能亮 开关1开关2灯的状态关关暗开关亮关开亮开开亮 http www sunxin orgDownload 位运算符 按位或011011010011011101111111结论 按位或 只有零 0 零 0 为0 http www sunxin orgDownload 位运算符 按位异或一个房间里有两个开关控制房间的灯的明暗 当两个开关处于不同状态时 灯就能亮 开关1开关2灯的状态关关暗开关亮关开亮开开暗 http www sunxin orgDownload 位运算符 按位异或011011010011011101011010结论 按位异或 只有零 0 壹 1 或壹 1 零 0 为1 http www sunxin orgDownload 位运算符 按位取反 0110110110010010结论 对二进制数按位取反 即0变成1 1变成0 http www sunxin orgDownload 移位运算符 Java中有三个移位运算符左移 无符号右移 http www sunxin orgDownload 移位运算符 数xx 2x 21700010001000100010000000100010000010001 17111011111110111100 数xx 2x 21700010001000100010000000100010000010001 1711101111111011110011111011110011101111 http www sunxin orgDownload 练习 将一个整数110从右端开始的4 7位变为0 http www sunxin orgDownload Lesson3 主讲人 孙鑫 http www sunxin orgDownload 主要内容 包类的说明符方法的说明符对象的销毁 垃圾内存回收的演示 接口内部类和匿名内部类异常处理 http www sunxin orgDownload 包 package 为了便于管理大型软件系统中数目众多的类 解决类命名冲突的问题 Java引入了包 package http www sunxin orgDownload 包 package package语句必须是文件中的第一条语句 也就是说 在package语句之前 除了空白和注释之外不能有任何语句 如果不加package语句 则指定为缺省包或无名包 包对应着文件系统的目录层次结构 在package语句中 用 来指明包 目录 的层次 http www sunxin orgDownload 编译并生成包 在当前目录下生成包javac d Test java在指定目录下生成包javac dE JavaLessonTest java http www sunxin orgDownload import语句 引入包中的类 importjava io File 引入整个包 importjava io 在同一包中的类可以互相引用 无需import语句 http www sunxin orgDownload 类的说明符 类的访问说明符 1 public 2 default 不加访问说明符时 类的其它修饰符 1 final 2 abstract http www sunxin orgDownload 方法的说明符 方法的访问说明符 1 public 2 protected 3 default 不加访问说明符时 4 private方法的其它修饰符 1 static 2 final 3 abstract 4 native 5 synchronized http www sunxin orgDownload 方法的访问控制 不同情形下 访问说明符 http www sunxin orgDownload 方法的访问控制 不同情形下 访问说明符 http www sunxin orgDownload 方法的访问控制 不同情形下 访问说明符 http www sunxin orgDownload 方法的访问控制 不同情形下 访问说明符 http www sunxin orgDownload 方法的访问控制 不同情形下 访问说明符 http www sunxin orgDownload final方法 为了确保某个函数的行为在继承过程中保持不变 并且不能被覆盖 overridden 可以使用final方法 为了效率上的考虑 将方法声明为final 让编译器对此方法的调用进行优化 要注意的是 编译器会自行对final方法进行判断 并决定是否进行优化 通常在方法的体积很小 而我们确实不希望它被覆盖时 才将它声明为final class中所有的private和static方法自然就是final http www sunxin orgDownload 抽象方法和抽象类 在类中没有方法体的方法 就是抽象方法 含有抽象方法的类 即为抽象类 如果一个子类没有实现抽象基类中所有的抽象方法 则子类也成为一个抽象类 我们可以将一个没有任何抽象方法的类声明为abstract 避免由这个类产生任何的对象 构造方法 静态方法 私有方法 final方法不能被声明为抽象的方法 http www sunxin orgDownload native方法 native方法是用户在Java中可以使用 但不能编写的方法 JNI JavaNativeInterface 它允许Java虚拟机 JVM 内部运行的Java代码能够与用其它编程语言 如C C 汇编语言 编写的应用程序和库进行互操作 JNI最大的好处是它没有对底层Java虚拟机的实现施加任何限制 因此 Java虚拟机厂商可以在不影响虚拟机其它部分的情况下添加对JNI的支持 程序员只需编写一种版本的本地 Native 应用程序和库 就能够与所有支持JNI的Java虚拟机协同工作 JNI可以理解为Java和本地应用程序之间的中介 http www sunxin orgDownload 接口 接口中所有的方法都是publicabstract 在接口中声明方法时 不能使用native static final synchronized private protected等修饰符 和public类一样 public接口也必须定义在与接口同名的文件中 http www sunxin orgDownload 接口 接口中可以有数据成员 这些成员默认都是publicstaticfinal http www sunxin orgDownload Math javainterfaceMath doublePI 3 1415926 classArithmeticimplementsMath doubleroundArea doubleradius returnPI radius radius classStudent publicstaticvoidmain String args Arithmetica newArithmetic System out println a roundArea 3 System out println Math PI okSystem out println Arithmetic PI okSystem out println a PI ok 接口 一个接口可以继承自另一个接口 Java中不允许类的多继承 但允许接口的多继承 http www sunxin orgDownload Sofa javainterfaceSittable voidsit interfaceLie voidsleep interfaceChairextendsSittable interfaceSofaextendsSittable Lie http www sunxin orgDownload 接口 在Java中 一个类可以实现多个接口 一个类在继承另外一个类的同时 可以实现多个接口 http www sunxin orgDownload Sofa java 实现多个接口interfaceSittable voidsit interfaceLie voidsleep classSofaimplementsSittable Lie publicvoidsit publicvoidsleep http www sunxin orgDownload Sofa java 在继承类的同时 实现多个接口interfaceSittable voidsit interfaceLie voidsleep interfaceHealthCare voidmassage classChairimplementsSittable publicvoidsit classSofaextendsChairimplementsLie HealthCare publicvoidsleep publicvoidmassage 内部类 在一个类中定义另外一个类 这个类就叫做内部类或内置类 innerclass 内部类可以让我们将逻辑上相关的一组类组织起来 并由外部类 outerclass 来控制内部类的可见性 当我们建立一个innerclass时 其对象就拥有了与外部类对象之间的一种关系 这是通过一个特殊的thisreference形成的 使得内部类对象可以随意的访问外部类中所有的成员 http www sunxin orgDownload classOuter privateintindex 100 voidprint Inneri newInner i print classInner voidprint System out println index classTest publicstaticvoidmain String args Outero newOuter o print o this i main o print i print this 栈内存 堆内存 Outer类对象 Inner类对象 Outer this http www sunxin orgDownload 内部类 在方法中定义的内部类 如果要访问方法中定义的本地变量或方法的参数 则变量必须被声明final 内部类可以声明为private或protected 还可以声明为abstract或final 内部类可以声明为static的 但此时就不能再使用外部类的非static的成员变量和非static的成员方法 非static的内部类中的成员不能声明为static的 只有在顶层类或static的内部类中才可声明static成员 http www sunxin orgDownload 内部类 我们为什么使用内部类1 在内部类 innerclass 中 可以随意的访问外部类的成员 这可以让我们更好地组织管理我们的代码 增强代码的可读性 2 内部类可以用于创建适配器类 适配器类是用于实现接口的类 使用内部类来实现接口 可以更好地定位与接口关联的方法在代码中的位置 3 内部类的更多用法 http www sunxin orgDownload 异常类的层次结构 http www sunxin orgDownload 异常处理 打开一个不存在的文件 网络连接中断 数组下标越界 正在加载的类文件丢失等都会引发异常 Java中的异常类定义了程序中遇到的轻微的错误条件 Java中的错误类定义了程序中不能恢复的严重错误条件 如内存溢出 类文件格式错误等 这一类错误由Java运行系统处理 不需要我们去处理 http www sunxin orgDownload 异常处理 Java程序在执行过程中如出现异常 会自动生成一个异常类对象 该异常对象将被提交给Java运行时系统 这个过程称为抛出 throw 异常 当Java运行时系统接收到异常对象时 会寻找能处理这一异常的代码并把当前异常对象交给其处理 这一过程称为捕获 catch 异常 如果Java运行时系统找不到可以捕获异常的方法 则运行时系统将终止 相应的Java程序也将退出 try catch finally语句 http www sunxin orgDownload 异常处理 对于RuntimeException 通常不需要我们去捕获 这类异常由Java运行系统自动抛出并自动处理 如果父类中的方法抛出多个异常 则子类中的覆盖方法要么抛出相同的异常 要么抛出异常的子类 但不能抛出新的异常 注 构造方法除外 我们可以在方法声明时 声明一个不会抛出的异常 Java编译器就会强迫方法的使用者对异常进行处理 这种方式通常应用于abstractbaseclass和interface中 http www sunxin orgDownload Java编程规范 package的命名package的名字由全部小写的字母组成 例如 cn mybole class和interface的命名class和interface的名字由大写字母开头而其他字母都小写的单词组成 例如 Person RuntimeException class变量的命名变量的名字用一个小写字母开头 后面的单词用大写字母开头 例如 index currentImage class方法的命名方法的名字用一个小写字母开头 后面的单词用大写字母开头 例如 run getBalance staticfinal变量的命名staticfinal变量的名字所有字母都大写 并且能表示完整含义 例如 PI PASSWORD 参数的命名参数的名字和变量的命名规范一致 数组的命名数组应该总是用这样的方式来命名 byte buffer http www sunxin orgDownload 附 JVM规格描述 JVM定义了控制Java代码解释执行和具体实现的五种规格JVM指令系统JVM寄存器JVM栈结构JVM碎片回收堆JVM存储区 http www sunxin orgDownload 附 JVM规格描述 JVM指令系统JVM指令系统同其他计算机的指令系统极其相似 Java指令也是由操作码和操作数两部分组成 操作码为8位二进制数 操作数紧随在操作码的后面 其长度根据需要而不同 操作码用于指定一条指令操作的性质 在这里我们采用汇编符号的形式进行说明 如iload表示从存储器中装入一个整数 anewarray表示为一个新数组分配空间 iand表示两个整数的 与 ret用于流程控制 表示从对某一方法的调用中返回 当长度大于8位时 操作数被分为两个以上字节存放 JVM采用了 bigendian 的编码方式来处理这种情况 即高位bits存放在低字节中 这同Motorola及其他的RISCCPU采用的编码方式是一致的 而与Intel采用的 littleendian 的编码方式即低位bits存放在低位字节的方法不同 Java指令系统是以Java语言的实现为目的设计的 其中包含了用于调用方法和监视多线程系统的指令 http www sunxin orgDownload 附 JVM规格描述 JVM寄存器所有的CPU均包含用于保存系统状态和处理器所需信息的寄存器组 如果虚拟机定义较多的寄存器 便可以从中得到更多的信息而不必对栈或内存进行访问 这有利于提高运行速度 然而 如果虚拟机中的寄存器比实际CPU的寄存器多 在实现虚拟机时就会占用处理器大量的时间来用常规存储器模拟寄存器 这反而会降低虚拟机的效率 针对这种情况 JVM只设置了4个最为常用的寄存器 它们是 pc程序计数器optop操作数栈顶指针frame当前执行环境指针vars指向当前执行环境中第一个局部变量的指针所有寄存器均为32位 pc用于记录程序的执行 optop frame和vars用于记录指向Java栈区的指针 http www sunxin orgDownload 附 JVM规格描述 JVM栈结构作为基于栈结构的计算机 Java栈是JVM存储信息的主要方法 当JVM得到一个Java字节码应用程序后 便为该代码中一个类的每一个方法创建一个栈框架 以保存该方法的状态信息 每个栈框架包括以下三类信息 局部变量执行环境操作数栈局部变量用于存储一个类的方法中所用到的局部变量 vars寄存器指向该变量表中的第一个局部变量 执行环境用于保存解释器对Java字节码进行解释过程中所需的信息 它们是 上次调用的方法 局部变量指针和操作数栈的栈顶和栈底指针 执行环境是执行一个方法的控制中心 例如 如果解释器要执行iadd 整数加法 首先要从frame寄存器中找到当前执行环境 而后便从执行环境中找到操作数栈 从栈顶弹出两个整数进行加法运算 最后将结果压入栈顶 操作数栈用于存储运算所需操作数及运算的结果 http www sunxin orgDownload 附 JVM规格描述 JVM碎片回收堆Java类的实例 对象 所需的存储空间是在堆上分配的 解释器具体承担为类实例分配空间的工作 解释器在为一个实例分配完存储空间后 便开始记录对该实例所占用的内存区域的使用 一旦对象使用完毕 便将其回收到堆中 在Java语言中 除了new语句外没有其他方法为一对象申请和释放内存 对内存进行释放和回收的工作是由Java运行系统承担的 这允许Java运行系统的设计者自己决定碎片回收的方法 在SUN公司开发的Java解释器和HotJava环境中 碎片回收用后台线程的方式来执行 这不但为运行系统提供了良好的性能 而且使程序设计人员摆脱了自己控制内存使用的风险 http www sunxin orgDownload 附 JVM规格描述 JVM存储区JVM有两类存储区 常量缓冲池和方法区 常量缓冲池用于存储类名称 方法和字段名称以及串常量 方法区则用于存储Java方法的字节码 对于这两种存储区域具体实现方式在JVM规格中没有明确规定 这使得Java应用程序的存储布局必须在运行过程中确定 依赖于具体平台的实现方式 http www sunxin orgDownload Lesson4 主讲人 孙鑫 http www sunxin orgDownload 主要内容 Java的常用包 和 equals 的用法基本数据类型与引用类型String和StringBuffer对象的克隆 clone 数组的相关操作封装类Runtime类与Process类Class类设计模式 http www sunxin orgDownload Java的常用包 java applet 包含一些用于创建Java小应用程序的类 java awt 包含一些用于编写与平台无关的图形界面 GUI 应用程序的类 java io 包含一些用作输入输出 I O 处理的类 java lang 包含一些Java语言的基本类与核心类 如Stri

温馨提示

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

评论

0/150

提交评论