《Java开发基础.ppt》由会员分享,可在线阅读,更多相关《Java开发基础.ppt(80页珍藏版)》请在taowenge.com淘文阁网|工程机械CAD图纸|机械工程制图|CAD装配图下载|SolidWorks_CaTia_CAD_UG_PROE_设计图分享下载上搜索。
1、Java开发基础开发基础目录目录u第1章 Java体系结构u第2章 基本程序结构设计u第3章 对象与类u第4章 继承u第5章 接口与内部类u第6章 事件处理u第7章 异常与调试u第8章 流与文件Java体系结构体系结构nJava体系结构包括如下四大类技术:nJava程序设计语言nJava class文件格式nJava APInJava 虚拟机Java体系结构(续)体系结构(续)目录目录u第1章 Java体系结构u第2章 基本程序结构设计u第3章 对象与类u第4章 继承u第5章 接口与内部类u第6章 事件处理u第7章 异常与调试u第8章 流与文件大纲大纲n数据类型n变量n运算符n字符串n注释n输
2、入输出n控制流程n数组数据类型数据类型n数据类型n整型n浮点型nchar型nboolean型TypeTypeStorage RequirementStorage RequirementRangeRangeInt4 bytes2,147,483,648 to 2,147,483,647(just over 2 billion)Short2 bytes32,768 to 32,767Long8 bytes9,223,372,036,854,775,808 to 9,223,372,036,854,775,807Byte1 byte128 to 127TypeTypeStorage Requirem
3、entStorage RequirementRangeRangefloat4 bytesapproximately 3.40282347E+38F(67 significant decimal digits)double8 bytesapproximately 1.79769313486231570E+308(15 significant decimal digits)Char Char:长度:长度 2 2字节无符号整型字节无符号整型 0 655350 65535BooleanBoolean:true true 、falsefalse数据类型数据类型n数据类型操作注意事项n尽量使用适合长度的数
4、据类型操作n尽量使用约定俗成的数据类型做常用操作n注意数据操作时可能发生的数据溢出及除0错误n进行金额操作时避免使用float 和 double,使用无损精度操作的大数值类型 BigInteger 和 BigDecimal变量变量n变量n初始化变量n常量n注意n定义变量时尽量赋予初始化值n变量的命名要简明达意n遵守变量命名的大小写规范n使用合适的描述符,尽可能在使用变量时定义,减小可见性运算符运算符n运算符n算术运算符n自增自减运算符n关系运算符与boolean运算符n位运算符n运算相关注意事项n使用JDK库实现常用算法及函数n数值类型的自动转换规则n强制类型转换及截位n枚举类型的使用字符串字
5、符串n字符串n代码点与代码单元n字符子串与拼接n相等的比较n注意事项n编码转换方法n子串下标计算n拼接的性能nString 方法 intern()的应用注释注释n注释n单行注释n多行注释n文档注释n注意n多行注释不能嵌套n方法及类说明尽量采取文档注释,并标注相关内容(author,see)n除了JDK1.5的标注Annotation外,注释不包括在编译后文件中输入输出输入输出n输入输出nJava 库提供了丰富的IO操作流包括如下:n数据流n文本流n字符流nZip文件流n应用范围n文件管理n网络数据传输n对象序列反序列化n压缩解压等流程控制流程控制n控制流程一n条件控制流程控制流程控制n控制流程
6、二n循环控制流程控制流程控制n控制流程三n多重选择目录目录u第1章 Java体系结构u第2章 基本程序结构设计u第3章 对象与类u第4章 继承u第5章 接口与内部类u第6章 事件处理u第7章 异常与调试u第8章 流与文件大纲大纲n对象构造顺序n方法参数传递:按值调用n类设计基本原则对象构造顺序对象构造顺序n对象构造顺序n类装载时,按类声明中出现的次序执行静态初始化块或静态初始化语句。n对象构造时:n所有数据域初始化为默认值n按类声明中出现的次序执行初始化块或初始化语句。n如果构造器第一行调用了第二个构造器,则跳转到第二个构造器中执行,直到返回。n执行这个构造器的主体部分。n注点事项n对象构造器
7、中显式调用另一构造器时,必须在对象构造器的第一行代码中。对象构造器中显式调用另一构造器时,必须在对象构造器的第一行代码中。n当类声明中同时存在初始化语句与初始化域中,变量初始化的代码的次序至当类声明中同时存在初始化语句与初始化域中,变量初始化的代码的次序至关重要。关重要。大纲大纲n对象构造顺序n方法参数传递:按值调用n类设计基本原则方法参数传递:按值调用方法参数传递:按值调用n一个方法不能修改一个基本数据类型的参数一个方法不能修改一个基本数据类型的参数n一个方法可以改变一个对象参数的状态一个方法可以改变一个对象参数的状态n一个方法不能让对象参数的引用到一个其它对象一个方法不能让对象参数的引用到
8、一个其它对象大纲大纲n对象构造顺序n方法参数传递:按值调用n类设计基本原则类设计基本原则类设计基本原则n类设计的基本原则类设计的基本原则n单一职责原则(单一职责原则(SRP):一个类应该仅有一个引起它变化的):一个类应该仅有一个引起它变化的原因。原因。n开放开放-封闭原则(封闭原则(OCP):一个类对于扩展时开放的,对于更):一个类对于扩展时开放的,对于更改是封闭的。改是封闭的。nLiskov替换原则(替换原则(LSP):子类必须能够替换掉它们的基类。):子类必须能够替换掉它们的基类。n依赖倒置原则(依赖倒置原则(DIP):高层模块不应该依赖于低层模块;抽):高层模块不应该依赖于低层模块;抽象
9、类不应该依赖于其细节,细节。象类不应该依赖于其细节,细节。n接口隔离原则(接口隔离原则(ISP):不应该强迫客户依赖于它们不用的方):不应该强迫客户依赖于它们不用的方法法类设计基本原则(续)类设计基本原则(续)n包设计的基本原则n包内聚性原则(包粒度)n重用发布等价原则(REP):重用的粒度就是发布的粒度。n共同重用原则(CRP):一个包中的所有类应该是共同重用的。如果重用了包中的一个类,那么就要重用包中的所有类。n共同封闭原则(CCP):包中的所有类对于同一类性质的变化应该是共同封闭的。一个变化若对一个包产生影响,则将对该包中的所有类产生影响,而对于其它的包不造成任何影响。n考虑可重用性与可
10、开发性的平衡。n包耦合性原则(包稳定性)n无环依赖原则(ADP):在包的依赖关系图中不允许存在环。n稳定依赖原则(SDP):朝着移定的方向进行依赖。不稳定性I=Ce/(Ca+Ce)n稳定抽象原则(SAP):包的抽象程度应该与其稳定程度一致。抽象度A=Na/Nc目录目录u第1章 Java体系结构u第2章 基本程序结构设计u第3章 对象与类u第4章 继承u第5章 接口与内部类u第6章 事件处理u第7章 异常与调试u第8章 流与文件大纲大纲n继承的介绍nJava 继承的约束n继承的使用n继承与模式n反射n枚举继承的介绍继承的介绍n继承是面向对象编程的一块基石n利用已存在的类,复用这些类的方法和域n利
11、用继承,一些共性的特征可以抽象到超类,子类继承超类实现特有的属性nJava 中所有的对象都继承至 java.lang.Object,因此都拥有toString(),equals(),wait()等方法继承的约束继承的约束n不能实现多继承n父类提供了参数构造函数,子类必须实现n子类不能降低父类方法的可见域n子类不能抛出比父类构造函数或方法更多的异常n子类不能扩展父类的 final 方法继承的使用继承的使用n继承增加了重用代码,减少子类编码n把数据、行为和/或接口的共性尽可能地放到继承层次体系的高端 n继承树的层次不能太深n复杂的继承树提高维护的复杂性n继承树的上层尽量为抽象层n可以提高系统间的松
12、耦合n继承打破了对象的封装n子类可以访问父类的实现,父类的改动将会对子类产生影响n继承的动态绑定可以使程序灵活,更易于扩展n尽量减少定义域对子类可见(final 除外),减少数据被误写入危险,可提供读写方法功子类操作继承与模式继承与模式n模版模式继承与模式继承与模式n抽象工厂模式继承与模式继承与模式n适配器模式继承与模式继承与模式n策略模式 开发相关开发相关nJava 中不允许多继承,但允许实现多个接口nJava中,我们可以声明一个类扩展(extends)另一个类,继承的子类拥有访问超类的 protected 域的权限,并可以覆写已有方法或添加新的方法n继承使用应谨慎,不要滥用继承。反射反射n
13、允许程序在运行时透过Reflection APIs取得任何一个已知名称的class的内部信息,并可于运行时改变fields内容或唤起 methods。n可动态获取的内容包括nmodifiers(诸如public,static)nsuperclass(例如Object)ninterfaces(例如Cloneablenfields和methods等目录目录u第1章 Java体系结构u第2章 基本程序结构设计u第3章 对象与类u第4章 继承u第5章 接口与内部类u第6章 事件处理u第7章 异常与调试u第8章 流与文件大纲大纲n接口与抽象类的选择n克隆及其注意事项n接口与回调n内部类、局部类、匿名类n
14、JDK的Proxy与CGLib的动态代理区别接口与抽象类的选择接口与抽象类的选择n基本原则n正确、合理地理解领域本质与设计意图。n在接口和抽象类的选择上,必须遵守这样一个原则:行为模型应该总是通过接口而不是抽象类定义。n合理理解OCP原则、ISP原则n考虑因素n是否可能被多继承n是否有默认行为n行为集合是否已稳定n“is a”还是“like a”关系大纲大纲n接口与抽象类的选择n克隆及其注意事项n接口与回调n内部类、局部类、匿名类nJDK的Proxy与CGLib的动态代理区别克隆及其注意事项克隆及其注意事项n浅克隆与深克隆n默认实现是浅克隆(本地方法实现)(java.util.Abstract
15、Map默认实现是浅克隆)n如果原始对象与浅克隆对象共享的子对象是不可变的,则不会产生负面问题。n采用序列化方法实现深度克隆,但不推荐。如com.kingdee.util.ObjectUtils.createCopy(Object o)n注意事项n避免死循环n应用单例模式时,需注意屏蔽clone方法大纲大纲n接口与抽象类的选择n克隆及其注意事项n接口与回调n内部类、局部类、匿名类nJDK的Proxy与CGLib的动态代理区别接口与回调接口与回调n回调实现方法n模板方法,如:BOS的Entity方法生成的代码。n注入方式,如:Observer设计模式n动态代理与拦截器方法n注意事项n合理利用接口,
16、避免写僵硬、强藕合代码。n选用合适的回调实现方式,避免写侵入式代码。大纲大纲n接口与抽象类的选择n克隆及其注意事项n接口与回调n内部类、局部类、匿名类nJDK的Proxy与CGLib的动态代理区别内部类、局部类、匿名类内部类、局部类、匿名类n内部类n编译器会为非静态的内部类添加一个对外围类的隐式引用。n内部类是一种编译器现象,与虚拟机无关。n局部类n不能用可见性说明符进行声明。n可访问final类型的局部变量。运行时,虚拟机在方法参数变量释放之前对引用的局部变量进行备份。大纲大纲n接口与抽象类的选择n克隆及其注意事项n接口与回调n内部类、局部类、匿名类nJDK的Proxy与CGLib的动态代理
17、区别JDK的的Proxy与与CGLib的动态代理区别的动态代理区别nJDK的Proxyn只能实现基于接口的代理n一个代理类仅有一个调用处理器(InvoctionHandler)的实例变量n代理类仅覆盖Object类的toString/equals/hashCode方法,其它的方法没有重定义n对于特定的类加载器和给定的一组接口而言,只有一个代理类。n如果代理类实现的所有接口都是public,那代理类不属于特定的;否则,所有非公有的接口都必须属于同一个包,同时,代码类也属于这个包。n存在同签名方法时,接口的顺序至关重要。nCGLibn可以采用实现接口,或继承父类方式实现代理目录目录u第1章 Jav
18、a体系结构u第2章 基本程序结构设计u第3章 对象与类u第4章 继承u第5章 接口与内部类u第6章 事件处理u第7章 异常与调试u第8章 流与文件事件处理事件处理n事件处理与 MVCnModel是代表组件状态和低级行为的部分,它管理着自己的状态并且处理所有对状态的操作 nView代表了管理model所含有的数据的一个视觉上的呈现。一个Model可以有一个以上的View nController管理着model和用户之间的交互的控制。它提供了一些方法去处理当model的状态发生了变化时的情况 n运作时序n按钮 model 保存按钮的内部状态及行为n控制器在发生按钮点击事件后将事件给模型,模型根据行
19、为更新内部状态。控制器通知视图改变按钮的显示n视图根据按钮的模型更新显示事件处理事件处理n事件的继承模型事件处理事件处理n组件的事件处理事件类型监听器适配器ActionEvent ActionListener AdjustmentEvent AdjustmentListener FocusEvent FocusListener FocusAdapter ItemEvent ItemListener KeyEventKeyListener KeyAdapter MouseEventMouseListenerMouseAdapterMouseMotionListenerMouseMotionAda
20、pterMouseWheelEventMouseWheelListenerWindowEventWindowListenerWindowAdapterWindowFocusListenerWindowStateListener目录目录u第1章 Java体系结构u第2章 基本程序结构设计u第3章 对象与类u第4章 继承u第5章 接口与内部类u第6章 事件处理u第7章 异常与调试u第8章 流与文件大纲大纲nError与Exception区别nException处理基本原则nStackOverflowError与OutOfMemoryErrornDebug基本技巧以及如何在Eclipse进行调试nL
21、ogger使用注意事项nAssert使用注意事项Error与与Exception区别区别nErrornError类层次结构描述了Java运行时系统的内部错误和资源耗尽错误。nExceptionnRuntimeException:由程序错误导致的异常nChecked Exception:某些情况下可正确运行,而在某些情况下导致的异常nChecked Exception的审查是编译器行为n出现RuntimeException问题,一定是你的问题Error与与Exception区别区别n常见Errorn常见RuntimeExceptionnClassCastException,IllegalArgu
22、mentException,ArrayIndexOutOfBoundsException,StringIndexOutOfBoundsException,MissingResourceException,NoSuchElementException,NullPointerExceptionError与与Exception区别区别n疑难Error/ExceptionnClassNotFoundExceptionn显式类装载失败nNoClassDefFoundErrorn隐式类装载失败,或初始化失败后置脏nUnsatisfiedLinkError n对于声明为 native 的方法,JVM找不到和
23、它对应的本机语言定义n在Windows系列OS中,多次加载dll。nExceptionInInitializerError n如果初始化器突然完成,抛出一些异常 E,而且 E 的类不是 Error 或者它的某个子类,那么就会创建ExceptionInInitializerError 类的一个新实例,并用 E 作为参数,用这个实例代替 E。nClassCircularityErrorn类或接口由于是自己的超类或超接口而不能被装入。大纲大纲nError与Exception区别nException处理基本原则nStackOverflowError与OutOfMemoryErrornDebug基本技巧
24、以及如何在Eclipse进行调试nLogger使用注意事项nAssert使用注意事项Exception处理基本原则处理基本原则n基本原则n敏感资源的释放、或备份上下文环境后的现场恢复,要在finally子句中完成。n不要轻易吞并/压制异常n处理异常时,先测特定异常,后测通用异常n检测错误时,”苛刻”要比放任更好n早抛出,晚捕获大纲大纲nError与Exception区别nException处理基本原则nStackOverflowError与OutOfMemoryErrornDebug基本技巧以及如何在Eclipse进行调试nLogger使用注意事项nAssert使用注意事项StackOverf
25、lowErrornStackOverflowErrorn解读:栈溢出,程序所需的栈空间大于为JVM所配置的栈空间n引发原因n程序死循环n过深的方法调用,特别是递归调用nJIT编译后代码的问题n解决办法:n检查程序是否存在死循环n通过-Xss,-Xoss参数为JVM配置栈空间-Xoss参数供本地调用线程栈所用,即供Java代码调用本地库时的过程调用,如:IBM JDK默认-Xoss值为512k,用法如-Xoss512k-Xss参数供Java线程栈所用,即用于Java方法调用时追踪变量的状态,如:IBM JDK默认-Xss值为400k,用法如-Xss400kOutOfMemoryErrornOut
26、OfMemoryErrorn解读:堆空间不足,JVM不能够继续为程序分配对象所需的椎空间,并且没有其它的内存空间供垃圾回收器回收。n引发原因nJVM堆空间分配不足n程序存在”内存泄漏”n解决办法:n通过-Xms,-Xmx参数为JVM配置Java堆空间n审查程序中可能存在的”内存泄漏”,重点是Map,Collection等变量所钩住本该回收的对象。n合理利用WeakReference,SoftReference大纲大纲nError与Exception区别nException处理基本原则nStackOverflowError与OutOfMemoryErrornDebug基本技巧以及如何在Eclip
27、se进行调试nLogger使用注意事项nAssert使用注意事项Debug基本技巧以及如何在基本技巧以及如何在Eclipse进行调试进行调试nDebug基本技巧n-verbose启动JVM,观察类加载过程:检查类路径设置是否正确n使用断言。n以Debug级别记录日志n-Xdebug参数启动JVM进行远程调试,如:-Xdebug-Xrunjdwp:transport=dt_socket,server=y,suspend=n,address=8888nJDK5.0中Dcom.sun.management.jmxremote选项启用JVM,然后用JConsole工具观察内存消耗、线程使用、类加载等情
28、况Debug基本技巧以及如何在基本技巧以及如何在Eclipse进行调试进行调试n如何在Eclipse进行调试Debug基本技巧以及如何在基本技巧以及如何在Eclipse进行调试进行调试n如何在Eclipse进行调试n察看”变量”视图中的内容n在”断点”视图中设置某一类Exception的断点n在”表达式”视图中增加要观察的表达式n为”断点”设置属性n可在”显示”视图中对当前上下文的内容进行评估n充分利用”剪贴薄”(或”草稿纸”)功能,对无法确定的用法或内容进行试算或尝试大纲大纲nError与Exception区别nException处理基本原则nStackOverflowError与OutOf
29、MemoryErrornDebug基本技巧以及如何在Eclipse进行调试nLogger使用注意事项nAssert使用注意事项Logger使用使用注意事项注意事项nLogger类型nJDK Loggern日志记录器分成7级:SEVERE,WARNING,INFO,CONFIG,FINE,FINER,FINESTnLog4jn日志记录器分成5级FATAL,ERROR,WARNING,INFO,DEBUGn注意事项n(log4j)logger.debug(arg1)一类,应加上 if(log.isDebugEnable()之类的判断,以免在运行不必要得计算 arg1n(log4j)要完整地记录下异
30、常链,如应用logger.error(“error”,e)方式n用System.out方式进行调试的,应在发布前屏蔽n配置log4j参数时,记录级别要合理大纲大纲nError与Exception区别nException处理基本原则nStackOverflowError与OutOfMemoryErrornDebug基本技巧以及如何在Eclipse进行调试nLogger使用注意事项nAssert使用注意事项Assert使用注意事项使用注意事项n注意事项n断言失败是致命的、不可恢复的错误n断言检查只用于开发和测试阶段n启用或禁用断言是类装载器的功能n不要在断言中修改变量的值n断言只是测试和调试阶段使
31、用的战术性工具目录目录u第1章 Java体系结构u第2章 基本程序结构设计u第3章 对象与类u第4章 继承u第5章 接口与内部类u第6章 事件处理u第7章 异常与调试u第8章 流与文件大纲大纲nInputStream/OutputStream注意事项nNIOn对象序列化与外部化InputStream/OutputStream注意事项注意事项n注意事项n不论是read方法还是write方法都是线程阻塞模型n及时关闭流对象,以释放操作系统资源n对于输出流,在不关闭文件时,如果不刷新(flush)输出流占用的缓存区,则可能最后一个字节包永远不会被送出n在Java中,所有数据文件都按高字节前存的方法存
32、储nStringBuilder是线程不安全的。n流类关注的是文件内容,而File类关注的是文件在磁盘上的存储大纲大纲nInputStream/OutputStream注意事项nNIOn对象序列化与外部化NIOnNIO支持的特性n内存映射文件n为文件获取通道(channel)。通道是对于磁盘文件的抽象,允许访问操作系统的特性,如文件间的内存映射、文件锁定和快速数据传输n通过FileChannel类的map方法获得MappedByteBuffer.(有只读、读写、私有三种映射模式)n文件锁定n通过FileChannel的lock、trylock获得共享锁或排他锁n文件锁的具体实现依赖于操作系统n文
33、件锁是整于JVM持有n字符集编码和解码n非阻塞IONIOnBuffer数据结构大纲大纲nInputStream/OutputStream注意事项nNIOn对象序列化与外部化对象序列化与外部化对象序列化与外部化n注意事项n对象序列化采用了是一种特殊文件格式存储对象n不建议使用对象序列化来实现对象的持久化n序列化n对象序列化时,既保存对象的状态,也保存类的描述信息:类名、serialVersionUID、非私有的方法标志信息、非transient的数据域(不区分可见性)n序列化时,保存的类描述直到实现Serializable接口的父类为止n重载对象状态的序列化过程:nprivate void wr
34、iteObject(java.io.ObjectOutputStream out)throws IOException nprivate void readObject(java.io.ObjectInputStream in)throws IOException,ClassNotFoundException;nObjectOutputStream.defaultWriteObject 方法序列化对象的状态,不方法序列化对象的状态,不区分子类或父类的数据域。仅包含实现区分子类或父类的数据域。仅包含实现Serializable接口的类其及子类接口的类其及子类n不实现不实现Serializable
35、接口的父类必须有一个子类可访问到的无参构造方法。接口的父类必须有一个子类可访问到的无参构造方法。否则运行时抛否则运行时抛InvalidClassException对象序列化与外部化对象序列化与外部化n序列化n拦截序列化对象:n拦截参与序列化的对象:ANY-ACCESS-MODIFIER Object writeReplace()throws ObjectStreamException;n重解析反序列化的对象,用途如:可序列化的唯一实例、枚举等。ANY-ACCESS-MODIFIER Object readResolve()throws ObjectStreamException;n序列化机制不
36、理会构造器的可见性,均可创建新对象。对象序列化与外部化对象序列化与外部化n外部化n实现Externalizable接口(扩展自Serializable)npublic void writeExternal(ObjectOutput out)throws IOException;npublic void readExternal(ObjectInput in)throws IOException,ClassNotFoundException;n外部化时,优先检测Externalizable接口,后检测Serializable 接口。writeExternal方法替代writeObject方法,r
37、eadExternal方法替代readObject方法。n对象外部化时,默认仅保存类的描述信息:类名、serialVersionUID,对象的状态信息由开发人员自行解析。n仍然可通过writeReplace()与readResolve()方法拦截参与外部化的对象。n实现Externalizable接口的类,必须有public的无参构造方法,否则运行时抛InvalidClassException对象序列化与外部化对象序列化与外部化nserialVersionUIDn类中若有serialVersionUID静态成员,则序列化时不再计算类的指纹,而是使用该值。n若在类中声明serialVersion
38、UID,必须声明成:nstatic final long serialVersionUIDnserialVersionUID的算法:n构造成能代表类的数据流,采集如下信息:构造成能代表类的数据流,采集如下信息:类名(UTF编码),类的修饰符32位整型数,按名排序后的接口名(UTF编码)按名排序后的类的数据域(除私有静态与私有暂态域外):名称,修饰符,类型类的初始化块:方法名(clinit),方法修饰符(STATIC),方法描述()V)按方法名与签名排序后的非私有构造方法:方法名(“init”),方法修饰符,方法描述按方法名与签名排序后的非私有方法方法:方法名(“init”),方法修饰符,方法描述n采用SHA-1算法对数据流进行签名,获取5个32位的信息摘要n对前2个32位的信息摘要进行hash算法,得到一个长整型的serialVersionUID