




已阅读5页,还剩21页未读, 继续免费阅读
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
面向对象编程思想语法Java虚拟机执行程序的原理项目运用设计模式性能优化 熟悉Java语法,熟练地编译和调试程序。 按照面向对象的思想来快速理解JDK类库及其他第三方提供的类库,通过阅读JavaDoc和相关文档,知道如何正确地使用这些类库。 按照面向对象的思想来分析问题领域,设计对象模型。 在开发过程中运用现有的一些优秀设计模式,提高开发效率。 当一个方法有多种实现方式时,能够从可维护、可重用及性能优化的角度选择最佳的实现方式。 理解Java虚拟机执行Java程序的原理,从而更深入地理解Java语言的各种特性和语法规则。软件开发生命周期:软件分析软件设计软件编码软件测试软件部署软件维护软件开发效率:可重用性可扩展性可维护性结构化开发:SA:Structure AnalysisSD:Structure DesignSP:Structure ProgrammingDFD:Data Flow Diagram 数据流图结构化开发中,方法是最小的子系统;面向对象开发中,对象是最小的子系统。建立对象模型:自底向上的抽象 + 自顶向下的分解抽象:问题 对象 - 类 - 父类 把 问题领域中的事物 抽象为 具有特定属性和行为的对象 把 具有相同属性和行为的对象 抽象为 类 若多个类之间存在一些 共性(具有相同属性和行为),把这些共性抽象到 父类 中UML:Unified Modeling Language 统一建模语言Rational Rose 可视化建模工具:用于绘制UML图万物皆为对象对象具有唯一性对象具有属性和行为(成员变量和成员方法)对象具有状态(即属性取值)对象都属于某个类Java虚拟机是Java程序的解析器和执行器Java虚拟机提供的运行环境中,保证每个对象唯一性的手段是为它在内存中分配唯一的地址对象模型中的类可以看做是开发人员自定义的数据类型,Java虚拟机的运行时环境 封装了 将自定义数据类型映射到计算机内置数据类型的过程。这使得开发人员不受计算机内置数据类型的限制,对于任意一种问题领域,都可以方便地根据 先识别对象,再进行分类(创建任意的数据类型)的思路 来建立对象模型。每个对象都是服务提供者,对象通过 接口 对外提供服务Java语言中,接口有两种意思: 指概念性的接口,在对象中表现为public类型的方法的声明 指用interface关键字定义的实实在在的接口(接口类型),它用于明确地描述系统对外提供的所有服务,更清晰地将系统的实现细节与接口分离封装:隐藏对象的属性和实现细节,仅对外公开接口面向对象的编程语言主要通过 访问控制机制 来进行封装,有效控制对象的属性和方法的可访问性: Public Protected 只对同一个包中的类或子类公开 默认 只对同一个包中的类公开 Private只能在对象内部访问封装原则:所有属性private;尽可能对外提供简洁接口Java语言中,抽象有两种意思: 当抽象作为动词时,指抽象思维过程如:从子类到父类的抽象。不同子类具有相同功能,且功能实现方式一样,将功能放在父类中实现;不同子类具有相同功能,但功能实现方式不一样,父类中仅声明此功能,但不提供具体实现(多态、动态绑定)。 当抽象作为形容词时,用来修饰类和方法abstract修饰方法,表明此方法没有具体的实现;abstract修饰类,表明此类不能被实例化。继承、扩展、覆盖通用软件架构提供专门让用户继承和扩展的类,用户只需创建这些类的子类,在子类中扩展或覆盖实现某些功能,保证自定义的子类能顺利与软件架构中其他类协作即可。Java领域主流架构软件: J2EE分布式分层 企业应用软件架构(Sun) StrutsJavaWeb应用通用框架(Apache) JSFJavaWeb应用界面通用框架(Sun) Spring企业应用服务层通用框架(Spring)J2EE架构 JavaWeb层扩展点:Servlet类和JSP 应用服务层扩展点:EJB组件 企业应用分为客户层、JavaWeb层、应用服务层、数据库层Structs架构 MVC(Model-View-Controller)设计模式 控制器层扩展点:Action类Servlet是J2EE架构在JavaWeb层的扩展点,通过这个扩展点,开发人员能方便地在JavaWeb层添加与特定问题领域相关的服务。Servlet是供用户扩展的组件,运行在Servlet容器中。Servlet容器负责接收并响应Web客户的HTTP请求,Servlet负责提供所请求的特定服务。开发JavaWeb应用时,可以选择第三方提供的Servlet容器(如Tomcat),开发人员的主要任务是扩展javax.servlet.http.HttpServlet接口,创建能提供特定服务的Servlet子类。将自定义的Servlet类发布到Servlet容器中,Servlet容器就能与这些Servlet协作,Servlet容器根据Web客户的请求,调用相关Servlet对象的方法来响应请求。类之间的关系: 关联:类A与类B的实例之间存在特定的对应关系 依赖:类A访问类B提供的服务 聚集:类A为整体类,类B为局部类,类A的对象由类B的对象组合而成 泛化:类A继承类B 实现:类A实现了B接口 /从控制台读取用户输入形状类型 BufferedReader input = new BufferedReader(new InputStreamReader(System.in);int shapeType=Integer.parseInt(input.readLine();- private static Properties shapes=new Properties(); static try InputStream in=ShapeFactory.class.getResourceAsStream(perties); shapes.load(in); /把配置信息加载到shapes对象中 catch(IOException e)throw new RuntimeException(e); - try /获得与形状类型匹配的形状类名 String className=(String)shapes.get(String.valueOf(type); /运用Java反射机制构造形状对象 return (Shape)Class.forName(className).newInstance(); catch(Exception e)return null;Java源文件结构: 包声明语句Package Statement 包引入语句Import Statement 类的声明Class Declaration 接口声明Interface Declaration源文件可定义多个类或接口,至多只有一个是public类型,以public类名对文件命名。Java基本包:java.langThread、Exception、System、Integer、String 自动引入java.awtAbstract Window ToolKitGUI界面类、绘图类java.ioFileInputStream、FileOutputStreamjava.utilDate、CSocket类、URL 支持TCP/IP网络协议,用于网络编程else:java.sql、java.rmi、javax.swing、javax.soundimport语句不会导致类的初始化,即Java虚拟机不会将包中的类加载到内存中并初始化。JDK:Java虚拟机、JDK类库、开发工具用JDK管理Java应用 目录结构src、classes、lib、doc、doc/api、deploy 编译javac.exe 运行java.exe 发布jar.exe运行:类加载-字节码检验-解析-执行指令JVM提供了程序运行时环境,其中最重要的一个资源是运行时数据区。运行时数据区是操作系统为JVM进程分配的内存区域,JVM将该区域划分为多个子区域: 堆区存放对象 方法区存放类的类型信息(静态变量和方法信息等) Java栈区 类加载运行程序-启动JVM进程-进程从classpath中找到.class文件,读取.class文件中的二进制数据,将类的类型信息存放到运行时数据区的方法区中。 类验证及初始化 指令执行JVM定位方法区中的main()方法字节码,执行它的指令。1) 搜索方法区,查找Doll类的类型信息,若无该信息,JVM先加载Doll类,将Doll类的类型信息存放在方法区2) 在堆区中为新的Doll实例分配内存,Doll实例持有指向方法区的Doll类的类型信息的引用。该引用指的是Doll类的类型信息在方法区中的内存地址,Doll实例的数据区存放了这一地址3) beibei变量是局部变量,被添加到执行main()方法的主线程的Java方法调用栈中,它引用堆区中的Doll实例4) 执行beibei.speak()方法时,JVM根据beibei持有的引用,定位到堆区中的Doll实例,再根据Doll实例持有的引用,定位到方法区中Doll类的类型信息,从而获得speak()方法的字节码,接着执行speak()方法包含的指令public class AppMain public static void main(String args) Doll beibei=new Doll(贝贝); /创建富娃贝贝 beibei.speak(); /富娃贝贝说话 beibei变量属于引用类型变量引用变量的作用域决定了它位于JVM运行时数据区的哪个区: 局部变量,位于Java栈区 某个类的静态成员变量,位于方法区 某个类的实例成员变量,位于堆区数据类型: 基本数据类型(8种) 数值类型浮点数:float、double整数:byte、short、int、long字符:char 布尔类型:boolean 引用类型:类、接口、数组字符编码:用一串二进制数据来表示特定的字符编码字符集: ASCII码占用一个字节的后7位,规定128个字符(罗马字母+控制符) GB2312利用ASCII的后128个扩展码来表示汉字(双字节) Unicode收录所有语言中的字符,UCS-2(2字节)、UCS-4(4字节) UTF以1个字节为单元对UCS编码,以支持不同位数的操作系统Java语言采用UCS-2字符编码,UCS-2到UTF-8的转换方式:浮点数的二进制数据存储规则:float1bit符号位 8bit指数 23bit尾数double1bit符号位 11bit指数 52bit尾数Float.floatToIntBits(f) 将f对应的32位二进制数据流转换为int类型的数据Java中,小数默认为double类型。类的成员变量(2种): 被static关键字修饰的变量类变量或静态变量 没被static关键字修饰的变量实例变量区别: 静态变量在内存中只有一个,类的每个实例都有相应的实例变量 JVM加载类时为静态变量分配内存,创建类的实例时为实例变量分配内存 静态变量位于方法区,实例变量位于堆区 静态变量的生命周期取决于类,实例变量的生命周期取决于实例如果类的成员变量是引用变量,那么当该变量结束生命周期时,并不意味着它所引用的对象也一定结束生命周期。变量的生命周期和对象的生命周期是两个不同的概念。对象的默认引用:this使用this关键字的情况 在类的构造方法中,通过this语句调用这个类的另一个构造方法(重载构造方法) 在一个实例方法内,局部变量或方法参数和实例变量同名,实例变量被屏蔽,this为当前实例的引用(若局部变量或方法参数和静态变量同名,通过类名访问静态变量) 在一个实例方法内,访问当前实例的引用,如obj.setFunc(this);/this代表当前对象只能在构造方法或实例方法内使用this关键字,不能在静态方法或静态代码块内使用。类的成员变量,不管程序是否显示进行初始化,JVM都会先自动将它初始化为默认值。初始化默认值规则:byte、short、int、long0float0.0fdouble0.0dchar“u0000”booleanfalse引用类型null操作符“=”vs.equals()方法 “=”用于比较引用类型变量时,两边的引用变量必须引用同一个对象,结果才为true(两边的变量被显式声明的类型必须是同种类型或具有继承关系) public boolean equals(Object obj) Object类的equals()方法的比较规则:当参数obj引用的对象与当前对象为同一个对象时,返回true JDK中一些类覆盖Object类的equals()方法,比较规则:如果两个对象的类型一致,并且内容一致,返回true实际运用中,按内容比较才会有意义,通常调用一些类覆盖了的equals()方法,这些类包括:java.io.File、java.util.Date、java.lang.String、包装类(java.lang.Integer、java.lang.Float、java.lang.Double、java.lang.Boolean等)操作符instanceof用于判断一个引用类型所引用的对象是否是一个类的实例,格式:obj instanceof ClassName/InterfaceNameSub类继承Base类的成员变量和成员方法,继承规则: Sub类和Base类位于同一个包中,访问级别:public、protected、默认 Sub类和Base类位于不同的包中,访问级别:public、protected方法重载 & 方法覆盖 对于类的方法(包括从父类中继承的方法),如果两个方法的方法名相同,但参数不一致,则一个方法是另一个方法的重载方法。 如果在子类中定义的一个方法,其名称、返回类型及参数与父类中某个方法相匹配,则子类的方法覆盖了父类的方法。 子类方法不允许缩小父类方法的访问权限,这么规定是为了避免与“多态机制”冲突。例:/ base变量定义为Base类型,但引用Sub类的实例 Base base = new Sub(); base.method();若Sub子类method()方法定义为私有的,父类method()方法定义为公共的,子类缩小了父类方法的访问权限。根据动态绑定规则,JVM调用base变量所引用的Sub实例的method方法,如果这个方法为private类型,JVM就无法访问它。 子类方法不允许抛出比父类方法更多的异常,子类方法抛出的异常必须与父类相同,或者是父类方法抛出的异常类的子类。例: public class Base void method() throws ExceptionSub1 public class Sub1 extends Base void method() throws ExceptionBase /编译出错 public class Sub2 extends Base void method() throws ExceptionSub1,ExceptionSub2 /编译出错 / base变量定义为Base类型,但引用Sub2类的实例 Base base = new Sub2(); try base.method(); catch(ExceptionSub1 e) 如果Sub2实例的method()方法抛出ExceptionSub2异常,由于该异常没有被捕获,将导致程序异常终止。 父类的静态方法不允许被子类覆盖为非静态方法。子类定义与父类的静态方法同名的静态方法。子类隐藏父类的静态方法和子类覆盖父类的实例方法,区别在于:静态方法和所属类绑定,实例方法和所属实例绑定。 父类的非静态方法不允许被子类覆盖为静态方法 父类的私有方法不允许被子类覆盖 父类的抽象方法被覆盖的两种途径: 子类实现父类的抽象方法 子类重新声明父类的抽象方法 public abstract class Base abstract void method1(); abstract void method2(); public abstract class Sub extends Base public void method1() /实现 public abstract void method2();/重新声明 父类的非抽象方法可以被覆盖为抽象方法 public class Base void method() public abstract class Sub extends Base public abstract void method();一个实例所属的类,肯定实现了父类中所有的抽象方法,否则这个类不能被实例化。super关键字使用super关键字的情况 在类的构造方法中,通过super语句调用这个类的父类的构造方法 在子类中访问父类的被屏蔽的方法和属性,形式:super.var, super.method()只能在构造方法或实例方法内使用super关键字,而静态方法和静态代码块内不能使用。引用变量的类型转换:(具有直接或间接继承关系的类之间进行类型转换) 向上转型,不必使用强制类型转换 向下转型,必须使用强制类型转换运行时,JVM允许子类对象转换为父类类型,不允许父类对象转换为子类类型: Base who = new Base(); Sub sub = (Sub)who;/假定运行时未出错sub.subMethod();/sub变量引用Base实例,而Base实例没有subMethod()方法对于引用类型的变量,JVM按照它实际引用的对象来处理。以上代码虽编译通过,但运行时会抛出ClassCastException运行时异常。JVM绑定规则(通过引用类型变量访问所引用对象的方法和属性): 实例方法 与 引用变量实际引用的对象的方法 绑定,属于动态绑定,在运行时由JVM动态决定 静态方法 与 引用变量所声明的类型的方法 绑定,属于静态绑定,在编译阶段确定 成员变量(静态变量+实例变量) 与 引用变量所声明的类型的成员变量 绑定,属于静态绑定,在编译阶段确定 Base who=new Sub(); /who被声明为Base类型,引用Sub实例 System.out.println(who.var=+who.var); /打印Base类的var变量 System.out.println(who.staticVar=+who.staticVar); /打印Base类的staticVar变量 who.method(); /打印Sub实例的method()方法who.staticMethod(); /打印Base类的staticMethod()方法禁止继承的两种措施: 将类声明为final类型(final修饰符) 将类的所有构造方法声明为private类型,通过静态方法来负责构造自身实例(构造方法的访问级别)组合 & 继承 组合关系的分解过程 对应 继承关系的抽象过程 组合关系的组合过程 对应 继承关系的扩展过程 / 原型 public class A private void method1() System.out.println(m1); private void method2() System.out.println(m2); public void method3() method1(); System.out.println(m3); public void methodA() method2(); System.out.println(mA); public class B private void method1() System.out.println(m1); private void method2() System.out.println(m2); public void method3() method1(); System.out.println(m3); public void methodB() method2(); System.out.println(mB); /* 继承 * 从类A和类B中抽象出类C,包含method1,2,3() * methodA,B()访问method2(),因此将method2()声明为protected类型 */ public class C private void method1() System.out.println(m1); protected void method2() System.out.println(m2); public void method3() method1(); System.out.println(m3); public class A extends C public void methodA() method2(); System.out.println(mA); public class B extends C public void methodB() method2(); System.out.println(mB); /* 组合 * 类A与类C,类B与类C之间是组合关系 * 类A/B中定义了C类型的引用变量c,对类C进行了封装 */ public class C private void method1() System.out.println(m1); public void method3() method1(); System.out.println(m3); public class A private C c; public A(C c) this.c = c; private void method2() System.out.println(m2); public void method3() c.method3(); public void methodA() method2(); System.out.println(mA); public class B private C c; public B(C c) this.c = c; private void method2() System.out.println(m2); public void method3() c.method3(); public void methodB() method2(); System.out.println(mB); 组合关系的优势:不会破坏封装(类C封装实现,仅向类A提供接口)组合关系的缺点:比继承关系要创建更多的对象(组合关系在创建整体类的实例时,必须创建其所有局部类的实例;继承关系在创建子类的实例时,无须创建父类实例)继承关系最大的弱点是打破了封装,子类能够访问父类的实现细节,子类与父类紧密耦合。为了克服这一缺陷,应该遵循以下原则: 精心设计专门用于被继承的类,继承树的抽象层应该比较稳定 对于父类中不允许覆盖的方法,采用final修饰符来禁止其被子类覆盖 对于不是专门用于被继承的类,禁止其被继承 优先考虑用组合关系来提高代码的可重用性访问级别仅仅适用于类及类的成员,而不适用于局部变量。局部变量只能在方法内部被访问,不能用public、protected或private来修饰。abstract修饰符 抽象类中可以没有抽象方法,但包含了抽象方法的类必须被定义为抽象类。如果子类没有实现父类中所有的抽象方法,那么子类也必须被定义为抽象类。 抽象类中可以有静态方法,静态方法不能是抽象的,abstract、static不能连用。 抽象类中可以有构造方法,创建子类的实例时可能会调用这些构造方法,但构造方法不能是抽象的。 抽象类不能被实例化,然而可以创建一个引用变量,其类型是一个抽象类,并让它引用非抽象的子类的一个实例。 抽象类和抽象方法不能有final修饰符,abstract、final不能连用。final修饰符(具有“不可改变”的含义)用final修饰的类不能被继承,没有子类用final修饰的方法不能被子类的方法覆盖用final修饰的变量表示常量,只能被赋值一次final不能修饰构造方法(父类的构造方法和子类的构造方法之间不存在覆盖关系)static修饰符 用static修饰的成员变量表示静态变量,可以直接通过类名来访问 用static修饰的成员方法表示静态方法,可以直接通过类名来访问 用static修饰的程序代码块表示静态代码块,当JVM加载类时,就会执行该代码块静态变量的作用类似C语言中的全局变量,Java不支持不属于任何类的全局变量静态方法中不能使用this、super关键字,也不能直接访问所属类的实例变量和实例方法(JVM无法判断它们到底属于哪个对象,在包含所属类信息的方法区内无法寻找到该量)类的构造方法用于初始化类的实例,类的静态代码块可用于初始化类,给静态变量赋值。静态代码块与静态方法一样,不能直接访问类的实例变量和实例方法,必须通过实例的引用来访问它们。以下修饰符连用,会导致编译错误:abstract + privateabstract + finalabstract + staticabstract 与 private/final 的冲突:前者无实现体,需要被继承;后者禁止被继承abstract 与 static 的冲突:静态方法能直接通过类名来访问,有实现体才有意义接口类型中声明了系统对外所提供的服务,但是不包括具体的实现 接口中的成员变量默认都是public、static、final类型的,必须被显示初始化 接口中的方法默认都是public、abstract类型的 接口没有构造方法,不能被实例化 接口不能实现其他接口,但可以继承多个接口,被称为复合接口 接口必须通过类来实现它的抽象方法(implements),当类实现了某个接口时,必须实现接口中所有的抽象方法,否则这个类必须被定义为抽象类 类只能继承一个直接父类,但能实现多个接口原因:当子类覆盖父类的实例方法,或者隐藏父类的成员变量及静态方法时,JVM采用不同的绑定规则。若允许一个类有多个直接的父类,那么绑定规则会变得复杂。在接口中只有抽象方法,没有实例变量和静态方法,一个类即使有多个接口,也不会增加动态绑定的复杂度,因为JVM将方法与它的实现类绑定,而不是与接口绑定。与接口相关的设计模式 如何设计接口?定制服务模式 提出了设计精粒度的接口的原则 两个系统之间接口不匹配时,如何处理?适配器模式 提供了接口转换方案 当系统A无法便捷地引用该系统B的接口的实现类实例时,如何处理?代理模式 提供了为系统B的接口的实现类提供代理类的解决方案适配器模式:Hibernate使用数据库连接池ConnectionPool来连接数据库,以此为例,介绍如何将适配器模式运用到实际项目中:(Java应用 - Hibernate API/Hibernate实现 - ConnectionPool API/ConnectionPool实现 数据库) 默认数据库连接池Hibernate对连接池进行了抽象,用ConnectionProvider接口作为连接池接口,提供相应实现类DriverManagerConnectionProvider 第三方数据库连接池定义了各自的API,未实现Hibernate制定的ConnectionProvider接口 DBCP连接池mons.pool.KeyedObjectPoolFmons.pool.ObjectPool C3P0连接池Com.mchange.v2.c3p0.PoolConfigCom.mchange.v2.c3p0.DataSourcesHibernate为DBCP和C3p0连接池创建了相应的适配器,使得Hibernate能够使用这些连接池。Hibernate只会访问ConnectionProvider接口,此接口有3个实现类,其中类DBCPConnectionProvider、类C3P0ConnectionProvider是适配器,分别负责将DBCP和C3P0连接池的接口转换成ConnectionProvider接口。public class DBCPConnectionProvider implements ConnectionProvider private Integer isolation;private DataSource ds;private KeyedObjectPoolFactory statementPool;/包装对象private ObjectPool connectionPool;/包装对象public Connection getConnection() throws SQLException final Connection c = ds.getConnection();if(isolation != null)c.setTransactionIsolation(Value();if(c.getAutoCommit()c.setAutoCommit(false);return c;public void closeConnection(Connection conn) throws SQLException conn.close();public void close() throws HibernateException try connectionPool.close();catche(Exception e) throw new HibernateException(could not close DBCP pool, e);public interface ConnectionProvider/初始化数据库连接池public void configure(Properties props) throws HibernateException;/从连接池中取出一个数据库连接public Connection getConnection() throws SQLException;/关闭参数指定的数据库连接public void closeConnection(Connection conn) throws SQLException;/关闭数据库连接池public void close() throws HibernateException;代理模式:代理类与委托类有同样的接口,代理类主要负责为委托类预处理消息、过滤消息及把消息转发给委托类等,代理类与委托类之间为组合关系。以房屋出租人的代理为例,介绍代理模式的运用:出租人Renter和代理人Deputy都具有RenterIFC接口,类Tenant代表租赁人,类HouseMarket代表整个房地市场,记录所有房产代理人的信息。(Tenant.rentHouse() HouseMarket.registerRenter() - Deputy.isAgree() Renter.isAgree() - Deputy.fetchRent() - Renter.fetchRent() )public interface RenterIFC /是否同意按租赁人提出的价格出租房屋public boolean isAgree(double expectedRenter);/收房租public void fetchRent(double rent);public class Renter implements RenterIFC private double rentDeadLine;private double money;public Renter(double rentDeadLine, double money) this.rentDeadLine = rentDeadLine;this.money = money;public double getRentDeadLine() return rentDeadLine;public boolean isAgree(double expectedRent) return expectedRent-this.rentDeadLine 100;public void fetchRent(double rent) money += rent;public class Deputy implements RenterIFC private Renter renter;public void registerRenter(Renter renter) this.renter = renter;public boolean isAgree(double expectedRent) if(expectedRent renter.getRentDeadLine()return false;return renter.isAgree(expectedRent);public void fetchRent(double rent) renter.fetchRent(rent);public class HouseMarket private static Set renters = new HashSet();public static void registerRenter(RenterIFC renter) renters.add(renter);public static RenterIFC findRenter() return (RenterIFC)renters.iterator().next();public class Tenant private double money;public Tenant(double money) this.money = money;public boolean rentHouse(double expectedRent) RenterIFC renter = HouseMarket.findRenter();if(!renter.isAgree(expectedRent) return false;money -= expectedRent;renter.fetchRent(expectedRent);return true;public class AppMain public static void main(String args) throws Exception /房屋出租人存款1万,房屋租金最低2000Renter renter = new Renter(2000, 10000);Deputy deputy = new Deputy();HouseMarket.registerRenter(deputy);deputy.registerRenter(renter);/房屋租赁人存款2万Tenant tenant = new Tenant(20000);tenant.rentHouse(1800);tenant.rentHouse(2300);若Tenant对象和Renter对象分布在不同的机器上(即运行在不同的JVM进程中),那么对象间进行频繁的远程通信,效率较低。可以在Tenant对象所在的机器上安置Renter对象的代理Deputy对象,Tenant对象只和Deputy对象通信,减少远程通信次数。标识类型模式:java.io.Serializable实现该接口的类的实例可以被序列化java.io.Remote实现该接口的类的实例可以作为远程对象常量接口模式:通过import static语句,类无需实现接口,就能直接访问常量接口中的静态常量。程序中处理异常,主要考虑两个问题: 如何表示异常情况? 如何控制处理异常的流程?传统编程语言:没有专门处理异常的机制,通常用 方法的特定返回值 来表示异常情况Java语言:按照面向对象的思想来处理异常,使程序具有更好的维护性 将不同类型的异常情况分类 - 异常类 异常流程的代码和正常流程代码分离,提高程序可读性,简化程序结构 便于灵活处理异常。若当前方法有能力处理异常,就捕获并处理;否则只需要抛出异常,由方法调用者来处理它。JVM方法调用栈(Java异常处理基本原理) 当一个方法正常执行完毕,JVM从调用栈中弹出该方法的栈结构,继续处理前一个方法。若执行方法的过程中抛出异常,则JVM必须找到能捕获该异常的catch代码块。 当JVM追溯到调用栈底部的方法时,依然没有找到处理该异常的代码块,将进行: 调用异常对象的printStackTrace()方法,打印来自方法调用栈的异常信息 若该线程不是主程序,终止这个线程,其他线程继续正常运行;若该线程是主线程(即方法调用栈底部为main()方法,则终止整个应用程序)e.getMessage();e.printStackTrace();确保仅仅在程序中可能出现异常的地方使用try.catch语句,如果该方法具有处理某种异常的能力,尽量自行处理,不要将异常推给方法调用
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2025年安全生产法规机关测试题集
- 2025年文化艺术行业财务岗位面试预测题及解析
- 2025年村级儿童之家保洁员招聘面试常见问题及参考答案
- 劳动合同协议范本示例
- 2025年安全员安全知识考核题解
- 2025年汽车销售顾问销售技巧测评试题及答案解析
- 2025年农业技术推广员专业知识能力测评试卷及答案解析
- 2025年景观生态规划师资格考试试题及答案解析
- 2025年职业安全卫生培训题与答案解析
- 2025年建筑装饰设计师资格考试试题及答案解析
- 放射科护理质控与安全管理
- 倍智tas人才测评系统题库及答案
- 集装箱装车安全教育
- (2025)辅警招聘考试题题库及答案
- 某电厂拆除工程施工方案
- 退伍军人贫困申请书
- 学校食堂服务承诺书
- DB51T 1174-2010 政务服务中心基础设施建设规范
- 海洋平台设备防腐施工方案
- SAPHO综合征病因介绍
- 煤矿队组精益化管理
评论
0/150
提交评论