java里的一些类.docx
- 文档编号:4412898
- 上传时间:2022-12-01
- 格式:DOCX
- 页数:37
- 大小:41.04KB
java里的一些类.docx
《java里的一些类.docx》由会员分享,可在线阅读,更多相关《java里的一些类.docx(37页珍藏版)》请在冰豆网上搜索。
java里的一些类
1.String类和StringBuffer类
String一旦初始化就不可以修改。
而StringBuffer可以,它用于封装内容可变的字符串,可以使用tostring()方法转换成String字符串。
Stringx="a"+4+"c";
//编译时等效于Stringx
=newStringBuffer().append("a").append(4).append("c").toString();
字符串常量是一种特殊的字符串对象。
Strings1="hello";
Strings2="hello";
则s1=s2;因为他们指向同一个匿名对象。
Strings1=newString("hello");
Strings2=newString("hello");
则s1!
=s2;
示例:
逐行读取键盘输入,知道输入”bye”时,结束程序。
注:
对于回车换行,在windows下,有”\r”和”\n”两个,在unix下只有”\n”,所以写程序时要把他们分开。
publicclassReadLine{
/**
*逐行读取键盘输入,直到输入"bye"时,结束程序
*@paramargs
*/
publicstaticvoidmain(Stringargs[]){
StringstrInfo=null;
intpos=0;
byte[]buf=newbyte[1024];//定义一个数组,存放换行前的各个字符
intch=0;//存放读入的字符
System.out.println("Pleaseinputastring:
");
while(true){
try{
ch=System.in.read();//该方法每次读入一个字节的内容到ch变量中。
}catch(Exceptione){
}
switch(ch){
case'\r':
//回车时,不进行处理
break;
case'\n':
//换行时,将数组总的内容放进字符串中
strInfo=newString(buf,0,pos);//该方法将数组中从第0个开始,到第pos个结束存入字符串。
if(strInfo.equals("bye"))//如果该字符串内容为bye,则退出程序。
{
return;
}else//如果不为bye,则输出,并且竟pos置为0,准备下次存入。
{
System.out.println(strInfo);
System.out.println("Pleaseinputastring:
");
pos=0;
break;
}
default:
buf[pos++]=(byte)ch;//如果不是回车,换行,则将读取的数据存入数组中。
}
}
}
}
基本数据类型包装类的作用是:
将基本数据类型包装成对象。
因为有些方法不可直接处理基本类型,只能处理对象。
例如:
vector的add(),参数只能是对象。
这样只能使用它们的包装类将它们包装成对象。
示例:
在屏幕上打印出*组成的矩形,矩形的宽度和高度通过启动程序时传递给main()方法的参数指定。
publicclassTestInteger{
publicstaticvoidmain(String[]args)
//main()的参数是string类型的数组,用来做为长,宽时,要转换成整型。
{
intw=newInteger(args[0]).intValue();
inth=Integer.parseInt(args[1]);
//inth=Integer.valueOf(args[1]).intValue();
//以上为三种将字符串转换成整形的方法。
for(inti=0;i StringBuffersb=newStringBuffer();//使用stringbuffer,是因为它是可追加的。 for(intj=0;j sb.append('*'); } System.out.println(sb.toString());//在打印之前,要将stringbuffer转化为string类型。 } } } 比较下列两段代码的执行效率: a). Stringsb=newString(); for(intj=0;j sb=sb+'*'; } b). StringBuffersbf=newStringBuffer(); for(intj=0;j sbf.append("*"); } 解释: a和b运行结果上相同,但效率相差很大。 a在每一次循环中,都要先将string类型转换成stringbuffer类型,然后将”*”追加上去,再调用tostring()转换成string类型,效率很低。 b在每次循环中,都只调用StringBuffer对象,没有创建新的对象,所以效率很高。 2.System类Runtime类 由于java不支持全局方法和全局变量。 所以java设计者将一些与系统相关的重要方法和变量放在了System中。 我们不能直接的创建runtime对象,只能通过Runtime.getRuntime()静态方法来获得。 编程实例: 在java程序中启动windows的记事本的应用程序。 并在该运行实例中打开运行程序的源代码,启动记事本程序,5秒后关闭。 packagech02; publicclassProperty{ publicstaticvoidmain(String[]args){ Processp=null;//java虚拟机启动的进程。 try{ p=Runtime.getRuntime().exec("notepad.exesrc/ch02/Property.java");//启动记事本并且打开源文件。 Thread.sleep(5000);//持续5秒 p.destroy();//关闭该进程 }catch(Exceptionex){ ex.printStackTrace(); } } } 3.两种异常的差别 java中提供了两类主要的异常: runtimeexception和checkedexception。 所有的checkedexception都是java.lang.Exception类中衍生出来的。 而runtimeexception则是从java.lang.RuntimException或java.lang.Error类衍生出来的。 它们的不同之处体现在两个方面: 机制上和逻辑上。 一、机制上 它们在机制上不同表现有两点: 1.如何定义方法2.如何处理抛出的异常。 请看下面CheckedException的定义。 publicclassCheckedExceptionextendsException{ publicCheckedException(){ } publicCheckedException(Stringmessage){ super(message); } } 以及一个exception的使用。 publicclassExceptionalClass{ publicvoidmethod1()throwsCheckedException{ //thrownewCheckedException("...出错了"); } publicvoidmethod2(Stringarg){ if(arg==null){ thrownewNullPointerException("method2的参数arg是null! "); } } publicvoidmethod3()throwsCheckedException{ method1(); } } 两个方法method1()和method2()都会抛出异常,可是只有method1()作了声明。 另外method3()本身并不抛出异常,却声明CheckedException。 先看看这个类的main(). publicstaticvoidmain(String[]args){ ExceptionalClassex=newExceptionalClass(); try{ ex.method1(); ex.method3(); }catch(CheckedExceptione){ e.printStackTrace(); } ex.method2(null); } 在main()方法中,如果要调用method1(),你必须把这个调用放在try/catch程序块当中,因为它会抛出Checkedexception。 相比之下,当你调用method2()时,则不需要把它放在try/catch程序块当中,因为它会抛出的exception不是checkedexception,而是runtimeexception。 会抛出runtimeexception的方法在定义时不必声明它会抛出exception。 现在,让我们再来看看method3()。 它调用了method1()却没有把这个调用放在try/catch程序块当中。 它是通过声明它会抛出method1()会抛出的exception来避免这样做的。 它没有捕获这个exception,而是把它传递下去。 实际上main()方法也可以这样做,通过声明它会抛出Checkedexception来避免使用try/catch程序块(当然我们反对这种做法)。 小结一下: ✧Runtimeexceptions: 在定义方法时不需要声明会抛出runtimeexception; 在调用这个方法时不需要捕获这个runtimeexception; runtimeexception是从java.lang.RuntimeException或java.lang.Error类衍生出来的。 ✧Checkedexceptions: 定义方法时必须声明所有可能会抛出的checkedexception; 在调用这个方法时,必须捕获它的checkedexception,不然就得把它的exception传递下去; checkedexception是从java.lang.Exception类衍生出来的。 二、逻辑上 从逻辑的角度来说,checkedexceptions和runtimeexception是有不同的使用目的的。 checkedexception用来指示一种调用方能够直接处理的异常情况。 而runtimeexception则用来指示一种调用方本身无法处理或恢复的程序错误。 checkedexception迫使你捕获它并处理这种异常情况。 以.URL类的构建器(constructor)为例,它的每一个构建器都会抛出MalformedURLException。 MalformedURLException就是一种checkedexception。 设想一下,你有一个简单的程序,用来提示用户输入一个URL,然后通过这个URL去下载一个网页。 如果用户输入的URL有错误,构建器就会抛出一个exception。 既然这个exception是checkedexception,你的程序就可以捕获它并正确处理: 比如说提示用户重新输入。 再看下面这个例子: publicvoidmethod(){ int[]numbers={1,2,3}; intsum=numbers[0]+numbers[3]; } 在运行方法method()时会遇到ArrayIndexOutOfBoundsException(因为数组numbers的成员是从0到2)。 对于这个异常,调用方无法处理/纠正。 这个方法method()和上面的method2()一样,都是runtimeexception的情形。 上面我已经提到,runtimeexception用来指示一种调用方本身无法处理/恢复的程序错误。 而程序错误通常是无法在运行过程中处理的,必须改正程序代码。 总而言之,在程序的运行过程中一个checkedexception被抛出的时候,只有能够适当处理这个异常的调用方才应该用try/catch来捕获它。 而对于runtimeexception,则不应当在程序中捕获它。 如果你要捕获它的话,你就会冒这样一个风险: 程序代码的错误(bug)被掩盖在运行当中无法被察觉。 因为在程序测试过程中,系统打印出来的调用堆栈路径(StackTrace)往往使你更快找到并修改代码中的错误。 有些程序员建议捕获runtimeexception并纪录在log中,我反对这样做。 这样做的坏处是你必须通过浏览log来找出问题,而用来测试程序的测试系统(比如UnitTest)却无法直接捕获问题并报告出来。 在程序中捕获runtimeexception还会带来更多的问题: 要捕获哪些runtimeexception? 什么时候捕获? runtimeexception是不需要声明的,你怎样知道有没有runtimeexception要捕获? 你想看到在程序中每一次调用方法时,都使用try/catch程序块吗? 4.日期类Date(java.util.Date) java在日期类中封装了有关日期与时间的信息。 用户可以通过调用相应的方法来获取系统时间或设置日期和时间。 在日期类中共定义了六种构造方法。 ØpublicDate() 创建的日期类对象的日期时间被设置成创建时刻相对应的日期时间。 例Datedate=newDate();//date被设置成创建时刻相对应的日期时间。 ØpublicDate(longdate) long型的参数date可以通过调用Date类中的static方法parse(Strings)来获得。 longl=Date.parse("Mon6Jan199713: 3: 00"); Dateday=newDate(l); //day中时间为1997年1月6号星期一,13: 3: 00。 ØpublicDate(Strings)已过时。 按字符串s产生一日期对象。 s的格式与方法parse中字符串参数的模式相同。 例Datedate=newDate("Mon6Jan199713: 3: 00"); //date中时间为1997年1月6号星期一,13: 3: 00. ØpublicDate(intyear,intmonth,intdate)已过时。 ØpublicDate(intyear,intmonth,intdate,inthrs,intmin)已过时。 ØpublicDate(intyear,intmonth,intdate,inthrs,intmin,intsec)已过时。 按给定的参数创建一日期对象。 参数说明: year的值为: 需设定的年份-1900。 例如需设定的年份是1997则year的值应为97,即1997-1900的结果。 所以Date中可设定的年份最小为1900; month的值域为0~11,0代表1月,11表代表12月; date的值域在1~31之间; hrs的值域在0~23之间。 从午夜到次日凌晨1点间hrs=0,从中午到下午1点间hrs=12; min和sec的值域在0~59之间。 例Dateday=newDate(11,3,4);//TueApr0400: 00: 00CST1911 另外,还可以给出不正确的参数。 例 设定时间为1910年2月30日,它将被解释成3月2日。 Dateday=newDate(10,1,30,10,12,34); System.out.println("Day'sdateis: "+day); //打印结果为Day'sdateis: WedMar0210: 12: 34CST1910 Date类中常用的方法: ØpublicstaticlongUTC(intyear,intmonth,intdate,inthrs.intmin,intsec) 该方法将利用给定参数计算UTC值。 UTC是一种计时体制,与GMT(格林威治时间)的计时体系略有差别。 UTC计时体系是基于原子时钟的,而GTMT计时体系是基于天文学观测的。 计算中使用的一般为GMT计时体系。 Øpublicstaticlongparse(Strings) 该方法将字符串s转换成一个long型的日期。 在介绍构造方法Date(longdate)时曾使用过这个方法。 字符串s有一定的格式,一般为: (星期日年时间GMT+时区) 若不注明时区,则为本地时区。 ØpublicvoidsetMonth(intmonth) ØpublicintgetMonth() 这两个方法分别为设定和获取月份值。 获取的月份的值域为0~11,0代表1月,11代表12月。 ØpublicStringtoString() ØpublicStringtoLocalString() ØpublicStringtoGMTString() 将给定日期对象转换成不同格式的字符串。 ØpublicintgetTimezoneOffset() 该方法用于获取日期对象的时区偏移量。 示例中对上面介绍的Date类中的基本方法进行了具体的应用,并打印了相应的结果。 由于使用了一些过时的方法,所以编译时会有警告信息。 importjava.util.Date; publicclassDateApp{ /** *@paramargs */ publicstaticvoidmain(String[]args){ Datetoday=newDate(); System.out.println("Today'sdateis"+today); System.out.println("Today'sdate(InternetGMT)is: "+today.toGMTString());//返回结果为GMT时间表示法 System.out.println("Today'sdate(Locale)is: "+today.toLocaleString());//返回结果为本地习惯的时间表示法 intyear=today.getYear(); intmonth=today.getMonth()+1; intdate=today.getDate(); System.out.println("Today'syearis"+year); System.out.println("Today'smonthis"+month); System.out.println("Today'sdayis"+date);//调用Date类中方法,获取年月日的值。 //下面调用了不同的构造方法来创建Date类的对象。 Dateday1=newDate(100,1,23,10,12,34); System.out.println("Day1'sdateis: "+day1); Dateday2=newDate("Sat12Aug199613: 3: 00"); System.out.println("Day2'sdateis: "+day2); longl=Date.parse("Sat5Aug199613: 3: 00GMT+0800"); Dateday3=newDate(l); System.out.println("Day3'sdate(GMT)is: "+day3.toGMTString()); System.out.println("Day3'sdate(Locale)is: "+day3.toLocaleString()); System.out.println("Day3'stimezoneoffsetis: "+day3.getTimezoneOffset()); } } 5.日历类Calendar 在早期的JDK版本中,日期(Date)类附有两大功能: (1)允许用年、月、日、时、分、秒来解释日期: (2)允许对表示日期的字符串进行格式化和句法分析。 在JDK1.1中提供了类Calendar来完成第一种功能,类DateFormat来完成第二项功能。 DateFormat是java.text包中的一个类。 与Date类有所不同的是,DateFormat类接受用各种语言和不同习惯表示的日期字符串。 本节将介绍java.util包中的类Calendar及其它新增加的相关的类。 类Calendar是一个抽象类,它完成日期(Date)类和普通日期表示法(即用一组整型域如YEAR,MONTH,DAY,HOUR表示日期)之间的转换。 由于所使用的规则不同,不同的日历系统对同一个日期的解释有所不同。 在JDK1.1中提供了Calendar类一个子类GregorianCalendar。 它实现了世界上普遍使用的公历系统。 当然用户也可以通过继承Calendar类,并增加所需规则,以实现不同的日历系统。 类GregorianCalendar继承了Calendar类。 类GregorianCalendar提供了七种构造方法: ØpublicGregorianCalendar() 创建的对象中的相关值被设置成指定时区,缺省地点的当前时间,即程序运行时所处的时区、地点的当前时间。 ØpublicGregorianCalendar(TimeZonezone) 创建的对象中的相关值被设置成指定时区zone,缺省地点的当前时间。 ØpublicGregorianCalendar(LocaleaLocale) 创建的对象中的相关值被设置成缺省时区,指定地点aLocale的当前时间。 ØpublicGregorianCalendar(TimeZonezone,LocalaLocale) 创建的对象中的相关值被设置成指定时区
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- java 一些