《面向对象java语言程序设计课程第五章xin.ppt》由会员分享,可在线阅读,更多相关《面向对象java语言程序设计课程第五章xin.ppt(66页珍藏版)》请在三一办公上搜索。
1、面向对象JAVA语言程序设计,信息科学与技术学院 网络工程系 周文峰,2,第五章 常用系统类,主要任务:介绍Java常用的系统类,包括字符串类、输入输出流类、Java Applet类、数学函数类、日期类、随机数类以及向量类等。,3,主要内容,字符串类String类StringBuffer类和StringBuilder类,4,5.1 字符串类,字符与字符串的区别字符是指用单引号括起来单个字符,如a、b、A等。这里的字符不是指占1个字节的ASCII字符,而是指占2个字节的Unicode字符。因为Unicode被设计用来处理现在世界上所有书面语言中的字符,所以一个汉字也是被当作一个字符来处理的。对于
2、单个字符,除了有char这个原始类型以外,Java平台中的java.lang包还专门提供了一个Character类来进行储存和操作。,在计算机科学领 域中,Unicode(统一码、万国 码、单一码、标准万国码)是业界的一种标准。,5,5.1 字符串类,字符串是程序设计中经常用到的数据结构,很多编程语言将字符串定义为基本数据类型。但在Java语言中,字符串被定义为类,必须先生成类的实例对象然后才能使用。常用有两种类型的字符串:一种是创建以后不需要改变的,称为字符串常量,在Java中,String类用于存储和处理字符串常量;另外一种字符串是创建以后,需要对其进行改变的,称为字符串变量,在Java中
3、,StringBuffer类用于存储和操作字符串变量。,6,字符串与字符串类,字符串是一个完整的字符序列,可以包含字母、数字和其它符号。在Java中,用双引号括起来的字符串是字符串常量,又称为无名字符串对象,由Java自动创建。字符串常量可以赋给任何一个String对象引用,这样处理从表面上看起来和其它编程语言没有大的差别,照顾了程序员的习惯,但实际上存在着较大的差异。无论何时,Java中的字符串都是以对象的面孔出现的,在运行时要为它分配内存空间,创建对象引用。,7,Java将字符串定义为类有哪些好处呢?,首先,在任何系统平台上都能保证字符串本身以及对字符串的操作是一致的。对于网络环境,这一点
4、是至关重要的。其次,String和StringBuffer经过了精心设计,其功能是可以预见的。为此,二者都被说明为最终类,不能派生子类,以防用户修改其功能。最后,String和StringBuffer类在运行时要经历严格的边界条件检验,它们可以自动捕获异常,提高了程序的健壮性。,8,5.1字符串类,字符串对象字符串长度及查找字符串的连接及子串字符串常量与比较String对象的不变性命令行参数,9,5.1.1 字符串类,Java语言提供了三个字符串类:String类、StringBuffer类和StringBuilder类。String类是不变字符串,StringBuffer和StringBui
5、lder是可变字符串,这3种字符串都是16位(2个字节)的Unicode字符序列,并且这3个类都被声明为final,因此不能被继承。,10,5.1.1 字符串类,Java语言用String类表示字符串。一般使用String类的构造方法创建一个字符串对象。String类有13个重载的构造方法,可以生成一个空字符串,也可以由字符或字节数组生成字符串。String类常用的构造方法如下:public String()/空字符序列构造字符串对象public String(char value)/字符数组构造字符串对象,11,5.1.1 字符串类,public String(char value,int
6、offset,int count)/字符数组的子数组public String(byte bytes)/byte数组构造字符串对象 public String(byte bytes,int offset,int length)public String(String original)/构造一个original的副本 public String(StringBuffer buffer)public String(StringBuilder buffer),12,5.1.1 字符串类,例如:char chars1=A,B,C;char chars2=中,国,;String s1=new Stri
7、ng(chars1);String s2=new String(chars2,0,4);,13,5.1.1 字符串类,在Java中,还有一种特殊的创建String对象的方法,这种方法是直接利用字符串常量创建字符串对象,例如:String s=“This is a Java string.”;,14,常量串存储在串池中。编译时,每当碰到一个常量串,JVM就会在串池中搜索,如果此串存在,则直接使用这个现成的串;如果没有,就在串池中创建一个新串。,String x=“abcd”;String y=“abcd”;String z=“1234”;,x,y,z,串池,对象:”abcd”,对象:”1234”
8、,x,y,z并不是真正的对象,只是指向对象存储位置的引用。(C语言中称为指针),栈内存,没找到,找到,null,null,null,字符串的内存分配(字符串常量),15,字符串变量与字符串常量不存储在同样的位置。,字符串的内存分配(创建串对象),String x=new String(“abcd”);,x,对象:”abcd”,对象:”abcd”,其它常量对象,串池,null,找到,复制,栈内存,堆内存,16,5.1.2 字符串长度及查找,创建String类对象外,更常用的是调用String类的方法,该类定义了许多方法。public int length()返回字符串的长度,即字符串包含的字符个
9、数。注意对含有汉字和其他语言符号的字符串,计算长度时,一个符号作为一个字符计数。例如获取字符串“MingRiSoft”长度的代码如下:,String nameStr=MingRiSoft;int i=nameStr.length();/获得字符串的长度为10,17,5.1.2 字符串长度及查找,public int indexOf(int ch)查找字符ch第一次出现的位置。如果查找不成功则返回-1。public int indexOf(int ch,int fromIndex)查找字符ch从fromIndex开始第一次出现的位置(在原字符串中的下标)。,String str=mingrike
10、ji;int i=str.indexOf(i);System.out.println(字符i第一次出现在索引:+i);/索引值是1,18,5.1.2 字符串长度及查找,public int indexOf(String str)查找字符串str第一次出现的位置。如果查找不成功则返回-1。public int indexOf(String str,int fromIndex)查找字符串str从fromIndex开始第一次出现的位置(在原字符串中的下标)。,String str=mingrikeji;i=str.IndexOf(ri);System.out.println(“字符串“ri”第一次出
11、现在索引:+i);/索引值是4,19,5.1.2 字符串长度及查找,public int lastIndexOf(int ch)查找字符ch最后一次出现的位置。public int lastIndexOf(int ch,int endIndex)查找字符ch到endIndex为止最后一次出现的位置。,String str=mingrikeji;i=str.lastIndexOf(i);System.out.println(字符i最后一次出现在索引:+i);/索引值是9i=str.lastIndexOf(i,4);System.out.println(“到第4个字符为止,字符i最后一次出现在索引
12、:+i);/索引值是1,20,5.1.2 字符串长度及查找,public int lastIndexOf(String str)查找字符串str最后一次出现的位置。public int lastIndexOf(String str,int endIndex)查找字符串str到endIndex为止最后一次出现的位置(在原字符串中的下标)。,String str=mingrikeji;i=str.lastIndexOf(ri);System.out.println(“字符串ri最后一次出现在索引:+i);/索引值是4,21,5.1.3 字符串的连接与子串,public String concat(
13、String str)调用字符串与参数字符串连接起来,产生一个新的字符串。public String substring(int beginIndex,int endIndex)从字符串的下标beginIndex开始到endIndex结束产生一个子字符串。(不包含endIndex处的字符)public String substring(int beginIndex)从字符串的下标beginIndex开始到结束产生一个子字符串。,22,5.1.3 字符串的连接与子串,public char charAt(int index)返回字符串中指定位置的字符,index表示位置,范围为0s.length
14、()-1。public String replace(char oldChar,char newChar)将调用字符串中的所有oldChar字符改变为newChar字符,返回一个新的字符串。,23,5.1.3 字符串的连接与子串,public String toUpperCase()public String toLowerCase()将字符串转换成大写或小写字母。public boolean startsWith(String prefix)public boolean endsWith(String suffix)返回字符串是否以某个字符串开始或结尾。,24,5.1.3 字符串的连接与子串
15、,public void getChars(int srcBegin,int srcEnd,char dst,int dstBegin)将字符串中从起始位置(srcBegin)到结束位置(srcEnd)之间的字符复制到字符数组dst中从起始位置为dstBegin。,25,5.1.3 字符串的连接与子串,下面的程序说明了String对象的使用。String s=new String(This is a Java string.);System.out.println(s.length();/22 System.out.println(s.charAt(10);/J System.out.prin
16、tln(s.lastIndexOf(a);/13 System.out.println(s.lastIndexOf(a,10);/8 System.out.println(s.indexOf(is);/2,26,5.1.3 字符串的连接与子串,String s=new String(This is a Java string.);System.out.println(s.lastIndexOf(is);/5 System.out.println(s.indexOf(my);/-1 char subs=new char4;s.getChars(10,14,subs,0);System.out.p
17、rintln(subs);/Java,27,5.1.3 字符串的连接与子串,String s=new String(This is a Java string.);String s1=Its interesting.;s1=s.concat(s1);System.out.println(s.toUpperCase();/THIS IS A JAVA STRING.System.out.println(s1.toLowerCase();/this is a java string.its interesting.System.out.println(s.endsWith(in);/false,2
18、8,5.1.4 字符串解析,String类提供了一个split()方法,它用来实现将一个字符串分解成子字符串或令牌(token)。该方法使用正则表达式指定分隔符public String split(String regex,int limit)public String split(String regex),29,public class SplitDemopublic static void main(String args)String ss=11,22,33;System.out.println(ss);String str=ss.split(,);System.out.printl
19、n(str0);System.out.println(str1);System.out.println(str2);,30,5.1.5 字符串常量与字符串比较,在Java程序中,凡是由双引号定界的字符序列都是字符串常量(literal string),如”abc”。字符串常量存放在字符串常量池(pool of literal string)中。字符串常量也是String类的对象,可以直接使用,例如:System.out.println(Hello.length();/结果输出5,31,1.字符串相等的比较 你可能想到用“=”号来比较,如下代码所示。String s1=new String(He
20、llo);String s2=new String(Hello);System.out.println(s1=s2);,5.1.5 字符串常量与字符串比较,32,再看下面一段代码:String s1=“Hello”;String s2=“Hello”;System.out.println(s1=s2);,33,String str1=abc;String str2=abc;System.out.println(str1=str2);/true,字符串的比较,str1,str2,串池,对象:”abc”,栈内存,找到,null,null,没找到,Str1与str2存储的是同一块内存地址,34,St
21、ring str1=new String(abc);String str2=new String(abc);System.out.println(str1=str2);/false,字符串的比较,str2,对象:”abc”,对象:”abc”,其它常量对象,串池,null,找到,复制,栈内存,堆内存,str1,对象:”abc”,null,str1与str2存储的是堆内存中的不同地址,35,如果要比较两个对象的内容是否相等,可以使用String类的equals()方法。对于上面两种情况,表达式:s1.equals(s2);的结果都为true,因为s1、s2的内容都相等。,例如比较字符串“A”和字符
22、串“a”是否相等:注意:equals()方法在比较两个字符串时区分字母大小写。,String str=A;boolean b=str.equals(“a”);/比较结果b为false,36,2.字符串大小的比较 要比较字符串的大小,可以使用String类的compareTo()方法,该方法的格式为:public int compareTo(String anotherString),37,字符串比较使用字符的Unicode码值进行比较。若当前字符串小于参数字符串时,方法返回值小于0,若当前字符串大于参数字符串时,方法返回值大于0,若当前字符串等于参数字符串时,方法返回值等于0。例如,表达式:“
23、abc”.compareTo(“abd”)/返回值为-1。,38,对于字符串相等和大小比较还可以忽略大小写,可以使用下面两个方法:public boolean equalsIgnoreCase(String anotherString)public int compareToIgnoreCase(String anotherString)注意,字符串不能使用、=、=进行比较,可以使用!=比较。,39,比较字符串startsWith()和endsWith()方法,这两方法分别用于判断字符串是否以指定的字符串开始或结束,它们的定义如下:参数prefix和suffix为欲比较的字符串对象,该方法的返
24、回值为boolean型,例:分别判断字符串“ABCDE”是否以字符串“a”开始以及以字符串“DE”结束:,public boolean startsWith(String prefix)public boolean endsWith(String suffix),String str=ABCDE;boolean bs=str.startsWith(“a”);/比较结果bs为falseboolean be=str.endsWith(DE);/比较结果be为true,40,startsWith()还有一个重载方法,可以指定索引位置开始是否为指定的字符串,重载方法定义如下:方法的第二个参数toffs
25、et是比较字符串的索引位置。例如下面的代码判断字符串“ABCDE”从索引位置2开始是否为字符串“CD”:上面代码的判断结果为true,即字符串“ABCDE”从索引位置2开始是字符串“CD”。,public boolean startsWith(String prefix,int toffset),String str=ABCDE;boolean b=str.startsWith(CD,2);,41,5.1.6 String对象的不变性,在Java程序中,一旦创建一个String对象,就不能对其内容进行改变,因此说Java的String对象是不可变的字符串。请看下面的例子。,42,public
26、class ChangeString public static void main(String args)String s=new String(Hello,world);s.replace(o,A);s=s.substring(0,6).concat(Java);s.toLowerCase();System.out.println(s);,43,public class ChangeString public static void main(String args)String s=new String(Hello,world);System.out.println(s.replace
27、(o,A);s=s.substring(0,6).concat(Java);System.out.println(s);System.out.println(s.toLowerCase();,44,5.1.7 命令行参数,main()方法的声明格式为:public static void main(String args)其中参数String args为字符串数组,该参数是通过命令行传递给main()方法的。,45,例:从命令行输入三个整数,输出最大值和最小值。public class ThreeInteger public static void main(String args)int m
28、ax,min,a,b,c;a=Integer.parseInt(args0);b=Integer.parseInt(args1);c=Integer.parseInt(args2);max=Math.max(Math.max(a,b),c);min=Math.min(Math.min(a,b),c);System.out.println(max=+max);System.out.println(min=+min);,46,运行该程序需要在命令行给出参数,如下所示:D:java ThreeInteger“23”“-234”“100”程序运行结果为:max=100 min=-234,47,注意:命
29、令行参数传递的是字符串,若将其作为数值处理,需要进行转换。若字符串中含有非数值字符,则抛出NumberFormatException运行时异常。根据传递的参数个数确定数组args的长度,如果给出的参数少于引用的元素,则抛出ArrayIndexOutOfBoundsException运行时异常。如D:java ThreeInteger“23”“-234”,48,5.2 StringBuilder和StringBuffer类,创建StringBuffer对象StringBuffer对象的访问和修改StringBuilder类,49,5.2.1 创建StringBuffer对象,字符串缓冲区类Str
30、ingBuffer类是字符串的另一种处理办法。StringBuffer类常用的构造方法有下面三个:public StringBuffer()创建一个没有字符的字符串缓冲区,初始容量为16个字符。此时length()方法的值为0,而capacity()方法的值为16。,50,public StringBuffer(int capacity)创建一个没有字符的字符串缓冲区,capacity为指定的初始容量。public StringBuffer(String str)利用一个已存在的字符串对象str创建一个字符串缓冲区对象,另外再分配16个字符的缓冲区。,51,StringBuffer类除定义了l
31、ength()、charAt()、getChars()、indexOf()等方法外,还提供了下列常用方法:public int capacity()返回当前的字符串缓冲区的容量。public void setCharAt(int index,char ch)用ch修改指定位置的字符。,52,public StringBuffer deleteCharAt(int index)删除指定位置的字符。public StringBuffer append(String str)向当前的字符串的末尾添加一个字符串。该方法有一系列的重载方法,参数可以是boolean、char、int、long、float
32、、double、char等任何数据类型。,53,public StringBuffer insert(int offset,String str)从当前字符串的指定位置插入一个字符串。这个方法个也有多个重载的方法,参数可以是boolean、char、int、long、float、double、char等类型。public StringBuffer delete(int start,int end)删除从start开始到end(不包括end)之间的字符。,54,public StringBuffer replace(int start,int end,String str)用字符串str替换从s
33、tart开始到end(不包括end)之间的字符。public StringBuffer reverse()将字符串的所有字符反转。public StringBuffer substring(int start)返回从start开始到字符串末尾的子字符串,55,public StringBuffer substring(int start,int end)返回从start开始到end(不包括end)之间的子字符串。例:下面程序演示了StringBuffer对象及其方法的使用。StringBuffer sb=new StringBuffer(Hello);System.out.println(sb
34、);/Hello System.out.println(sb.length();/5 System.out.println(sb.capacity();/21,56,sb.append(Java);System.out.println(sb);/HelloJava System.out.println(sb.insert(5,“,”);/Hello,Java System.out.println(sb.replace(6,10,World!);/Hello,World!System.out.println(sb.reverse();/!dlroW,olleH,57,5.2.3 StringBu
35、ilder类,StringBuilder类与StringBuffer类的区别是StringBuffer类的实例是线程安全的,StringBuilder类的实例不是线程安全的。如果需要线程同步,推荐使用StringBuffer类。,58,习题,1.下列关于构造方法描述错误的是。A.Java语言规定构造方法名与类名必须相同;B.Java语言规定构造方法没有返回值,但不用void声明;C.Java语言规定构造方法不可以重载;D.Java语言规定构造方法只能通过new自动调用。2.已知语句int a=1,2,3;下列描述错误的是。A.定义了一个名为a的一维数组 B.数组a有3个元素C.数组a中每个元素
36、都是整型D.数组元素a3的值为3,59,习题,3下列选项中,用于在定义子类时声明父类名的关键字是。A.interfaceB.packageC.extendsD.class4.设 i、j、k 为类 x 中定义的 int 型变量名,下列类 x 的构造函数中不正确的是。A.x(int m).B.void x(int m).C.x(int m,int n).D.x(int h,int m,int n).5.Java 和 c+都是面向对象的程序设计语言。()6.同一个类中定义多个参数列表不同的同名方法,叫做方法的重载。(),60,习题,7.一个程序里可以有多个父类,也可以有多个主类。()8.一个子类可以
37、重新定义从父类那里继承来的同名方法,而且允许它们有不同的返回值。()9.Java application中的主类需包含main方法,main方法的返回类型是。A.int B.float C.double D.void 10.在类的定义中可以有两个同名方法,这种现象称为方法。A.封装 B.继承 C.覆盖 D.重载,61,11.下列程序的输出结果是。class Fpublic F()System.out.print(F()is called!);class S extends Fpublic S()System.out.print(S()is called!);public class Expub
38、lic static void main(String args)S sa=new S();A)F()is called!B)S()is called!C)F()is called!S()is called!D)S()is called!F()is called!,62,习题,12.现有类说明如下:classAintx=10;intGetA()returnx;classBextendsAintx=100;intGetB()returnx;问题:1)类B是否能继承类A的属性x?2)若b是类B的对象,则b.GetB()的返回值是什么?3)若b是类B的对象,则b.GetA()的返回值是什么?4)类A
39、和类B都定义了x属性,这种现象称为什么?,63,习题,13以下Java语句中,String str=“123456789”;str=str.subString(1,3);执行后str中的值为()。A.“23”B.“123”C.“12”D.“234”14.Java语言中,String str=”123456789”,System.out.println(str.indexOf(“5”),输出结果为()。a)6b)5c)4d)-115.在java中,已定义两个接口B和C,要定义一个实现这两个接口的类,以下语句正确的是()。a)interface A extends B,Cb)interface A
40、 implements B,Cc)class A implements B,Cd)class A implements B,implements C,64,16.给定JAVA代码,如下:Class Parent public void count()System.out.println(10%3);public class Test extends Parent public void count()System.out.println(10/3);public static void main(String args)Parent p=new Test();p.count();运行编译后,输
41、出结果是()。A.1 B.1.0 C.3 D.3.3333333333333335,65,习题,17.在java 中,下列()类不能派生出子类。a)public class MyClass b)class MyClass c)abstract class MyClass d)final class MyClass 18.在java 中,以下()命令能够将java源文件编译为类文件a)Java b)javaw c)javac d)jar19.研究下面的Java 代码,当x=2 时,运行结果是()。switch(x)case1:System.out.println(1);case2:case3:System.out.println(3);Case4:System.out.println(4);a)没有输出任何结果 b)输出结果为3 c)输出结果是3 和4 d)输出结果是l、3 和4,66,习题,20.试编写java代码实现一个计算器类Computer,其中包括:(1)用counterValue来保存计数器的当前值;(2)方法increment()计数器加1;(3)方法decrement()计数器减1;(4)方法reset()计数器清零。,
链接地址:https://www.31ppt.com/p-5674285.html