《《Java开发基础》PPT课件.ppt》由会员分享,可在线阅读,更多相关《《Java开发基础》PPT课件.ppt(80页珍藏版)》请在三一办公上搜索。
1、,Java开发基础,目录,第1章 Java体系结构第2章 基本程序结构设计第3章 对象与类第4章 继承第5章 接口与内部类第6章 事件处理第7章 异常与调试第8章 流与文件,Java体系结构,Java体系结构包括如下四大类技术:Java程序设计语言Java class文件格式Java APIJava 虚拟机,Java体系结构(续),目录,第1章 Java体系结构第2章 基本程序结构设计第3章 对象与类第4章 继承第5章 接口与内部类第6章 事件处理第7章 异常与调试第8章 流与文件,大纲,数据类型变量运算符字符串注释输入输出控制流程数组,数据类型,数据类型整型浮点型char型boolean型,
2、Char:长度 2字节无符号整型 0 65535Boolean:true、false,数据类型,数据类型操作注意事项尽量使用适合长度的数据类型操作尽量使用约定俗成的数据类型做常用操作注意数据操作时可能发生的数据溢出及除0错误进行金额操作时避免使用float 和 double,使用无损精度操作的大数值类型 BigInteger 和 BigDecimal,变量,变量初始化变量常量注意定义变量时尽量赋予初始化值变量的命名要简明达意遵守变量命名的大小写规范使用合适的描述符,尽可能在使用变量时定义,减小可见性,运算符,运算符算术运算符自增自减运算符关系运算符与boolean运算符位运算符运算相关注意事项
3、使用JDK库实现常用算法及函数数值类型的自动转换规则强制类型转换及截位枚举类型的使用,字符串,字符串代码点与代码单元字符子串与拼接相等的比较注意事项编码转换方法子串下标计算拼接的性能String 方法 intern()的应用,注释,注释单行注释多行注释文档注释注意多行注释不能嵌套方法及类说明尽量采取文档注释,并标注相关内容(author,see)除了JDK1.5的标注Annotation外,注释不包括在编译后文件中,输入输出,输入输出Java 库提供了丰富的IO操作流包括如下:数据流文本流字符流Zip文件流应用范围文件管理网络数据传输对象序列反序列化压缩解压等,流程控制,控制流程一条件控制,流
4、程控制,控制流程二循环控制,流程控制,控制流程三多重选择,目录,第1章 Java体系结构第2章 基本程序结构设计第3章 对象与类第4章 继承第5章 接口与内部类第6章 事件处理第7章 异常与调试第8章 流与文件,大纲,对象构造顺序方法参数传递:按值调用类设计基本原则,对象构造顺序,对象构造顺序类装载时,按类声明中出现的次序执行静态初始化块或静态初始化语句。对象构造时:所有数据域初始化为默认值按类声明中出现的次序执行初始化块或初始化语句。如果构造器第一行调用了第二个构造器,则跳转到第二个构造器中执行,直到返回。执行这个构造器的主体部分。注点事项对象构造器中显式调用另一构造器时,必须在对象构造器的
5、第一行代码中。当类声明中同时存在初始化语句与初始化域中,变量初始化的代码的次序至关重要。,大纲,对象构造顺序方法参数传递:按值调用类设计基本原则,方法参数传递:按值调用,一个方法不能修改一个基本数据类型的参数一个方法可以改变一个对象参数的状态一个方法不能让对象参数的引用到一个其它对象,大纲,对象构造顺序方法参数传递:按值调用类设计基本原则,类设计基本原则,类设计的基本原则单一职责原则(SRP):一个类应该仅有一个引起它变化的原因。开放-封闭原则(OCP):一个类对于扩展时开放的,对于更改是封闭的。Liskov替换原则(LSP):子类必须能够替换掉它们的基类。依赖倒置原则(DIP):高层模块不应
6、该依赖于低层模块;抽象类不应该依赖于其细节,细节。接口隔离原则(ISP):不应该强迫客户依赖于它们不用的方法,类设计基本原则(续),包设计的基本原则包内聚性原则(包粒度)重用发布等价原则(REP):重用的粒度就是发布的粒度。共同重用原则(CRP):一个包中的所有类应该是共同重用的。如果重用了包中的一个类,那么就要重用包中的所有类。共同封闭原则(CCP):包中的所有类对于同一类性质的变化应该是共同封闭的。一个变化若对一个包产生影响,则将对该包中的所有类产生影响,而对于其它的包不造成任何影响。考虑可重用性与可开发性的平衡。包耦合性原则(包稳定性)无环依赖原则(ADP):在包的依赖关系图中不允许存在
7、环。稳定依赖原则(SDP):朝着移定的方向进行依赖。不稳定性I=Ce/(Ca+Ce)稳定抽象原则(SAP):包的抽象程度应该与其稳定程度一致。抽象度A=Na/Nc,目录,第1章 Java体系结构第2章 基本程序结构设计第3章 对象与类第4章 继承第5章 接口与内部类第6章 事件处理第7章 异常与调试第8章 流与文件,大纲,继承的介绍Java 继承的约束继承的使用继承与模式反射枚举,继承的介绍,继承是面向对象编程的一块基石利用已存在的类,复用这些类的方法和域利用继承,一些共性的特征可以抽象到超类,子类继承超类实现特有的属性Java 中所有的对象都继承至 java.lang.Object,因此都拥
8、有toString(),equals(),wait()等方法,继承的约束,不能实现多继承父类提供了参数构造函数,子类必须实现子类不能降低父类方法的可见域子类不能抛出比父类构造函数或方法更多的异常子类不能扩展父类的 final 方法,继承的使用,继承增加了重用代码,减少子类编码把数据、行为和/或接口的共性尽可能地放到继承层次体系的高端 继承树的层次不能太深复杂的继承树提高维护的复杂性继承树的上层尽量为抽象层可以提高系统间的松耦合继承打破了对象的封装子类可以访问父类的实现,父类的改动将会对子类产生影响继承的动态绑定可以使程序灵活,更易于扩展尽量减少定义域对子类可见(final 除外),减少数据被误
9、写入危险,可提供读写方法功子类操作,继承与模式,模版模式,继承与模式,抽象工厂模式,继承与模式,适配器模式,继承与模式,策略模式,开发相关,Java 中不允许多继承,但允许实现多个接口Java中,我们可以声明一个类扩展(extends)另一个类,继承的子类拥有访问超类的 protected 域的权限,并可以覆写已有方法或添加新的方法继承使用应谨慎,不要滥用继承。,反射,允许程序在运行时透过Reflection APIs取得任何一个已知名称的class的内部信息,并可于运行时改变fields内容或唤起 methods。可动态获取的内容包括modifiers(诸如public,static)sup
10、erclass(例如Object)interfaces(例如Cloneablefields和methods等,目录,第1章 Java体系结构第2章 基本程序结构设计第3章 对象与类第4章 继承第5章 接口与内部类第6章 事件处理第7章 异常与调试第8章 流与文件,大纲,接口与抽象类的选择克隆及其注意事项接口与回调内部类、局部类、匿名类JDK的Proxy与CGLib的动态代理区别,接口与抽象类的选择,基本原则正确、合理地理解领域本质与设计意图。在接口和抽象类的选择上,必须遵守这样一个原则:行为模型应该总是通过接口而不是抽象类定义。合理理解OCP原则、ISP原则考虑因素是否可能被多继承是否有默认行
11、为行为集合是否已稳定“is a”还是“like a”关系,大纲,接口与抽象类的选择克隆及其注意事项接口与回调内部类、局部类、匿名类JDK的Proxy与CGLib的动态代理区别,克隆及其注意事项,浅克隆与深克隆默认实现是浅克隆(本地方法实现)默认实现是浅克隆)如果原始对象与浅克隆对象共享的子对象是不可变的,则不会产生负面问题。采用序列化方法实现深度克隆,但不推荐。如com.kingdee.util.ObjectUtils.createCopy(Object o)注意事项避免死循环应用单例模式时,需注意屏蔽clone方法,大纲,接口与抽象类的选择克隆及其注意事项接口与回调内部类、局部类、匿名类JD
12、K的Proxy与CGLib的动态代理区别,接口与回调,回调实现方法模板方法,如:BOS的Entity方法生成的代码。注入方式,如:Observer设计模式动态代理与拦截器方法注意事项合理利用接口,避免写僵硬、强藕合代码。选用合适的回调实现方式,避免写侵入式代码。,大纲,接口与抽象类的选择克隆及其注意事项接口与回调内部类、局部类、匿名类JDK的Proxy与CGLib的动态代理区别,内部类、局部类、匿名类,内部类编译器会为非静态的内部类添加一个对外围类的隐式引用。内部类是一种编译器现象,与虚拟机无关。局部类不能用可见性说明符进行声明。可访问final类型的局部变量。运行时,虚拟机在方法参数变量释放
13、之前对引用的局部变量进行备份。,大纲,接口与抽象类的选择克隆及其注意事项接口与回调内部类、局部类、匿名类JDK的Proxy与CGLib的动态代理区别,JDK的Proxy与CGLib的动态代理区别,JDK的Proxy只能实现基于接口的代理一个代理类仅有一个调用处理器(InvoctionHandler)的实例变量代理类仅覆盖Object类的toString/equals/hashCode方法,其它的方法没有重定义对于特定的类加载器和给定的一组接口而言,只有一个代理类。如果代理类实现的所有接口都是public,那代理类不属于特定的;否则,所有非公有的接口都必须属于同一个包,同时,代码类也属于这个包。
14、存在同签名方法时,接口的顺序至关重要。CGLib可以采用实现接口,或继承父类方式实现代理,目录,第1章 Java体系结构第2章 基本程序结构设计第3章 对象与类第4章 继承第5章 接口与内部类第6章 事件处理第7章 异常与调试第8章 流与文件,事件处理,事件处理与 MVCModel是代表组件状态和低级行为的部分,它管理着自己的状态并且处理所有对状态的操作 View代表了管理model所含有的数据的一个视觉上的呈现。一个Model可以有一个以上的View Controller管理着model和用户之间的交互的控制。它提供了一些方法去处理当model的状态发生了变化时的情况 运作时序按钮 mode
15、l 保存按钮的内部状态及行为控制器在发生按钮点击事件后将事件给模型,模型根据行为更新内部状态。控制器通知视图改变按钮的显示视图根据按钮的模型更新显示,事件处理,事件的继承模型,事件处理,组件的事件处理,目录,第1章 Java体系结构第2章 基本程序结构设计第3章 对象与类第4章 继承第5章 接口与内部类第6章 事件处理第7章 异常与调试第8章 流与文件,大纲,Error与Exception区别Exception处理基本原则StackOverflowError与OutOfMemoryErrorDebug基本技巧以及如何在Eclipse进行调试Logger使用注意事项Assert使用注意事项,Er
16、ror与Exception区别,ErrorError类层次结构描述了Java运行时系统的内部错误和资源耗尽错误。ExceptionRuntimeException:由程序错误导致的异常Checked Exception:某些情况下可正确运行,而在某些情况下导致的异常Checked Exception的审查是编译器行为出现RuntimeException问题,一定是你的问题,Error与Exception区别,常见Error常见RuntimeExceptionClassCastException,IllegalArgumentException,ArrayIndexOutOfBoundsExce
17、ption,StringIndexOutOfBoundsException,MissingResourceException,NoSuchElementException,NullPointerException,Error与Exception区别,疑难Error/ExceptionClassNotFoundException显式类装载失败NoClassDefFoundError隐式类装载失败,或初始化失败后置脏UnsatisfiedLinkError 对于声明为 native 的方法,JVM找不到和它对应的本机语言定义在Windows系列OS中,多次加载dll。ExceptionInInit
18、ializerError 如果初始化器突然完成,抛出一些异常 E,而且 E 的类不是 Error 或者它的某个子类,那么就会创建ExceptionInInitializerError 类的一个新实例,并用 E 作为参数,用这个实例代替 E。ClassCircularityError类或接口由于是自己的超类或超接口而不能被装入。,大纲,Error与Exception区别Exception处理基本原则StackOverflowError与OutOfMemoryErrorDebug基本技巧以及如何在Eclipse进行调试Logger使用注意事项Assert使用注意事项,Exception处理基本原则
19、,基本原则敏感资源的释放、或备份上下文环境后的现场恢复,要在finally子句中完成。不要轻易吞并/压制异常处理异常时,先测特定异常,后测通用异常检测错误时,”苛刻”要比放任更好早抛出,晚捕获,大纲,Error与Exception区别Exception处理基本原则StackOverflowError与OutOfMemoryErrorDebug基本技巧以及如何在Eclipse进行调试Logger使用注意事项Assert使用注意事项,StackOverflowError,StackOverflowError解读:栈溢出,程序所需的栈空间大于为JVM所配置的栈空间引发原因程序死循环过深的方法调用,特
20、别是递归调用JIT编译后代码的问题解决办法:检查程序是否存在死循环通过-Xss,-Xoss参数为JVM配置栈空间-Xoss参数供本地调用线程栈所用,即供Java代码调用本地库时的过程调用,如:IBM JDK默认-Xoss值为512k,用法如-Xoss512k-Xss参数供Java线程栈所用,即用于Java方法调用时追踪变量的状态,如:IBM JDK默认-Xss值为400k,用法如-Xss400k,OutOfMemoryError,OutOfMemoryError解读:堆空间不足,JVM不能够继续为程序分配对象所需的椎空间,并且没有其它的内存空间供垃圾回收器回收。引发原因JVM堆空间分配不足程序
21、存在”内存泄漏”解决办法:通过-Xms,-Xmx参数为JVM配置Java堆空间审查程序中可能存在的”内存泄漏”,重点是Map,Collection等变量所钩住本该回收的对象。合理利用WeakReference,SoftReference,大纲,Error与Exception区别Exception处理基本原则StackOverflowError与OutOfMemoryErrorDebug基本技巧以及如何在Eclipse进行调试Logger使用注意事项Assert使用注意事项,Debug基本技巧以及如何在Eclipse进行调试,Debug基本技巧-verbose启动JVM,观察类加载过程:检查类路
22、径设置是否正确使用断言。以Debug级别记录日志-Xdebug参数启动JVM进行远程调试,如:-Xdebug-Xrunjdwp:transport=dt_socket,server=y,suspend=n,address=8888JDK5.0中选项启用JVM,然后用JConsole工具观察内存消耗、线程使用、类加载等情况,Debug基本技巧以及如何在Eclipse进行调试,如何在Eclipse进行调试,Debug基本技巧以及如何在Eclipse进行调试,如何在Eclipse进行调试察看”变量”视图中的内容在”断点”视图中设置某一类Exception的断点在”表达式”视图中增加要观察的表达式为”
23、断点”设置属性可在”显示”视图中对当前上下文的内容进行评估充分利用”剪贴薄”(或”草稿纸”)功能,对无法确定的用法或内容进行试算或尝试,大纲,Error与Exception区别Exception处理基本原则StackOverflowError与OutOfMemoryErrorDebug基本技巧以及如何在Eclipse进行调试Logger使用注意事项Assert使用注意事项,Logger使用注意事项,Logger类型JDK Logger日志记录器分成7级:SEVERE,WARNING,INFO,CONFIG,FINE,FINER,FINESTLog4j日志记录器分成5级FATAL,ERROR,W
24、ARNING,INFO,DEBUG注意事项(log4j)logger.debug(arg1)一类,应加上 if(log.isDebugEnable()之类的判断,以免在运行不必要得计算 arg1(log4j)要完整地记录下异常链,如应用logger.error(“error”,e)方式用System.out方式进行调试的,应在发布前屏蔽配置log4j参数时,记录级别要合理,大纲,Error与Exception区别Exception处理基本原则StackOverflowError与OutOfMemoryErrorDebug基本技巧以及如何在Eclipse进行调试Logger使用注意事项Asser
25、t使用注意事项,Assert使用注意事项,注意事项断言失败是致命的、不可恢复的错误断言检查只用于开发和测试阶段启用或禁用断言是类装载器的功能不要在断言中修改变量的值断言只是测试和调试阶段使用的战术性工具,目录,第1章 Java体系结构第2章 基本程序结构设计第3章 对象与类第4章 继承第5章 接口与内部类第6章 事件处理第7章 异常与调试第8章 流与文件,大纲,InputStream/OutputStream注意事项NIO对象序列化与外部化,InputStream/OutputStream注意事项,注意事项不论是read方法还是write方法都是线程阻塞模型及时关闭流对象,以释放操作系统资源对
26、于输出流,在不关闭文件时,如果不刷新(flush)输出流占用的缓存区,则可能最后一个字节包永远不会被送出在Java中,所有数据文件都按高字节前存的方法存储StringBuilder是线程不安全的。流类关注的是文件内容,而File类关注的是文件在磁盘上的存储,大纲,InputStream/OutputStream注意事项NIO对象序列化与外部化,NIO,NIO支持的特性内存映射文件为文件获取通道(channel)。通道是对于磁盘文件的抽象,允许访问操作系统的特性,如文件间的内存映射、文件锁定和快速数据传输通过FileChannel类的map方法获得MappedByteBuffer.(有只读、读写
27、、私有三种映射模式)文件锁定通过FileChannel的lock、trylock获得共享锁或排他锁文件锁的具体实现依赖于操作系统文件锁是整于JVM持有字符集编码和解码非阻塞IO,NIO,Buffer数据结构,大纲,InputStream/OutputStream注意事项NIO对象序列化与外部化,对象序列化与外部化,注意事项对象序列化采用了是一种特殊文件格式存储对象不建议使用对象序列化来实现对象的持久化序列化对象序列化时,既保存对象的状态,也保存类的描述信息:类名、serialVersionUID、非私有的方法标志信息、非transient的数据域(不区分可见性)序列化时,保存的类描述直到实现S
28、erializable接口的父类为止重载对象状态的序列化过程:private void writeObject(java.io.ObjectOutputStream out)throws IOException private void readObject(java.io.ObjectInputStream in)throws IOException,ClassNotFoundException;ObjectOutputStream.defaultWriteObject 方法序列化对象的状态,不区分子类或父类的数据域。仅包含实现Serializable接口的类其及子类不实现Serializa
29、ble接口的父类必须有一个子类可访问到的无参构造方法。否则运行时抛InvalidClassException,对象序列化与外部化,序列化拦截序列化对象:拦截参与序列化的对象:ANY-ACCESS-MODIFIER Object writeReplace()throws ObjectStreamException;重解析反序列化的对象,用途如:可序列化的唯一实例、枚举等。ANY-ACCESS-MODIFIER Object readResolve()throws ObjectStreamException;序列化机制不理会构造器的可见性,均可创建新对象。,对象序列化与外部化,外部化实现Exter
30、nalizable接口(扩展自Serializable)public void writeExternal(ObjectOutput out)throws IOException;public void readExternal(ObjectInput in)throws IOException,ClassNotFoundException;外部化时,优先检测Externalizable接口,后检测Serializable 接口。writeExternal方法替代writeObject方法,readExternal方法替代readObject方法。对象外部化时,默认仅保存类的描述信息:类名、s
31、erialVersionUID,对象的状态信息由开发人员自行解析。仍然可通过writeReplace()与readResolve()方法拦截参与外部化的对象。实现Externalizable接口的类,必须有public的无参构造方法,否则运行时抛InvalidClassException,对象序列化与外部化,serialVersionUID类中若有serialVersionUID静态成员,则序列化时不再计算类的指纹,而是使用该值。若在类中声明serialVersionUID,必须声明成:static final long serialVersionUIDserialVersionUID的算法:构造成能代表类的数据流,采集如下信息:类名(UTF编码),类的修饰符32位整型数,按名排序后的接口名(UTF编码)按名排序后的类的数据域(除私有静态与私有暂态域外):名称,修饰符,类型类的初始化块:方法名(clinit),方法修饰符(STATIC),方法描述()V)按方法名与签名排序后的非私有构造方法:方法名(“init”),方法修饰符,方法描述按方法名与签名排序后的非私有方法方法:方法名(“init”),方法修饰符,方法描述采用SHA-1算法对数据流进行签名,获取5个32位的信息摘要对前2个32位的信息摘要进行hash算法,得到一个长整型的serialVersionUID,