7.3 Java中已有的类
目前,Java中已经存在了很多由前辈开发出来的类,可以被开发人员直接使用,将这些有共同特征的类组合在一起形成了类库。在Java中包含大量用于不同目的的类库,这些类库是开发Java软件的基础。即使需要设计自己的类,也有可能使用到Java类库中的很多类。
可以打开API文档,查看一些已经存在的类库,能发现Java类库非常丰富。鉴于读者都是初学者,所以暂时只介绍一些简单的API类库,随着学习的深入,后面读者会接触到更多的类。
7.3.1 Java的数学运算处理类Math
看到“Math”这个单词,立刻就能明白这个类一定跟数学有关。其包含了丰富的数学函数,可以使用这个类的方法,而不用管它们内部是如何实现的。通过查看API文档,知道“Math”类中的所有方法和字段都是可以直接访问的,在Java中,称之为静态方法和静态字段。有关静态方法和静态字段的概念,后面章节有介绍,现在只需要知道,这些方法和字段可以直接去使用即可。
那么如何访问其中的方法和字段呢?因为这些成员是静态成员,所以可通过“类名.方法名称”和“类名.字段”来访问方法和字段。在Math类中,由于都是静态成员,就可以使用“Math.方法名称或常量名”。下面把这个类中经常使用到的方法和属性值列举出来,以提供给大家参考。
Math类中包含了两个静态常量:
Math.PI-----------------------------------------------表示数学常量π Math.E------------------------------------------------表示和e最可能接近的近似值
Math类提供了常用的三角函数:
Math.sin----------------------------------------------表示正弦函数 Math.cos----------------------------------------------表示余弦函数 Math.tan----------------------------------------------表示正切函数 Math.asin---------------------------------------------表示反正弦函数 Math.acos---------------------------------------------表示反余弦函数 Math.atan---------------------------------------------表示反正切函数 Math.atan2--------------------------------------------表示反余切函数
Math类还提供了幂函数、指数函数和自然对数函数:
Math.pow----------------------------------------------返回a的b次方 Math.exp----------------------------------------------返回e的a次方 Math.log----------------------------------------------返回a的常用对数值
Math类提供了常用的数学运算函数:
Math.abs----------------------------------------------返回绝对值 Math.sqrt---------------------------------------------返回平方根 Math.max----------------------------------------------返回最大值 Math.min----------------------------------------------返回最小值
Math类提供了角度与弧度相关的转换运算方法:
Math.toDegrees(double angrad)------------------------将弧度转换成角度值 Math toRadians(double angdeg)------------------------将角度值转换成弧度
Math类提供了四舍五入的运算及截断运算:
Math.round(double e)---------------------------------四舍五入运算 Math.floor(double e )--------------------------------返回不大于e的最大整数
Math类提供了一个专门用来产生随机数的函数:
Math.random()-----------------------------------------用来产生随机数的函数
以上是在Math类中常用的方法和函数。下面将通过举例来熟悉它们。
【实例7.1】首先通过下列程序代码来熟悉数学运算函数的用法:
01 public class Math1 02 { 03 public static void main(String[] args) 04 { 05 int x=9; 06 int y=16; 07 System.out.println(Math.sqrt(x)); //计算x的平方根的结果 08 System.out.println(Math.abs(x)); //计算x的绝对值的结果 09 System.out.println(Math.max(x,y)); //计算x与y的最大值 10 System.out.println(Math.min(x,y)); //计算x与y的最小值 11 } 12 }
【代码说明】在运用这些函数方法的时候,希望读者能注意到函数所带的参数,“Math.sqrt()”、“Math.abs()”带的是一个参数。“Math.max()”、“Math.min()”带的是两个参数,这一点必须记住。
【运行结果】
3.0 9 16 9
【实例7.2】再通过下列程序代码来熟悉四舍五入函数的用法:
01 public class Math2 02 { 03 public static void main(String[] args) 04 { 05 double x=4.51; 06 System.out.println(Math.round(x)); //返回的是四舍五入的值 07 System.out.println(Math.floor(x)); //返回的是不大于x的最大整数 08 } 09 }
【代码说明】这两个方法都是只有一个参数。第7行返回的是不大于参数值的最大整数。
【运行结果】
5 4.0
通过以上两个例子可以看出,函数方法的使用很简单,关键是要注意其参数。纵观类库,其实就是一个方法和属性的集合。至于类库的学习方法,关键是多练习,只要熟悉了类库中各种方法的使用,也就掌握了类库。
7.3.2 测试时间和日期的类Date
下面要介绍另一个比较重要的类:Date类。Date类包括了有关日期和时间操作的一些方法。Date类提供相应的方法,可将日期分解为年、月、日、时、分、秒。Data类还可以将日期转换成一个字符串,甚至可以执行反向的操作。
因为Math类中的方法和字段属性都是静态的,所以可以直接使用它。而Date类中的方法和字段属性不是静态的,所以不能直接用“类.方法名或字段名”,必须使用“对象名.方法名或字段名”。
如何将类变成对象呢?因为类是模板,对象是实物。在Java中,从模板中创建一个实物是使用关键字“new”来实现的(在下一章会详细介绍创建对象方面的知识)。针对非静态的类或方法,就要使用对象来操作,不能使用类来操作。
下面演示如何从类中产生一个对象:
new Date()
这个表达式构造了一个日期对象,并把这个对象初始化为当前的日期和时间,其实可以从一个类中,产生多个不同的对象。Date类可创建很多种不同的对象,如:
Date(int year,int month,int date), Date(int year,int month,int date,int hrs,int min);
但是如果在程序中需要将时间显示出来,应该使用什么方法呢?这里有两种方法:
(1)将Date对象作为一个参数,传给“println”方法。
【实例7.3】下面是这个方法的实例。
01 import java.util.Date; 02 public class Math3 03 { 04 public static void main(String[] args) 05 { 06 System.out.println(new Date()); 07 } 08 }
【代码说明】第1行非常关键,使用import导入类库。第6行直接输出日期。这个程序代码段是显示当前的日期和时间。它将Date()作为当前时间日期,然后将此对象传给“println”方法。
【运行结果】
Wed Aug 26 23:08:34 CST 2009
(2)使用Date类中的方法“toString()”(有关这一点在前面已经介绍过),它可以直接将时间日期按照字符串的形式显示出来。
【实例7.4】下面是这个方法的实例。
01 import java.util.Date; 02 public class Math4 03 { 04 public static void main(String[] args) 05 { 06 System.out.println(new Date()); 07 System.out.println(new Date().toString()); 08 } 09 }
【代码说明】这个例子将两种方法作了对比,其实从输出结果来看,是一模一样的。只是使用的方法不同而已。
【运行结果】
Wed Aug 26 23:10:12 CST 2009 Wed Aug 26 23:10:12 CST 2009
7.3.3 测试日历的类GregorianCalendar
在对Date类的介绍中,读者会发现Date类所表示的是一个时间点,也就是在创建对象当时的时间点,而这对于进行日期的相关操作及运算,是非常不方便的。为此,前辈们在Java类库中,为开发者提供了一个方便操作日期的类:GregorianCalendar类。其实GregorianCalendar类是Calendar类的一个扩展而已,Calendar类是从总体上描述历法的类。
Date类中也有用于得到日期的方法函数,如“getDay()”、“getMonth()”等,但是这些方法已经不被推荐使用了,在程序中尽量不要使用不被推荐(deprecated)的方法函数。相比之下,GregorianCalendar类拥有更多的对日期操作的方法函数。GregorianCalendar类的常用方法:
public int get(int field)
这里的“field”指的Calendar类中定义的常数,返回与“field”相关的日期。
【实例7.5】举个具体的例子:
01 import java.util.*; 02 public class GregorianCalendars 03 { 04 public static void main(String[] args) 05 { 06 GregorianCalendar gc=new GregorianCalendar(); 07 int X=gc.get(Calendar.MONTH); 08 System.out.println(X); 09 } 10 }
【代码说明】第7行通过get()方法返回月份。Calendar.MONTH返回日历中的当前月。
【运行结果】
7 "public void set(int field,int value)"
将“field”所表示的日期替换成“value”的值。
【实例7.6】举个具体的例子:
01 import java.util.*; 02 public class GregorianCalendar1 03 { 04 public static void main(String[] args) 05 { 06 GregorianCalendar gc=new GregorianCalendar(); 07 gc.set(Calendar.YEAR,2009); 08 System.out.println(gc.get(Calendar.YEAR)); 09 } 10 }
【代码说明】第7行设置年份为2009,然后第8行输出当前年份。
【运行结果】
2009
下面是有一些有关如何设置系统时间的方法。
"public final void set(int year,int month,int date)" "public final void set(int year,int month,int date,int hour,int minute)" "public final void set(int year,int month,int date,int hour,int minute,int second)"
这里的“final”在后面一章会讲述。上面的三个方法函数是指如何设定时间和日期。
【实例7.7】看下列代码段,就可以明白以上这三个方法函数是什么含义:
01 import java.util.*; 02 public class GregorianCalendar2 03 { 04 public static void main(String[] args) 05 { 06 GregorianCalendar gc=new GregorianCalendar(); 07 gc.set(2009,06,18); 08 System.out.println(gc.get(Calendar.YEAR)); 09 System.out.println(gc.get(Calendar.MONTH)); 10 System.out.println(gc.get(Calendar.DATE)); 11 } 12 }
【代码说明】在上面的例子里,先通过“set”方法设置年份为2009年,然后设置月份为6月,接着设置日期是18号,最后再通过“get”访问器的方法取出值。
【运行结果】
2009 6 18
7.3.4 日历处理的实例解析
对于月历类来说,最重要的参数是年、月、日、小时、分、秒、毫秒,所以Calendar类提供了这些参数:
YEAR(年)、MONTH(月)、DATE(日)、HOUR(小时)、MINUTE(分钟)、SECOND(秒)、MILLISECOND(毫秒)
另外一年还有十二个月的参数,所以Calendar类提供了:
JANUARY(一月)、FEBRUARY(二月)、MARCH(三月)、APRIL(四月)、MAY(五月)、JUNE(六月)、JULY(七月)、 AUGUST(八月)、SEPTEMBER(九月)、OCTOBER(十月)、NOVEMBER(十一月)、DECEMBER(十二月)
依次表示1~12个月份,需要注意的是它们从零开始计算。
例如:
get(Calendar.MONTH)+1
另外,一周的每一天使得Calendar类提供了:
SUNDAY(=1)、MONDAY(=2)、TUESDAY(=3)、WEDNESDAY(=4)、THURSDAY(=5)、FRIDAY(=6)、SATURDAY(=7)
如果获取星期或改变星期时使用:
DAY_OF_WEEK
如果表示上午/下午:
AM_PM
【实例7.8】上面介绍了很多常用函数和属性常量,下面看一个实例。
01 import java.util.*; 02 public class calendar1 03 { 04 public static void main(String args[]) 05 { 06 GregorianCalendar gc=new GregorianCalendar(); 07 String now=gc.get(Calendar.YEAR)+"年"+(gc.get(Calendar.MONTH)+1)+"月 08 "+gc.get(Calendar.DATE)+"日"+gc.get(Calendar.HOUR)+"时" +gc.get(Calendar.MINUTE)+"分 09 "+gc.get(Calendar.SECOND)+"秒"; 10 System.out.println("当前时间是:"+now); 11 } 12 }
【代码说明】这个程序段很简单,对这个类中每一种函数都展示了其用法。读者可以根据上面的介绍依次查看每个函数。
【运行结果】
当前时间是:2009年8月26日11时32分50秒
【实例7.9】下面来编写一个稍微复杂的实例,然后来仔细分析这个程序段的编程思路。有个人的生日是阳历7月20日,请输出2007—2020年之间,这个人每年的生日究竟是星期几。
01 import java.util.*; 02 public class calendar2 03 { 04 public static void main(String[] args) 05 { 06 GregorianCalendar gc=new GregorianCalendar(); 07 final char[] kor_week={'日','一','二','三','四','五','六'}; 08 for(int i=2007;i<=2020;i++) 09 { 10 gc.set(i,Calendar.JULY,20); 11 char week=kor_week[gc.get(Calendar.DAY_OF_WEEK)-1]; 12 System.out.println(i+"年的生日是星期"+week); 13 } 14 } 15 }
【代码说明】这个程序的具体代码,很容易读懂。在此,需要讲述的是一个编程的思路问题。当拿到这个程序的要求时,首先分析是要求输出“2007—2020”年之间每年的生日究竟是星期几,这时就要考虑使用循环语句。
通过“set”函数将年份依次改为2007—2020年,这样就可以通过“get”函数返回此年份月份和日子到底是星期几,如果是这样分析,编写它就不难了,剩下的只不过是一些细节问题。
【运行结果】
2007年的生日是星期五 2008年的生日是星期日 2009年的生日是星期一 2010年的生日是星期二 2011年的生日是星期三 2012年的生日是星期五 2013年的生日是星期六 2014年的生日是星期日 2015年的生日是星期一 2016年的生日是星期三 2017年的生日是星期四 2018年的生日是星期五 2019年的生日是星期六 2020年的生日是星期一