《Java基础课程培训》PPT课件.ppt_第1页
《Java基础课程培训》PPT课件.ppt_第2页
《Java基础课程培训》PPT课件.ppt_第3页
《Java基础课程培训》PPT课件.ppt_第4页
《Java基础课程培训》PPT课件.ppt_第5页
已阅读5页,还剩55页未读 继续免费阅读

下载本文档

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

文档简介

Java基础,褚蕊蕊2011-6-16,Agenda,Java初级Java进阶Q输出a的ASCII码97,基本数据类型的包装类,Java是一种面向对象语言,java中的类把方法与数据连接在一起,并构成了自包含式的处理单元。但在Java中不能定义基本类型(primitivetype),为了能将基本类型视为对象来处理,并能连接相关的方法,Java为每个基本类型都提供了包装类。包装类:Boolean,Byte,Short,Character,Integer,Long,Float,Double,注意,在Java语言中,字符串没有被当做数组,而是被当做对象来处理的,类String和StringBuffer都可以被用来表示一个字符串。Java语言不支持C、C+中的指针类型、结构类型、枚举类型和联合类型。Java语言中所有简单数据类型的所在内存位数都是固定的。Java语言没有提供无符号整数类型。Java语言的short数据类型很少使用,因为它限制数据有存储为先高字节,后低字节,这样在某些机器中会出错。默认的浮点类型是双精度(double),要想要一个float必须在浮点数后面加F或者f。,注意,默认的整数类型是int型,要想使用长整型可在后面加“l”或“L”,如:1000L(小写l容易被误认为1,不推荐用)float可以精确到7位有效数字,第8位的数字是第9位数字四舍五入上取得的;double可以精确到16位有效数字,第17位的数字是第18位数字四舍五入上取得的。如果要求精确的答案,请不要使用float和double,因为它们是为了在广域数值范围上提供较为精确的快速近似运算而精心设计的。然而,它们没有提供完全精确的结果。尤其是对货币计算尤为不适合,使用BigDecimal。BigInteger支持任意精度的整数。BigDecimal支持任意精度的定点数。浮点型转化为整型时,不进行四舍五入,直接截断小数点后面的数。,注意,Java为所有的成员变量提供了默认初始化:byte、short、int、long-0float-0.0fdouble-0.0boolean-falsechar-“u0000,对象类型的引用全被初始化为null。各种基本数据类型进行混合运算,结果会是表达能力最强的那种。如:int和long运算,结果是long,整型和浮点型运算结果是浮点型。特殊的一点是:只要类型比int小(如char、byte、short),那么在运算之前,这些值会自动地转换成int。如:byteb1=12;byteb2=b1+1;/在编译时出错了!因为b1+1已经是int型了!切记!,数值计算实例,常用类,StringStringBufferStringBuildBigDecimal,String,String是Java中的字符串,用双引号引起来的几个字符,不属于8种基本数据类型,它是一个对象。默认值为null注:String类是不可变(final)的,对String类的任何改变,都是返回一个新的String类对象.这样的话把String类的引用传递给一个方法,该方法对String的任何改变,对原引用指向的对象没有任何影响,这一点和基本数据类型相似.创建String对象:Strings1=ABCD;Strings2=newString(ABCD);注:newString()和newString(“”)都是申明一个新的空字符串,是空串不是nullStringstr=”kvill”;Stringstr=newString(“kvill”);的区别常量池(constantpool)指的是在编译期被确定,并被保存在已编译的.class文件中的一些数据。它包括了关于类、方法、接口等中的常量,也包括字符串常量。,String,例1:Strings0=”kvill”;Strings1=”kvill”;Strings2=”kv”+“ill”;System.out.println(s0=s1);System.out.println(s0=s2);结果为:true,true解析:首先Java会确保一个字符串常量只有一个拷贝。因为例子中的s0和s1中的”kvill”都是字符串常量,它们在编译期就被确定了,所以s0=s1为true;而”kv”和”ill”也都是字符串常量,当一个字符串由多个字符串常量连接而成时,它自己肯定也是字符串常量,所以s2也同样在编译期就被解析为一个字符串常量,所以s2也是常量池中”kvill”的一个引用。所以s0=s1=s2;用newString()创建的字符串不是常量,不能在编译期就确定,所以newString()创建的字符串不放入常量池中,它们有自己的地址空间。例2:Strings0=”kvill”;Strings1=newString(”kvill”);Strings2=”kv”+newString(“ill”);System.out.println(s0=s1);falseSystem.out.println(s1=s2);falseSystem.out.println(s0=s2);false解析:s0还是常量池中”kvill”的引用,s1因为无法在编译期确定,所以是运行时创建的新对象”kvill”的引用,s2因为有后半部分newString(“ill”)所以也无法在编译期确定,所以也是一个新创建对象”kvill”的引用。因为每个字符串为一个对象,比较的是他们的引用地址,在堆分配的地址肯定是不一样的。,String,关于equals()和=这个对于String简单来说就是比较两字符串的Unicode序列是否相当,如果相等返回true;而=是比较两字符串的地址是否相同,也就是是否是同一个字符串的引用。关于String是不可变的String对象称为不可变的(只读),因为一旦创建了该对象,就不能修改该对象的值。看来似乎修改了String对象的方法实际上是返回一个包含修改内容的新String对象。比如说:Stringstr=”kv”+”ill”+”“+”ans”;就是有4个字符串常量,首先”kv”和”ill”生成了”kvill”存在内存中,然后”kvill”又和”“生成”kvill“存在内存中,最后又和生成了”kvillans”;并把这个字符串的地址赋给了str,就是因为String的“不可变”产生了很多临时变量,这也就是为什么建议用StringBuffer的原因了,因为StringBuffer是可改变的。String的常用方法,见API,StringBuffer,Java.lang.StringBuffer线程安全的可变字符序列。String和StringBuffer他们都可以存储和操作字符串,即包含多个字符的字符串数据。String类是字符串常量,是不可更改的常量。而StringBuffer是字符串变量,它的对象是可以扩充和修改的。构造方法publicStringBuffer()创建一个空的StringBuffer类的对象,默认构造器,由系统自动分配容量,默认是16个字符。publicStringBuffer(intlength)创建一个长度为参数length的StringBuffer类的对象。如果参数length小于0,将触发NegativeArraySizeException异常。publicStringBuffer(Stringstr)用一个已存在的字符串常量来创建StringBuffer类的对象。,StringBuffer类的方法,StringBuffer类的方法,StringBuffer类的方法,StringBuilder,一个可变的字符序列是5.0新增的。此类提供一个与StringBuffer兼容的API,但不保证同步。该类被设计用作StringBuffer的一个简易替换,用在字符串缓冲区被单个线程使用的时候。如果可能,建议优先采用该类,因为在大多数实现中,它比StringBuffer要快。,BigDecimal,BigDecimal支持任意精度的定点数。用来对浮点数类型数据进行精确的运算。常见方法见APIBigDecimal的格式化由于NumberFormat类的format()方法可以使用BigDecimal对象作为其参数,可以利用BigDecimal对超出16位有效数字的货币值,百分值,以及一般数值进行格式化控制。NumberFormatcurrency=NumberFormat.getCurrencyInstance();NumberFormatpercent=NumberFormat.getPercentInstance();currency.format(amount)percent.format(rate),异常处理,简介Java异常类的层次结构Java异常处理的分类Java异常的处理方式Java异常处理的原则和忌讳,Java异常及异常处理,Java异常处理是使用Java语言进行软件开发和测试脚本开发时不容忽视的问题之一,是否进行异常处理直接关系到开发出的软件的稳定性和健壮性。可将Java异常看作是一类消息,它传送一些系统问题、故障及未按规定执行的动作的相关信息。异常包含信息,以将信息从应用程序的一部分发送到另一部分。编译语言为何要处理异常?为何不在异常出现位置随时处理具体故障?因为有时候我们需要在系统中交流错误消息,以便按照统一的方式处理问题,有时是因为有若干处理问题的可能方式,但您不知道使用哪一种,此时,可将处理异常的任务委托给调用方法的代码。调用者通常更能了解问题来源的上下文,能更好的确定恢复方式。,通用消息架构,从上图可以看出,必定在运行的Java应用程序的一些类或对象中产生异常。出现故障时,“发送者”将产生异常对象。异常可能代表Java代码出现的问题,也可能是JVM的相应错误,或基础硬件或操作系统的错误。异常本身表示消息,指发送者传给接收者的数据“负荷”。首先,异常基于类的类型来传输有用信息。很多情况下,基于异常的类既能识别故障本因并能更正问题。其次,异常还带有可能有用的数据(如属性)。在处理异常时,消息必须有接收者;否则将无法处理产生异常的底层问题。,Java异常类的层次结构,在Java中,所有的异常都有一个共同的祖先Throwable(可抛出)。Throwable指定代码中可用异常传播机制通过Java应用程序传输的任何问题的共性。Throwable有两个重要的子类:Exception(异常)和Error(错误),二者都是Java异常处理的重要子类,各自都包含大量子类。Exception(异常)是应用程序中可能的可预测、可恢复问题。一般大多数异常表示中度到轻度的问题。异常一般是在特定环境下产生的,通常出现在代码的特定方法和操作中。如:当试图调用readLine方法时,可能出现IOException异常。Error(错误)表示运行应用程序中较严重问题。大多数错误与代码编写者执行的操作无关,而表示代码运行时JVM(Java虚拟机)出现的问题。例如,当JVM不再有继续执行操作所需的内存资源时,将出现OutOfMemoryError。Exception类有一个重要的子类RuntimeException。RuntimeException类及其子类表示“JVM常用操作”引发的错误。例如,若试图使用空值对象引用、除数为零或数组越界,则分别引发运行时异常(NullPointerException、ArithmeticException)和ArrayIndexOutOfBoundException。,Java异常处理的分类,可检测异常可检测异常经编译器验证,对于声明抛出异常的任何方法,编译器将强制执行处理或声明规则,例如:sqlExecption这个异常就是一个检测异常。你连接JDBC时,不捕捉这个异常,编译器就通不过,不允许编译。非检测异常1、非检测异常不遵循处理或声明规则。在产生此类异常时,不一定非要采取任何适当操作,编译器不会检查是否已解决了这样一个异常。例如:一个数组为3个长度,当你使用下标为时,就会产生数组下标越界异常。这个异常JVM不会进行检测,要靠程序员来判断。有两个主要类定义非检测异常:RuntimeException和Error。自定义异常自定义异常是为了表示应用程序的一些错误类型,为代码可能发生的一个或多个问题提供新含义。可以显示代码多个位置之间的错误的相似性,也可以区分代码运行时可能出现的相似问题的一个或者多个错误,或给出应用程序中一组错误的特定含义。例如,对队列进行操作时,有可能出现两种情况:空队列时试图删除一个元素;满队列时试图添加一个元素。则需要自定义两个异常来处理这两种情况。,Java异常的处理方式,在Java应用程序中,对异常的处理有两种方式:处理异常和声明异常。处理异常:try、catch和finally代码结构:tryxxx;catch(Exception)finally其中:try块:将一个或者多个语句放入try时,则表示这些语句可能抛出异常。编译器知道可能要发生异常,于是用一个特殊结构评估块内所有语句。catch块:当问题出现时,一种选择是定义代码块来处理问题,catch块的目的便在于此。catch块是try块所产生异常的接收者。基本原理是:一旦生成异常,则try块的执行中止,JVM将查找相应的JVM。finally块:无论运行try块代码的结果如何,无论是否运行完,无论是否产生异常,也无论是否在catch块中得到处理,finally块都将执行。,try-catch-finally规则,必须在try之后添加catch或finally块。try块后可同时接catch和finally块,但至少有一个块。必须遵循块顺序:若代码同时使用catch和finally块,则必须将catch块放在try块之后。catch块与相应的异常类的类型相关一个try块可能有多个catch块。若如此,则执行第一个匹配块。可嵌套try-catch-finally结构。在try-catch-finally结构中,可重新抛出异常。除了下列情况,总将执行finally做为结束:JVM过早终止(调用System.exit(int));在finally块中抛出一个未处理的异常;计算机断电、失火、或遭遇病毒攻击。,声明异常,若要声明异常,则必须将其添加到方法签名块的结束位置。例:publicvoidreadMethod(intinput)throwsjava.io.IOException声明异常的规则如下:1、必须声明方法可抛出的任何可检测异常(checkedexception)2、非检测性异常(uncheckedexception)不是必须的,可声明,也可不声明。3、调用方法必须遵循任何可检测异常的处理和声明规则。若覆盖一个方法,则不能声明与覆盖方法不同的异常。声明的任何异常必须是被覆盖方法所声明异常的同类或子类。,Java异常处理的原则,尽可能的处理异常要尽可能的处理异常,如果条件确实不允许,无法在自己的代码中完成处理,就考虑声明异常。如果人为避免在代码中处理异常,仅作声明,则是一种错误和依赖的实践。具体问题具体解决异常的部分优点在于能为不同类型的问题提供不同的处理操作。有效异常处理的关键是识别特定故障场景,并开发解决此场景的特定相应行为。为了充分利用异常处理能力,需要为特定类型的问题构建特定的处理器块。记录可能影响应用程序运行的异常至少要采取一些永久的方式,记录下可能影响应用程序操作的异常。理想情况下,当然是在第一时间解决引发异常的基本问题。不过,无论采用哪种处理操作,一般总应记录下潜在的关键问题。别看这个操作很简单,但它可以帮助您用很少的时间来跟踪应用程序中复杂问题的起因。根据情形将异常转化为业务上下文若要通知一个应用程序特有的问题,有必要将应用程序转换为不同形式。若用业务特定状态表示异常,则代码更易维护。从某种意义上讲,无论何时将异常传到不同上下文(即另一技术层),都应将异常转换为对新上下文有意义的形式。,Java异常处理的忌讳,一般不要忽略异常trycatch(IOExceptione)不要使用覆盖式异常处理块trycatch(Exceptione)一般不要把特定的异常转化为更通用的异常trycatch(IOExceptione)thrownewException(“”);不要处理能够避免的异常对于有些异常类型,实际上根本不必处理。通常运行时异常属于此类范畴。在处理空指针或者数据索引等问题时,不必求助于异常处理。,Java进阶,集合框架格式化排序,集合框架,CollectionsFramework,基于Java2平台,标准版,版本1.2。集合框架”提供了一组精心设计的接口和类,它们以单个单元即集合的形式存储和操作数据组。对于计算机科学数据结构课程中学到的许多抽象数据类型如映射(map)、集(set)、列表(list)、树(tree)、数组(array)、散列表(hashtable)和其它集合来说,该框架提供了一个方便的API。,集合接口和类,集合框架”由一组用来操作对象的接口组成。不同接口描述不同类型的组。四个基本接口Collection接口是一组允许重复的对象Set接口继承Collection,但不允许重复List接口继承Collection,允许重复,并引入位置下标Map接口既不继承Set也不继承Collection集合实现,Collection接口,Collection接口用于表示任何对象或元素组。想要尽可能以常规方式处理一组元素时,就使用这一接口。基本操作booleanadd(Objectelement)booleanremove(Objectelement)intsize()booleanisEmpty()booleancontains(Objectelement)Iteratoriterator()组操作booleancontainsAll(Collectioncollection)booleanaddAll(Collectioncollection)voidclear()voidremoveAll(Collectioncollection)voidretainAll(Collectioncollection)取交集,Collection接口,AbstractCollection类,提供具体“集合框架”类的基本功能。虽然您可以自行实现Collection接口的所有方法,但是,除了iterator()和size()方法在恰当的子类中实现以外,其它所有方法都由AbstractCollection类来提供实现。如果子类不覆盖某些方法,可选的如add()之类的方法将抛出异常。Iterator接口,使用Iterator接口方法,您可以从头至尾遍历集合,并安全的从底层Collection中除去元素。Collectioncollection=.;Iteratoriterator=collection.iterator();while(iterator.hasNext()Objectelement=iterator.next();if(removalCheck(element)iterator.remove();,Set接口,Set接口继承Collection接口,而且它不允许集合中存在重复项。所有原始方法都是现成的,没有引入新方法。具体的Set实现类依赖添加的对象的equals()方法来检查等同性。HashSet类和TreeSet类HashSet能快速定位一个元素,但是你放到HashSet中的对象需要实现hashCode()方法,它使用了哈希码的算法。TreeSet,是一个有序的Set,其底层是一颗树,放入其中的元素按序存放,这就要求你放入其中的对象是可排序的,这就用到了集合框架提供的另外两个实用类Comparable和Comparator,Set接口,SortedSet接口,其中的元素一定是有序的,继承set接口,只有TreeSet这一个实现类。根据“对象的比较顺序”,而不是“插入顺序”进行排序方法说明Comparatorcomparator():返回Set锁使用的Comparator对象,或者用null表示它使用Object自有的排序方法。Objectfirst():返回最小的元素Objectlast():返回最大的元素SortedSetsubSet(fromElement,toElement):返回Set的子集,其中的元素从fromElement开始到toElement为止(包括fromElement,不包括toElement)。SortedSetheadSet(toElement):返回Set的子集,其中的元素都应小于toElement。SortedSettailSet(toElement):返回Set的子集,其中的元素都应大于fromElement。,Set接口-范例,List接口,List接口继承了Collection接口以定义一个允许重复项的有序集合。该接口不但能够对列表的一部分进行处理,还添加了面向位置的操作。面向位置的操作包括插入某个元素或Collection的功能,还包括获取、除去或更改元素的功能。方法说明voidadd(intindex,Objectelement)booleanaddAll(intindex,Collectioncollection)objectget(intindex)intindexOf(Objectelement)intlastIndexOf(Objectelement)objectremove(intindex)objectset(intindex,Objectelement)ListsubList(intfromIndex,inttoIndex)ListIteratorlistIterator()ListIteratorlistIterator(intstartIndex),List接口,ListIterator接口,继承Iterator接口以支持添加或更改底层集合中的元素,还支持双向访问。方法:previous()、next();ArrayList类和LinkedList类ArrayList:采用的是数组形式来保存对象的,这种方式将对象放在连续的位置中,所以最大的缺点就是插入删除时非常麻烦LinkedList:采用的将对象存放在独立的空间中,而且在每个空间中还保存下一个链接的索引但是缺点就是查找非常麻烦要丛第一个索引开始。还可以作为堆栈、队列。,List接口-范例,Map接口,Map接口不是Collection接口的继承。而是从自己的用于维护键-值关联的接口层次结构入手。按定义,该接口描述了从不重复的键到值的映射。三组操作:改变、查询和提供可选视图。改变操作允许您从映射中添加和除去键-值对。键和值都可以为null。但是,您不能把Map作为一个键或值添加给自身。Objectput(Objectkey,Objectvalue)Objectremove(Objectkey)voidputAll(Mapmapping)voidclear()查询操作允许您检查映射内容Objectget(Objectkey)booleancontainsKey(Objectkey)booleancontainsValue(Objectvalue)intsize()booleanisEmpty(),Map接口,可选视图允许您把键或值的组作为集合来处理。publicSetkeySet()publicCollectionvalues()publicSetentrySet()因为映射中键的集合必须是唯一的,您用Set支持。因为映射中值的集合可能不唯一,您用Collection支持。最后一个方法返回一个实现Map.Entry接口的元素SetMap.Entry接口Map的entrySet()方法返回一个实现Map.Entry接口的对象集合。集合中每个对象都是底层Map中一个特定的键-值对。通过这个集合迭代,您可以获得每一条目的键或值并对值进行更改。但是,如果底层Map在Map.Entry接口的setValue()方法外部被修改,此条目集就会变得无效,并导致迭代器行为未定义。HashMap类和TreeMap类在Map中插入、删除和定位元素,HashMap是最好的选择按顺序遍历键,那么TreeMap会更好,Map接口,SortedMap接口,其中的键一定是有序的,继承map接口,只有TreeMap这一个实现类。pair是按key的顺序存储的,由于TreeMap有顺序的概念,因此“位置”是有意义的,所以你可以去获取它的第一个和最后一个元素,以及它的子集。方法说明Comparatorcomparator():返回Map所使用的comparator,如果是用Object内置的方法的话,则返回null。ObjectfirstKey():返回第一个键。ObjectlastKey():返回最后一个键SortedMapsubMap(fromKey,toKey):返回这个Map的一个子集,其键从fromKey开始到toKey为止,包括前者,不包括后者。SortedMapheadMap(toKey):返回这个Map的一愕嘎子集,其键均小于toKey。SortedMaptailMap(fromKey):返回这个Map的一个子集,其键均大于等于fromKey。,Map接口实例,特殊集合的实现,只读集合把所有必要的元素都添加到集合后,为避免意外的修改集合,以只读方式处理该集合会比较方便。Collections类提供了六种工厂方法支持该功能,Collection、List、Map、Set、SortedMap和SortedSet每个一种。CollectionunmodifiableCollection(Collectioncollection)ListunmodifiableList(Listlist)。线程安全集合历史集合类和“集合框架”中新的实现的差别在于新类不是线程安全的。设计者采用这种线程安全方法是让您只在需要时才使用同步,使每项工作快得多。但如果,您正将集合用于多个线程能够同步修改集合的多线程环境,修改就必须同步进行。CollectionsynchronizedCollection(Collectioncollection)。Setset=Collection.synchronizedSet(newHashSet();单元素集合多副本集合,一张由相同元素的多个副本组成的不变的列表。空集合,Collections类还提供表示空集合的常数ListEMPTY_LISTSetEMPTY_SETMapEMPTY_MAP,历史集合类,数组Vector类和Stack类Enumeration接口Dictionary类、Hashtable类和Properties类BitSet类,数组,数组被定义为同类型数据的定长集合支持基本数据类型存储的唯一集合可存储对象创建数组时,需指定要存储对象的数量和类型。而且,在某个数组的生存期中,不能增加或存储一个不同的类型高效支持一维、二维、多维度定义一维数组声明typearrayName=value1,value2;typearrayName=newtypearraySize;二维数组声明inta=newint23;inta=newint2;a0=newint3;a1=newint3;初始化:inta=2,3,1,5,3,4;,Arrays类,Java.util.Arrays,包括了一组可用于数组的static方法基本方法equals():比较两个数组是否相等fill():填充数组sort():数组比较binarySearch():在一个已排序的数组中查找特定元素asList():它接受一个数组,然后把它转成一个List容器复制一个数组:Java标准类库提供了一个System.arraycopy()的static方法。相比for循环,它能以更快的速度拷贝数组。System.arraycopy()对所有类型都作了重载。,Vector类和Stack类,Vector是个像可增大数组的历史集合类,但它可以存储不同类型的数据元素。Java2SDK,版本2中Vector类被改良到“集合框架”层次结构中以实现List接口。从Vector转换为ArrayList时,一个关键的差别是为了更改元素值的位置,参数的顺序被颠倒了。从原始的Vector类:voidsetElementAt(Objectelement,intindex)从List接口中:voidset(intindex,Objectelement)Stack类继承Vector,通过push()和pop()方法以实现一个标准的后进先出(last-in-first-out(LIFO)堆栈。可是,我们要当心。因为Stack类继承Vector类,您仍然可以用被继承的Vector的方法访问或修改Stack。,Enumeration接口,Enumeration接口允许您迭代集合中的所有元素。在“集合框架”中,该接口被Iterator接口替Enumeration不支持除去操作。Enumera

温馨提示

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

评论

0/150

提交评论