Java基础褚蕊蕊2011-6-16Agenda•Java初级•Java进阶•Q&AJava初级•Java数据类型•常用类String、StringBuild、StringBuffer、BigDecimal•异常处理Java数据类型•概念:数据类型就是对内存位置的抽象表达,数据类型指明了变量或表达式的状态和行为。•分类:简单数据类型、复合数据类型•简单数据类型:简单数据类型是不能再简化的、内置的数据类型,由编程语言定义,表示真实的数字、字符和整数。例如实数、整数、字符和布尔值。•复合数据类型:由简单数据类型的组合形成的更大、更复杂的数据类型。例如类、接口、数组。简单数据类型与复合数据类型的区别•栈:由编译器在需要的时候分配,在不需要的时候自动清除的变量的存储区。里面的变量通常为局部变量,函数参数。特点:后进先出(Last-In/First-Out)。•堆:由new分配的内存块,他们的释放编译器不用去管,程序结束后,操作系统自动回收。特点:顺序随意•Java内存分配形式:栈内存,堆内存。栈与堆都是Java用来在Ram中存放数据的地方。与C++不同,Java自动管理栈和堆,程序员不能直接地设置栈或堆。•简单数据类型,不存在“引用”的概念,都是直接存储在内存中的内存栈上,数据本身的值就是存储在栈空间里。Java语言中八种基本数据类型都是这样存储的。简单数据类型与复合数据类型的区别•继承Object类的复杂数据类型都是按照Java里面存储对象的内存模型来进行数据存储的,使用Java内存堆和内存栈来进行这种数据类型的存储,简单的讲,“引用”是存储在有序的内存栈上的,而对象本身的值存储在内存堆上。基本数据类型•布尔数据类型(boolean),1位•字符类型(char),2字节•整数类型(integer)–byte1字节–short2字节–int4字节–long8字节•浮点数类型(float)–float4字节–double8字节基本数据类型的转换•自动转换–当一个较“小”的数据和较“大”的数据一起运算时,系统会自动把较“小”的数据转换为较“大”的数据,再进行运算。–自动类型转换图:byteshort(char)intlongfloatdouble–条件:类型兼容;目的类型的数值范围比源类型大;•强制转换–将较“大”的数据转换为较“小”的数据时,可以使用强制类型转换。如:inta=(int)3.14–自动类型转换反序•注意:转换附加,char与int类型的转换,如:inta=(int)’a’;输出’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型了!切记!数值计算实例常用类•String•StringBuffer•StringBuild•BigDecimalString•String是Java中的字符串,用双引号引起来的几个字符,不属于8种基本数据类型,它是一个对象。默认值为null注:String类是不可变(final)的,对String类的任何改变,都是返回一个新的String类对象.这样的话把String类的引用传递给一个方法,该方法对String的任何改变,对原引用指向的对象没有任何影响,这一点和基本数据类型相似.•创建String对象:Strings1=ABCD;Strings2=newString(ABCD);注:newString()和newString(“”)都是申明一个新的空字符串,是空串不是null•Stringstr=”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的常用方法,见APIStringBuffer•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支持任意精度的定点数。用来对浮点数类型数据进行精确的运算。•常见方法见API•BigDecimal的格式化由于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异常看作是一类消息,它传送一些系统问题、故障及未按规定执行的动作的相关信息。异常包含信息,以将信息从应用程序的一部分发送到另一部分。•编译语言为何要处理异常?为何不在异常出现位置随时处理具体故障?因为有时候我们需要在系统中交流错误消息,以便按照统一的方式处理问题,有时是因为有若干处理问题的可能方式,但您不知道使用哪一种,此时,可将处理异常的任务委托给调用