零基础学Java第2版
上QQ阅读APP看书,第一时间看更新

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年的生日是星期一