• 1. Java基础知识讲 师 郑樱樟 2011 年 4 月 9 日
  • 2. 11. Java基础知识 1.1 Java基础知识(二级) 1.1.1 JAVA常用的类 1.1.2 JAVA语法 1.1.3 封装,继承,多态 1.1.4 内存回收机制 1.1.5 异常处理机制 1.1.6 反射机制 1.1.7 集合类 1.1.8 接口,抽象类 1.2 JSP 1.2.1 JSP语法 1.2.1 JSP应用课程大纲
  • 3. 2 1.3 Servlet 1.3.1 Servlet知识 1.3.2 Servlet与JSP,及其应用 1.4 多线程技术 1.4.1 多线程概念 1.4.2 多线程的应用 1.5 套接字编程 1.5.1 套接字基础 1.5.2 套接字 1.6 MVC模式 1.6.1 MVC概念 1.6.2 MVC应用课程大纲
  • 4. 32. J2EE框架 2.1常见的开源Struts,hibernater,Spring框架 2.1.1 struts1.2 和Struts2的使用和区别 2.1.2 Hibernater,Spring框架技术 2.2 框架知识 2.2.1 例举其他框架(其他开源,华为等),要求能灵 活应用 3. 项目实战 3.1 项目 3.1.1 实战例子 (设计一个仿真项目,要求应用到以上知识) 课程大纲
  • 5. 41.1.1 JAVA常用的类 Object类 String类和StringBuffer类 包装类 Math类 Random类 处理日期的类 BigDecimal类 1.1 Java基础知识
  • 6. 5 Object类是所有Java类的最终祖先,如果一个类在声明时没有包含extends关键词,那么这个类直接继承Object类。 Object类有一个默认构造方法,在构造子类实例时,都会先调用这个默认构造方法。 public Object(){} //方法体为空 Object类有以下主要成员方法: equals(Object obj):比较两个对象是否相等。仅当被比较的两个引用变量指向同一对象时,equals()方法才返回true。 notify():从等待池中唤醒一个线程,把它转移到s锁池。 notifyAll():从等待池中唤醒所有的线程,把他们转移到锁池。 wait():使当前线程进入等待状态,直到别的线程调用notify()或notifyAll()方法唤醒它。 hashCode():返回对象的哈希码。HashTable和HashMap会根据对象的哈希码来决定它的存放位置。 toString():返回当前对象的字符串表示,格式为“类名@对象的十六进制哈希码” 。 finalize():对于一个已经不被任何引用变量引用的对象,当垃圾回收器准备回收对象所占用的内存时,将自动调用该对象的finalize()方法。 Object类
  • 7. 6String类有以下构造方法: String():创建一个内容为空的字符串“”。 String(String value):字符串参数指定字符串的内容。 String(char[] value):字符数组参数指定字符串的内容。 String(byte[] bytes):根据本地平台默认的字符编码,由字节数组构造一个字符串。 String(byte[] bytes,String charsetName):根据参数charsetName指定的字符编码,由字节数组构造一个字符串。 String类有以下常用方法: length():返回字符串的字符个数。 char charAt(int index):返回字符串中index位置上的字符,其中index的取值范围是0~字符串长度-1。 getChars(int srcBegin,int srcEnd,char dst[],int dstbegin):从当前字符串中拷贝若干字符到参数指定的字符数组dst[]中。从srcBegin位置开始取字符,到srcEnd-1位置结束,dsbegin为提取的字符存放到字符数组中的起始位置。String类
  • 8. 7 如:String s=“0123456”; char[] chars=new char[3]; s.getChars(1,4,chars,0); //数组chars的内容为{‘1’,‘2’,‘3’} equals(Object str)和equalsIgnoreCase(object str):判断两个字符串对象的内容是否相同。两个方法的区别在于:equalsIgnoreCase()方法不区分字母的大小写,而equals()方法则区分字母的大小写。 int compareTo(String str):按字典次序比较两个字符串的大小。如果源串较小,则返回一个小于0的值,如果相等则返回0,否则返回一个大于0的值。String类实现了Comparable接口,支持自然排序,所以提供这一方法。 如:System.out.println(“a”.compareTo(“b”)); //打印-1 System.out.println(“a”.compareTo(“a”)); //打印0 System.out.println(“b”.compareTo(“a”)); //打印1 indexOf()和lastIndexOf():在字符串检索特定字符或子字符串。indexOf()方法从字符串的首位开始查找,而lastIndexOf()方法从字符串的末尾开始查找。如果找到,就返回匹配成功的位置,如果没有找到,就返回-1。例: String str=“HelloHelloHello”; //查找字符“e”第一次在str中出现的位置 System.out.println(str.indexOf(‘e’)); //打印1 //查找字符“e”从位置2开始第一次在str中出现的位置 System.out.println(str.indexOf(‘e’,2)); //打印6String类的方法
  • 9. 8 //查找字符“e”在str中最后一次出现的位置 System.out.println(str.lastIndexOf(‘e’)); //打印11 //查找字符串“ello”从位置2开始第一次在str中出现的位置 System.out.println(str.indexOf(“ello”,2)); //打印6 //查找字符串“Ello”第一次在str中出现的位置 System.out.println(str.indexOf(“Ello”)); //打印-1 concat(String str):把字符串str附加在当前字符串的末尾。concat()方法并不会改变字符串本身的内容。如: String str=“Hello”; String newStr=str.concat(“World”); System.out.println(str); //打印Hello System.out.println(newStr); //打印HelloWorld substring():返回字符串的一个子字符串,有以下两种重载形式: public String substring(int beginIndex) 或者: public String substring(int beginIndex,int endIndex) 子串在源串中的起始位置为beginIndex,结束位置为endIndex-1。如果没有提供endIndex参数,那么结束位置为字符串长度-1。 String类的方法
  • 10. 9 如:String str=“0123456”; String sub1=str.substring(2); String sub2=str.substring(2,5); System.out.println(str); //打印0123456 System.out.println(sub1); //打印23456 System.out.println(sub2); //打印234 String[] split(String regex):根据参数把原来的字符串分割为几个子字符串。 public static void main(String[] args)throws Exception{ String[] result; String str=“user=Linda”; result=str.split(“=”); //result={“user”,”Linda”} str=“11:23:14”; result=str.split(“:”); //result={“11”,”23”,”14”} str=“11::14”; result=str.split(“:”); //result={“11”,””,”14”} String类的方法
  • 11. 10replaceAll(String regex,String replacement)和replaceFirst(String regex,String replacement):把源字符串中的regex替换为replacement。replaceAll()方法替换源字符串所有的regex,而replaceFirst()方法替换源字符串的第一个regex。例如: String origin=“11:23:14”; //把字符串中的所有“:”替换为“-” String dst=orgin.replaceAll(“:”,”-”); System.out.println(dst); //打印11-23-14 //把字符串中的第一个“:”替换为“-” dst=origin.replaceFirst(“:”,”-”); System.out.println(dst); //打印11-23:14 trim():把字符串首尾的空格删除。例如: System.out.println(“ hel lo ”.trim()); //打印“hel lo” String valueOf():把基本类型转换为String类型,有好几种重载形式,如valueOf(int a)、valueOf(short a)和valueOf(double a)等。 toUpperCase()和toLowerCase():toUpperCase()把字符串中的所有字母改为大写,toLowerCase()把字符串中所有的字母改为小写。String类的方法
  • 12. 11以下两种方式都定义了两个内容为“hello”的字符串: 方式一:String s1=“hello”, s2=“hello”; 方式二:String s1=new String(“hello”), s2=new String(“hello”); 在第一种方式中,“hello”为直接数,Java虚拟机把它作为编译时常量,在内存中只会为它分配一次内存,然后就可以重复使用,因此s1==s2的比较结果为true。在第二种方式中,每个new语句都会新建一个String对象,因此s1==s2的比较结果为false。 从提高程序性能的角度考虑,减少Java虚拟机为对象分配内存及回收内存的次数,可以减轻Java虚拟机的负担,从而提高程序性能。因此如果在编程时就明确知道字符串的内容,应该用字符串直接数来为String类型变量赋值。 “hello”与new String(“hello”)的区别
  • 13. 12StringBuffer类表示字符串缓存,它有以下构造方法: StringBuffer():建立一个空的缓冲区,默认长度为16。 StringBuffer(int length):建立一个长度为length的空缓冲区。 StringBuffer(String str):缓冲区的初始内容为字符串str,并提供了16个字符的空间供再次分配。 StringBuffer类
  • 14. 13StringBuffer类有以下常用方法: length():返回字符串的字符个数,与String类的length()用法相同。 append():向缓冲区内添加新的字符串,例如: StringBuffer sb=new StringBuffer(); sb.append(“Hello”); sb.append(“World”); System.out.println(sb); //打印HelloWorld toString():返回缓冲区内的字符串。 charAt(int index)和setCharAt(int index,char ch):charAt()用法与String类的charAt()相同,都返回字符串中index位置的字符;setCharAt()则在字符串中index位置放置字符ch。 getChars(int srcBegin,int srcEnd,char[] dst,int dstBegin):用法与String类的getChars()方法相同。 Substring():用法与String类的substring()方法相同。 Insert(int offset,String str):在字符串中的offset位置插入字符串str,例如: StringBuffer sb=new StringBuffer(“0456”); sb.insert(1,”123”); System.out.println(sb); //打印0123456 StingBuffer类的方法
  • 15. 14String类和StringBuffer类有以下相同点: String类和StringBuffer类都用来处理字符串。 String类和StringBuffer类都提供了length()、toString()、charAt()和substring()方法,它们的用法在两个类中相同。 对于String 类和StringBuffer类,字符在字符串中的索引位置都从0开始。 两个类中的substring(int beginIndex,int endIndex)方法都用来截取子字符串,而且截取的范围都从beginIndex开始,一直到endIndex-1为止,截取的字符个数为endIndex-beginIndex。 String类和StringBuffer类有以下不同点: String类是不可变类,而StringBuffer类是可变类。 String类覆盖了Object类的equals()方法,而StringBuffer类没有覆盖Object类的equals()方法。 两个类都覆盖了Object类的toString()方法,但各自的实现方式不一样。 String类对象可以用操作符“+”进行连接,而StringBuffer类对象之间不能通过操作符“+”进行连接。比较String类与StringBuffer类
  • 16. 15Java语言用包装类来把基本类型数据转换为对象。每个Java基本类型在java.lang包中都有一个相应的包装类。 基本类型与包装类的对应 基本类型 对应的包装类 boolean Boolean byte Byte char Character short Short int Integer long Long float Float double Double 包装类
  • 17. 16每个包装类的构造方法都有几种重载形式,归纳如下: 所有的包装类都可以用和它对应的基本类型数据作为参数,来构造它们的实例。例如: Boolean bln=new Boolean(true); Byte b=new Byte(byte 1); 除Character类以外,其他的包装类都可以以字符串为参数来构造它们的实例。例如: Integer I =new Integer(“123”); Double d=new Double(“123.45D”); 当Boolean类的构造方法的参数为String类型时,如果该字符串内容为true(不考虑大小写),则该Boolean对象表示true,否则表示false。例如: System.out.println(new Boolean(“trUe”)); //打印true System.out.println(new Boolean(“aaaa”)); //打印false 4. 当Byte、Short、Integer、Long、Float和Double类的构造方法的参数为String类型时,字符串不能为null,并且该字符串必须可以解析为相应的基本类型的数据,否则虽编译通过,但运行时回抛出NumberFormatException运行时异常。包装类的构造方法
  • 18. 17Character类和Boolean类直接继承Object类,除此之外,其他包装类都是java.Number的直接子类,因此都继承或者覆盖了Number类的方法。 包装类的层次结构 Number类的主要方法如下: byteValue():返回Number对象所表示的数字的byte类型值。 intValue():返回Number对象所表示的数字的int类型值。 longValue():返回Number对象所表示的数字的long类型值。 shortValue():返回Number对象所表示的数字的short类型值。 doubleValue():返回Number对象所表示的数字的double类型值。 floatValue():返回Number对象所表示的数字的float类型值。包装类的常用方法ObjectNumberByte Short Integer Long Float DoubleCharacter Boolean
  • 19. 18包装类都覆盖了Object类的toString()方法,以字符串的形式返回包装对象所表示的基本类型数据。 除Character类和Boolean类以外,包装类都有valueOf(String s)静态工厂方法,可以根据String类型的参数来创建包装类对象。参数字符串不能为null,而且该字符串必须可以解析为相应的基本类型的数据,否则虽然编译会通过,但运行时会抛出NumberFormatException。 除Character类和Boolean类以外,包装类都有parseXXX(String str)静态方法,把字符串转换为相应的基本类型的数据(XXX表示基本数据类型的名称)。参数str不可以为null,而且该字符串必须可以解析为相应的基本类型的数据,否则虽然编译会通过,但运行时会抛出NumberFormatException。 包装类的方法归纳如下
  • 20. 19java.lang.Math类提供了许多用于数学运算的静态方法,包括指数运算、对数运算、平方根运算和三角运算等。Math类还有两个静态常量:E(自然对数)和PI(圆周率)。Math类是final类型的,因此不能有子类。另外,Math类的构造方法是private类型的,因此Math类不能够被实例化。 Math类的主要方法包括以下几种: abs():返回绝对值。 ceil():返回大于或等于参数的最小整数。 floor():返回小于或等于参数的最大整数。 max():返回两个参数的较大值。 min():返回两个参数的较小值。 random():返回0.0和1.0之间的double类型的随即数,包括0.0,但不包括1.0。 round():返回四舍五入的整数值。 sin():正弦函数。 cos():余弦函数。 tan():正切函数。 exp():返回自然对数的幂。 sqrt():平方根函数。 pow():幂运算。 Math类
  • 21. 20java.util.Random类提供了一系列用于生成随即数的方法。 nextInt():返回下一个int类型的随即数,随即数的值大于或等于0。 nextInt(int n):返回下一个int类型的随即数,随即数的值大于或等于0,并且小于参数n。 nextLong():返回下一个long类型的随即数,随即数的值位于long类型的取值范围内。 nextFloat():返回下一个float类型的随即数,随即数的值大于或等于0,并且小于1.0。 nextDouble():返回下一个double类型的随即数,随即数的值大于或等于0,并且小于1.0。 nextBoolean():返回下一个boolean类型的随即数,随即数的值为true或false。 Random类
  • 22. 21Java语言提供了以下3个类来处理日期: java.util.Date:包装了一个long类型数据,表示与GMT(格林尼治标准时间)的1970年1月1日00:00:00这一刻所相距的豪秒数。 java.text.DateFormat:对日期进行格式化。 java.util.Calendar:可以灵活地设置或读取日期中的年、月、日、时、分和秒等信息。 处理日期的类
  • 23. 22Date类以豪秒来表示特定的日期。例如: Date date=new Date(); //创建一个代表当前日期和时间的Date对象 System.out.println(date.getTime()); //getTime()方法返回Date对象包含的豪秒数 System.out.println(date); 以上程序打印结果为: 1143096401969 Thu Mar 23 14:46:41 CST 2006 Date类的默认构造方法调用System.currentTimeMillis()方法获取当前时间,new Date()语句等价于:new Date(System.currentTimeMillis()); Date类
  • 24. 23Java.text.DateFormat抽象类用于定制日期的格式,它有一个具体子类为java.text.SimpleDateFormat,用法如下: Date date=new Date(); //设定日期格式 SimpleDateFormat f=new SimpleDateFormat(“yyyy-MMMM-dd-EEEE”); System.out.println(f.format(date)); //打印2006-三月-23-星期四 //设定日期格式 f=new SimpleDateFormat(“yy/MM/dd hh:mm:ss”); System.out.println(f.format(date)); //打印06/03/23 02:59:55 DateFormat类
  • 25. 24DateFormat类的parse(String text())方法按照特定的格式把字符串解析为日期对象。 Date d=new SimpleDateFormat(“yyyy/mm/dd hh:mm:ss”).parse(2006/11/25 10:25:54); System.out.println(d); DateFormat有一个静态方法:getDateTimeInstance(int dateStyle,int timeStyle)。该方法返回表示标准格式的DateFormat对象,参数dateStyle设定日期风格,参数timeStyle设定时间风格,这两个参数的可选值都包括:DateFormat.SHORT、DateFormat.MEDIUM、DateFormat.LONG和DateFormat.FULL。 DateFormat类
  • 26. 25java.util.Calendar类的set()和get()方法可用来设置和读取日期的特定部分,比如年、月、日、时、分和秒等。Calendar类是抽象类,不能实例化,它有一个具体的子类,即java.util.GregorianCalendar。 GregorianCalendar采用格林尼治标准时间,它的基本用法如下: GregorianCalendar cal=new GregorianCalendar(); //表示当前日期 System.out.println(new SimpleDateFormat(“yyyy-MM-dd hh:mm:ss EEEE”).format(cal.getTime())); cal.clear(); //清除日期的各个部分 cal.set(Calendar.YEAR,2006); //重新设置年 cal.set(Calendar.MONTH,Calendar.JULY); //重新设置月 cal.set(Calendar.DAY_OF_MONTH,15); //重新设置日 cal.set(Calendar.HOUR_OF_DAY,12); //重新设置小时 cal.set(Calendar.MINUTE,33); //重新设置分 cal.set(Calendar.SECOND,55); //重新设置秒 System.out.println(new SimpleDateFormat(“yyyy-MM-dd hh:mm:ss EEEE”).format(cal.getTime())); 以上程序打印结果如下: 2006-03-23 03:53:31 星期四 2006-07-15 12:33:55 星期六 Calendar类
  • 27. 26如果实际应用程序允许存在适当的误差,那么可以使用float或double类型。如果需要进行精确运算,则应该使用java.math.BigDecimal类。BigDecimal类支持浮点数的精确加法、减法和乘法运算,对于浮点数的除法运算,可以满足用户指定的精度。BigDecimal类包括以下方法: add(BigDecimal b):进行精确的加法运算 subtract(BigDecimal b):进行精确的减法运算 multiply(BigDecimal b):进行精确的乘法运算 divide(BigDecimal b,int scale,RoundingMode mode):进行除法运算。参数 scale指定需要精确到小数点以后几位。参数mode指定小数部分的舍入模式,如果取值为BigDecimal.ROUND_HALF_UP,则表示采用四舍五入模式。 BigDecimal类
  • 28. 27Java代码的落脚点 Java是严格区分大小写的 Java是一种自由格式的语言 Java程序的注释 Java中的标识符 Java的关键字 Java中的常量 1.1.2 JAVA语法
  • 29. 28 Java中的所有程序代码都必须存在一个类中,用class关键字定义类,在class前面可以有一些修饰符。格式如下: 修饰符 class 类名{ 程序代码 } Java代码的落脚点
  • 30. 29 Java中不能将class写成Class。在程序中定义一个标识符computer的同时,还可以定义一个Computer,computer和Computer是两个完全不同的符号,所以我们在使用的时候要特别注意。 Java是严格区分大小写的
  • 31. 30 在Java中,所有的程序代码分为结构定义语句和功能执行语句,一条语句可以写在若干行上,功能执行语句的最后必须用分号(;)结束,不必要对齐和缩进。可以按自己的意愿任意编排,只要每个词之间用空格、制表符、换行符或大括号、小括号这样的分隔符隔开就好。 注意: 1. Java程序中一句连续的字符串不能分开在两行中写,下面这种写法是会编译出错的: class Test{public static void main(String []args){ System.out.println(“my first java program”);}} 如果一个字符串太长,我们可以先将这个字符串分成两个字符串,再用加号(+)将两个字符串连起来,然后再加号(+)处断行: System.out.println(“my first java “ + ” program”); 2. 注意英文分号(;)和中文分号(;) Java是一种自由格式的语言
  • 32. 31 为程序添加注释可以用来解释程序的某些部分的作用和功能,提高程序的可**读性。此外还可以使用注释来暂时屏蔽某些程序语句,使得编译器暂时不理会这些语句,等到需要时,直接取消注释标记即可再次使用。Java里的注释根据不同的用途分为如下三种类型:单行注释、多行注释、文档注释。 单行注释:就是在语句前面加双斜线(//),如: int a = 10 ; //定义一个整型 多行注释:在注释内容的前面以单斜线加星型标记(/*),在注释内容的结尾以星型标记加单斜线(*/)结束。此类型适用于注释内容超过一行的情况,如:/*int a = 10 ; //定义一个整型 int b = 5 ; */ 文档注释:以单斜线加两个星型标记(/**),并以一个星型标记加单斜线(*/)结束。用这种方法注释的内容会被解释成程序的正式文档,并能包含进诸如javadoc之类的工具程序生成的文档里,用以说明改程序的层次机构及其方法。 注意:/*…*/可以嵌套“//”,但不能嵌套“/*…*/”Java程序的注释
  • 33. 32 Java中的包、类、方法、参数和变量的名字,可由任意顺序的大小写字母、数字、下划线(_)和美元符号($)组成,但标识符不能以数字开头,不能是Java中的保留关键字。例: 合法的标识符: username user_name _username $username 非法的标识符: 98.6 class Java中的标识符
  • 34. 33如果实际应用程序允许存在适当的误差,那么可以使用float或double类型。如果需要进行精确运算,则应该使用java.math.BigDecimal类。BigDecimal类支持浮点数的精确加法、减法和乘法运算,对于浮点数的除法运算,可以满足用户指定的精度。BigDecimal类包括以下方法: add(BigDecimal b):进行精确的加法运算 subtract(BigDecimal b):进行精确的减法运算 multiply(BigDecimal b):进行精确的乘法运算 divide(BigDecimal b,int scale,RoundingMode mode):进行除法运算。参数 scale指定需要精确到小数点以后几位。参数mode指定小数部分的舍入模式,如果取值为BigDecimal.ROUND_HALF_UP,则表示采用四舍五入模式。 Java的关键字
  • 35. 34 常量就是程序里持续不变的值,它是不能改变的数据。Java中的常量包含整型常量、浮点数常量、布尔常量等。 1. 整型常量 整形常量可以分为十进制、十六进制和八进制。 十进制:0 1 2 3 4 5 6 7 8 9 注意:以十进制表示时,第一位不能是0 十六进制:0 1 2 3 4 5 6 7 8 9 a b c d e f A B C D E F 注意:以十六进制表示时,必须以0x或0X开头,如: 0x8a 0Xff 0X9A 0x12 八进制:0 1 2 3 4 5 6 7 注意:八进制必须以0开头,如:0123 045 长整型:长整型必须以L做结尾,如:9L 123L Java中的常量
  • 36. 35 2. 浮点数常量 浮点数常量有float(32位)和double(64位)两种类型,分别叫做单精度浮点数和双精度浮点数,表示浮点数时,要在后面加上f(F)或者d(D),用指数表示也可以。注意:由于小数常量的默认类型为double型,所以float类型的后面一定要加f(D),用以区分。如: 2e3f 3.6d 4f 0f 3.84d 2.02e+23f 3. 布尔常量 布尔常量用以区分一个事物的正反两面,只有真假两种: true和false 4. 字符常量 字符常量是有英文字母、数字、转义序列、特殊字符等字符所表示,它的值就是字符本身,字符常量要用两个单引号括起来。Java中的字符占两个字节,是用Unicode码表示的,也可以用Unicode码加上“\u”来表示对应的字符。如:’a’ ‘8’ ‘\t’ ‘\u0027’
  • 37. 36 5. 字符串常量 字符串常量和字符常量的区别在于,前者是用双引号括起来的常量,用于表示一连串的字符,而后者是用单引号括起来的,用于表示单个字符。如:”hello world” ”32423” ”welcome \nxxx” 注意:此处的单引号和双引号都是英文的,不要写成中文。 6. null常量 null常量只有一个值,用null表示,表示对象的引用为空。
  • 38. 37 所有面向对象的编程语言都提供帮助你实现面向对象模型的机制,这些机制就是封装、继承及多态性,这也是面向对象编程的3个原则。 1. 封装 即将代码及其处理的数据绑定在一起的一种编程机制,该机制保证了程序和数据都不受外部干扰且不被误用。Java封装的基本单元是类,类中定义了将被一个对象集共享的方法与数据。类中的私有方法和数据仅能被一个类的成员代码所访问,其他任何不是类的成员的代码都不能访问私有的方法或变量。既然类的私有成员仅能被程序中的其他部分通过该类的公共方法访问,那么你就能保证不希望发生的事情就一定不会发生。 2. 继承 继承是一个对象获得另一个对象的属性的过程。它与封装是相互作用的,如果一个给定的类封装了一些属性,那么它的任何子类将具有同样的属性,并且还添加了子类自己特有的属性。1.1.3 封装,继承,多态
  • 39. 38 3. 多态 多态是允许一个借口被多个同类动作使用的特性,具体使用哪个动作与应用场合无关。多态的概念经常被说成“一个接口,多个方法”。这意味着可以为一组相关的动作设计一个通用的接口。多态性允许同一个接口被同一类的多个动作使用,这样就降低了程序的复杂性。并且选择应用于每一种情形的特定的动作时编程器的任务,程序员无需进行手工选择。
  • 40. 39 在java运行环境中,始终存在着一个系统级的线程,专门跟踪内存的使用情况,定期检测出不再使用的内存,并进行自动回收,避免了内存的泄露,也减轻了程序员的工作量。 1.1.4 内存回收机制
  • 41. 401.1.5 异常处理机制 异常是在运行代码序列中产生一种异常情况。换句话说,异常是一个运行时错误。 Java异常是一个描述在代码段中发生的异常情况的对象。当异常情况发生时,一个代表该异常的对象被创建并且在导致该错误的方法中被引发。该方法可以选择自己处理异常或传递该异常。两种情况下,该异常被捕获并处理。异常可能有Java运行系统产生,也可能有手工代码产生。 Java异常处理有5个关键字控制:try、catch、throw、throws和finally。其工作过程为:将程序中可能的异常监控包含在一个try块中。如果在try块中发生异常,它被抛出。代码可以用catch捕获这个异常并用某种合理的方法处理该异常。系统产生的异常被Java运行时系统自动引发。手动引发一个异常,用关键字throw。任何被引发的异常都必须通过throws字句定义。任何在方法返回前绝对被执行的代码被放置在finally块中。
  • 42. 41 下面是异常处理块的通常形式: try{ //block of code to monitor for errors } catch(ExceptionType1 exob){ //exception handler for ExceptionType1 } catch(ExceptionType2 exob){ //exception handler for ExceptionType2 } finally{ //block of code to be executed before try block ends }
  • 43. 421.1.6 反射机制 JAVA反射机制是在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法;对于任意一个对象,都能够调用它的任意一个方法;这种动态获取的信息以及动态调用对象的方法的功能称为java语言的反射机制。   Java反射机制主要提供了以下功能: 在运行时判断任意一个对象所属的类;在运行时构造任意一个类的对象;在运行时判断任意一个类所具有的成员变量和方法;在运行时调用任意一个对象的方法;生成动态代理。
  • 44. 431.1.7 集合类理解集合类: 集合类存放于java.util包中。集合类中存放的都是对象的引用,而非对象本身,它包括以下三种类型:set(集)、list(列表)和map(映射)。 1. 集 集(set)是最简单的一种集合,它的对象不按特定方式排序,只是简单的把对象加入集合中,就像往口袋里放东西。 对集中成员的访问和操作是通过集中对象的引用进行的,所以集中不能有重复对象。 集也有多种变体,可以实现排序等功能,如TreeSet,它把对象添加到集中的操作将变为按照某种比较规则将其插入到有序的对象序列中。它实现的是SortedSet接口,也就是加入了对象比较的方法。通过对集中的对象迭代,我们可以得到一个升序的对象集合。
  • 45. 44 2. 列表 列表的主要特征是其对象以线性方式存储,没有特定顺序,只有一个开头和一个结尾,当然,它与根本没有顺序的集是不同的。 列表在数据结构中分别表现为:数组和向量、链表、堆栈、队列。 3. 映射 映射与集或列表有明显区别,映射中每个项都是成对的。映射中存储的每个对象都有一个相关的关键字(Key)对象,关键字决定了对象在映射中的存储位置,检索对象时必须提供相应的关键字,就像在字典中查单词一样。关键字应该是唯一的。 关键字本身并不能决定对象的存储位置,它需要对过一种散列(hashing)技术来处理,产生一个被称作散列码(hash code)的整数值,散列码通常用作一个偏置量,该偏置量是相对于分配给映射的内存区域起始位置的,由此确定关键字/对象对的存储位置。理想情况下,散列处理应该产生给定范围内均匀分布的值,而且每个关键字应得到不同的散列码。
  • 46. 45集合类简介: java.util中共有13个类可用于管理集合对象,它们支持集、列表或映射等集合。 1. 集 HashSet: 使用HashMap的一个集的实现。虽然集定义成无序,但必须存在某种方法能相当高效地找到一个对象。使用一个HashMap对象实现集的存储和检索操作是在固定时间内实现的. TreeSet: 在集中以升序对对象排序的集的实现。这意味着从一个TreeSet对象获得第一个迭代器将按升序提供对象。TreeSet类使用了一个TreeMap.
  • 47. 46 2. 列表 Vector: 实现一个类似数组一样的表,自动增加容量来容纳你所需的元素。使用下标存储和检索对象就象在一个标准的数组中一样。你也可以用一个迭代器从一个Vector中检索对象。Vector是唯一的同步容器类??当两个或多个线程同时访问时也是性能良好的。 Stack: 这个类从Vector派生而来,并且增加了方法实现栈??一种后进先出的存储结构。 LinkedList: 实现一个链表。由这个类定义的链表也可以像栈或队列一样被使用。 ArrayList: 实现一个数组,它的规模可变并且能像链表一样被访问。它提供的功能类似Vector类但不同步。
  • 48. 47 3. 映射 HashTable: 实现一个映象,所有的键必须非空。为了能高效的工作,定义键的类必须实现hashcode()方法和equal()方法。这个类是前面java实现的一个继承,并且通常能在实现映象的其他类中更好的使用。 HashMap: 实现一个映象,允许存储空对象,而且允许键是空(由于键必须是唯一的,当然只能有一个)。 WeakHashMap: 实现这样一个映象:通常如果一个键对一个对象而言不再被引用,键/对象对将被舍弃。这与HashMap形成对照,映象中的键维持键/对象对的生命周期,尽管使用映象的程序不再有对键的引用,并且因此不能检索对象。 TreeMap: 实现这样一个映象,对象是按键升序排列的。
  • 49. 48 Set和List都是由公共接口Collection扩展而来,所以它们都可以使用一个类型为Collection的变量来引用。这就意味着任何列表或集构成的集合都可以用这种方式引用,只有映射类除外(但也不是完全排除在外,因为可以从映射获得一个列表。)所以说,把一个列表或集传递给方法的标准途径是使用Collection类型的参数。
  • 50. 491.1.8 接口,抽象类接口、抽象类定义: 接口:是一系列方法的声明,是一些方法特征的集合,一个接口只有方法的特征没有方法的实现,因此这些方法可以在不同的地方被不同的类实现,而这些实现可以具有不同的行为(功能)。 接口作为系统与外界交互的窗口,接口体现的是一种规范。对于接口的实现者而言,接口规定了实现者必须向外提供哪些服务(以方法的形式提供); 对于接口的调用者而言,接口规定了调用者可以调用哪些服务,以及如何调用这些服务(就是如何来调用方法)。当在一个程序中使用的接口时,接口是多个模块间的耦合杳无音信当在多个应用程序之间使用接口时,接口是多个程序之间的通信标准。   从某种程序上来看,接口整个系统的“总纲”,它制定了系统各模块应该遵循的标准,因此一系统中的接口不应该经常改变。一旦接口被改变,对整个系统甚至其他系统的影响将是辐射式的,导致系统中大部分类都需要重写。
  • 51. 50 抽象类:用 abstract 修饰的类是抽象类,该类中可能已经有一些方法的具体定义。 抽象类作为系统中多个子类的父类,它所体现的是一种模板式设计。抽象类作为多个子类的抽象父类,可以被当成系统实现过程中的中间产品,这个中间产品已经实现了系统的部分功能(那些已经提供实现的方法),但这个产品依然不能当成最终产品,必须有更进一步完善,它种完善可能有几种不同的方式。 接口与抽象类的共同点: 1. 接口和抽象类都不能被实例化,它们都位于继承树的顶端,用于 被其他类继承和实现。 2. 接口和抽象类都包含抽象方法,实现接口和继承抽象类的普通子 类都必须实现这些抽象方法。 3.派生类必须实现未实现的方法,抽象类是抽象方法,接口则是所 有成员(不仅是方法还包括其他成员)。
  • 52. 51 接口与抽象类的区别: 1. 接口里只能包含抽象方法,不包含已经提供实现的方法;抽象类 则完全可以包含普通方法。 2. 接口里不可以定义静态方法;抽象类则可以定义静态方法。 3. 接口里只能定义静态常量,不能定义普通常量;抽象类则可以定 义普通常量,也可以定义静态常量。 4. 接口不包含构造器;抽象类可以包含构造器,抽象类中的构造器 并不是用于创建对象,而是让其子类调用这些构造器来完成属于 抽象类的初始化操作。 5. 接口中不包含初始化块;抽象类中完全可以包含初始化块。 6. 一个类最多只能有一个直接父类,包括抽象类;但一个类可以直 接实现多个接口,可以通过实现多个接口弥补Java间继承的不足。
  • 53. 521.2 JSP 1.2.1 JSP语法 1.2.2 JSP应用
  • 54. 531.2.1 JSP语法 JSP语法(1)——HTML注释 JSP语法(2)——隐藏注释 JSP语法(3)——声明 JSP语法(4)——表达式 JSP语法(5)——Scriptlet JSP语法(6)——Page指令 JSP语法(7)——Taglib指令 JSP语法(8)—— JSP语法(9)—— JSP语法(10)—— JSP语法(11)—— JSP语法(12)——
  • 55. 54JSP语法(1)——HTML注释 HTML 注释:在客户端显示一个注释. JSP 语法: 例子 1: 在客户端的HTML源代码中产生和上面一样的数据: 例子 2: 在客户端的HTML源代码中显示为: 描述: 这种注释和HTML中很像,也就是它可以在"查看源代码"中看到。 唯一有些不同的就是,你可以在这个注释中用表达式(例子2所示)。这个表达示是不定的,由页面不同而不同,你能够使用各种表达式,只要是合法的就行。
  • 56. 55JSP语法(2)——隐藏注释 隐藏注释 :写在JSP程序中,但不是发给客户。 JSP 语法:<%-- comment --%> 例子: <%@ page language="java" %> A Comment Test

    A Test of Comments

    <%-- This comment will not be visible in the page source --%> 描述: 用隐藏注释标记的字符会在JSP编译时被忽略掉。这个注释在你希望隐藏或注释你的JSP程序时是很有用的。JSP编译器不是会对<%--and--%>之间的语句进行编译的,它不会显示在客户的浏览器中,也不会在源代码中看到在<%-- --%>之间。
  • 57. 56JSP语法(3)——声明 声明 :在JSP程序中声明合法的变量和方法 JSP 语法:<%! declaration; [ declaration; ]+ ... %> 例子: <%! int i = 0; %> <%! int a, b, c; %> <%! Circle a = new Circle(2.0); %> 描述: 你可以一次性声明多个变量和方法,只要以“;”结尾就行,当然这些声明在Java中要是合法的。 当你声明方法或变量时,请注意以下的一些规则: 声明必须以“;”结尾(Scriptlet有同样的规则,但是表达式就不同了). 你可以直接使用在<% @ page %>中被包含进来的已经声明的变量和方法,不需要对它们重新进行声明。 一个声明仅在一个页面中有效。如果你想每个页面都用到一些声明,最好把它们写成一个单独的文件,然后用<%@ include %>或元素包含进来。
  • 58. 57JSP语法(4)——表达式 表达式 :包含一个符合JSP语法的表达式 JSP 语法:<%= expression %> 例子: <%= map.size() %> <%= numguess.getHint() %>. 描述: 表达式元素表示的是一个在脚本语言中被定义的表达式,在运行后被自动转化为字符串,然后插入到这个表达示在JSP文件的位置显示。因为这个表达式的值已经被转化为字符串,所以你能在一行文本中插入这个表达式(形式和ASP完全一样)。 当你在JSP中使用表达式时请记住以下几点: 你不能用一个分号(";")来作为表达式的结束符.但是同样的表达式用在scriptlet中就需要以分号来结尾了!查看Scriptlet 这个表达式元素能够包括任何在Java Language Specification中有效的表达式.
  • 59. 58JSP语法(5)——Scriptlet Scriptlet:包含一个有效的程序段. JSP 语法:<% code fragment %> 例子: <% ("name") == null) { %> <%@ include file="error.html" %> <% } else { foo.setName(request.getParameter("name")); if (foo.getName().equalsIgnoreCase("integra")) name = "acura"; if (name.equalsIgnoreCase( "acura" )) { %>
  • 60. 59JSP语法(5)——Scriptlet 描述: 一个scriptlet能够包含多个jsp语句,方法,变量,表达式 因为scriptlet,我们便能做以下的事: 声明将要用到的变量或方法(参考 声明); 编写JSP表达式(参考 表达式); 使用任何隐含的对象和任何用声明过的对象编写 JSP语句 (如果你在使用Java语言,这些语句必须遵从Java Language Specification,); 任何文本,HTML标记,JSP元素必须在scriptlet之外 ; 当JSP收到客户的请求时,scriptlet就会被执行,如果scriptlet有显 示的内容,这些显示的内容就被存在out对象中。
  • 61. 60JSP语法(6)——Page指令 Page 指令 :定义JSP文件中的全局属性. JSP 语法 <%@ page [ language="java" ] [ extends="package.class" ] [ import="{package.class | package.*}, ..." ] [ session="true | false" ] [ buffer="none | 8kb | sizekb" ] [ autoFlush="true | false" ] [ isThreadSafe="true | false" ] [ info="text" ] [ errorPage="relativeURL" ] [ contentType="mimeType [ ;charset=characterSet ]" | "text/html ; charset=ISO-8859-1" ] [ isErrorPage="true | false" ] %>
  • 62. 61JSP语法(6)——Page指令 例子: <%@ page import=“java.util.*, java.lang.*” %> <%@ page buffer=“5kb” autoFlush=“false” %> <%@ page errorPage=“error.jsp” %> 描述: <%@ page %>指令作用于整个JSP页面,同样包括静态的包含文件。但是<% @ page %>指令不能作用于动态的包含文件,比如 你可以在一个页面中用上多个<% @ page %>指令,但是其中的属性只能用一次,不过也有个例外,那就是import属性。因为import属性和Java中的import语句差不多(参照Java Language),所以你就能多用此属性几次了. 无论你把<% @ page %>指令放在JSP的文件的哪个地方,它的作用范围都是整个JSP页面。不过,为了JSP程序的可读性,以及好的编程习惯,最好还是把它放在JSP文件的顶部.
  • 63. 62JSP语法(7)——Taglib指令 Tablib指令:定义一个标签库以及其自定义的前缀。 JSP语法:<%@ taglib uri="URIToTagLibrary" prefix="tagPrefix" %> 例子: <%@ taglib uri=“http://www.jspcentral.com/tags” prefix=“public” %> . . 描述: <% @ taglib %>指令声明此JSP文件使用了自定义的标签,同时引用标签库,也指定了他们的标签的前缀。 这里自定义的标签含有标签和元素之分。因为JSP文件能够转化为XML,所以了解标签和元素之间的联系很重要。标签只不过是一个在意义上被抬高了点的标记,是JSP元素的一部分。JSP元素是JSP语法的一部分,和XML一样有开始标记和结束标记。元素也可以包含其它的文本,标记,元素。比如,一个jsp:plugin元素有开始标记和结束标记,同样也可以有元素. 你必须在使用自定义标签之前使用<% @ taglib %>指令,而且你可以在一个页面中多次使用,但是前缀只能使用一次
  • 64. 63JSP语法(8)—— : 重定向一个HTML文件,JSP文件,或者是一个程序段. JSP 语法 "} /> or "} > + 例子:
  • 65. 64JSP语法(9)—— 获取Bean的属性值,用于显示在页面中    JSP 语法       例子      

      Calendar of   

  • 66. 65JSP语法(10)——    包含一个静态或动态文件.    JSP 语法       or       +      示例   
  • 67. 66JSP语法(11)——    执行一个applet或Bean,有可能的话还要下载一个Java插件用于执行它.    JSP 语法      [   [ ]+    ]   [ text message for user ]       例子                  

    Unable to load applet

      
      
  • 68. 67JSP语法(12)—— 指的是创建一个Bean实例并指定它的名字和作用范围. JSP 语法    |   > other elements   } 例子               
  • 69. 68内 容课程总结
  • 70. 保密须知:本文件及其书面或其他任何形式的附件乃以保密形式提供,其著作权归属于本公司,仅供阁下内部使用。未经过本公司的审核、确认及书面授权,阁下不得以任何方式在任何媒体(包括互联网)上公开引用或在阁下的任何资料中引用本文件及其附件中的任何数据和信息,不得以任何方式将本文件及其附件中的任何内容提供、披露给其他单位或个人。敬希阁下与我们共同遵守法律。