calendar类是一个抽象类(匿名类可以是抽象类吗)

admin 450 0

大家好,calendar类是一个抽象类相信很多的网友都不是很明白,包括匿名类可以是抽象类吗也是一样,不过没有关系,接下来就来为大家分享关于calendar类是一个抽象类和匿名类可以是抽象类吗的一些知识点,大家可以关注收藏,免得下次来找不到哦,下面我们开始吧!

一、java抽象类不能被实例化是什么意思

Calendar c= new Calendar();出现 new Calendar()就会执行实例化一个对象了。所以如果是抽象类就不能这样new的。要new它没有abstract的子类。

抽象类是指不允许被实例化的类;抽象方法是没有方法体的方法。

1、抽象类可以不包括抽象方法,它反正不会去实例化,抽象类不能被实例化,也就是不能用new关键字去产生对象,抽象方法只需声明,而不需实现,抽象类的子类必须覆盖所有的抽象方法后才能被实例化,否则这个子类还是个抽象类,里面的方法是不是抽象的没有本质影响。

2、但是含有抽象方法的类绝不能被实例化,否则执行这个方法的时候,怎么办?

3、如果子类是非抽象的,那么它就必须实现父类中的抽象方法;否则,它继承来的抽象方法仍然没有方法体,也是个抽象方法,此时就与“含有抽象方法的类必须是抽象类”相矛盾了。

抽象类与接口紧密相关,它们不能实例化,并且常常部分实现或根本不实现。抽象类和接口之间的一个主要差别是:类可以实现无限个接口,但仅能从一个抽象(或任何其他类型)类继承。从抽象类派生的类仍可实现接口。可以在创建组件时使用抽象类,因为它们使您得以在某些方法中指定不变级功能,但直到需要该类的特定实现之后才实现其他方法。抽象类也制定版本,因为如果在派生类中需要附加功能,则可以将其添加到基类而不中断代码。

在实现抽象类时,必须实现该类中的每一个抽象方法,而每个已实现的方法必须和抽象类中指定的方法一样,接收相同数目和类型的参数,具有同样的返回值。

二、关于Calendar类的解释

HOUR_OF_DAY一天里的第几个小时,晚上12点开始.

if(C_SCHEDULE_HOUR== cal.get(Calendar.HOUR_OF_DAY))判断当前是否是晚上12点

Calendar类是一个抽象类,它为特定瞬间与一组诸如 YEAR、MONTH、DAY_OF_MONTH、HOUR等日历字段之间的转换提供了一些方法,并为操作日历字段(例如获得下星期的日期)提供了一些方法。瞬间可用毫秒值来表示,它是距历元(即格林威治标准时间 1970年 1月 1日的 00:00:00.000,格里高利历)的偏移量。

该类还为实现包范围外的具体日历系统提供了其他字段和方法。这些字段和方法被定义为 protected。

与其他语言环境敏感类一样,Calendar提供了一个类方法 getInstance,以获得此类型的一个通用的对象。Calendar的 getInstance方法返回一个 Calendar对象,其日历字段已由当前日期和时间初始化:

Calendar rightNow= Calendar.getInstance();

Calendar对象能够生成为特定语言和日历风格实现日期-时间格式化所需的所有日历字段值,例如,日语-格里高里历,日语-传统日历。Calendar定义了某些日历字段返回值的范围,以及这些值的含义。例如,对于所有日历,日历系统第一个月的值是 MONTH== JANUARY。其他值是由具体子类(例如 ERA)定义的。有关此内容的细节,请参阅每个字段的文档和子类文档。

可以通过调用 set方法来设置日历字段值。在需要计算时间值(距历元所经过的毫秒)或日历字段值之前,不会解释 Calendar中的所有字段值设置。调用 get、getTimeInMillis、getTime、add和 roll涉及此类计算。

Calendar有两种解释日历字段的模式,即 lenient和 non-lenient。当 Calendar处于 lenient模式时,它可接受比它所生成的日历字段范围更大范围内的值。当 Calendar重新计算日历字段值,以便由 get()返回这些值时,所有日历字段都被标准化。例如,lenient模式下的 GregorianCalendar将 MONTH== JANUARY、DAY_OF_MONTH== 32解释为 February 1。

当 Calendar处于 non-lenient模式时,如果其日历字段中存在任何不一致性,它都会抛出一个异常。例如,GregorianCalendar总是在 1与月份的长度之间生成 DAY_OF_MONTH值。如果已经设置了任何超出范围的字段值,那么在计算时间或日历字段值时,处于 non-lenient模式下的 GregorianCalendar会抛出一个异常。

Calendar使用两个参数定义了特定于语言环境的 7天制星期:星期的第一天和第一个星期中的最小一天(从 1到 7)。这些数字取自构造 Calendar时的语言环境资源数据。还可以通过为其设置值的方法来显式地指定它们。

在设置或获得 WEEK_OF_MONTH或 WEEK_OF_YEAR字段时,Calendar必须确定一个月或一年的第一个星期,以此作为参考点。一个月或一年的第一个星期被确定为开始于 getFirstDayOfWeek()的最早七天,它最少包含那一个月或一年的 getMinimalDaysInFirstWeek()天数。第一个星期之前的各星期编号为...、-1、0;之后的星期编号为 2、3、...。注意,get()返回的标准化编号方式可能有所不同。例如,特定 Calendar子类可能将某一年第 1个星期之前的那个星期指定为前一年的第 n个星期。

在计算日历字段中的日期和时间时,可能没有足够的信息用于计算(例如只有年和月,但没有日),或者可能有不一致的信息(例如"Tuesday, July 15, 1996"(格林威治时间)——实际上,1996年 7月 15日是星期一)。Calendar将分析日历字段值,以便用以下方式确定日期和时间。

如果日历字段值中存在任何冲突,则 Calendar将为最近设置的日历字段提供优先权。以下是日历字段的默认组合。将使用由最近设置的单个字段所确定的最近组合。

YEAR+ MONTH+ WEEK_OF_MONTH+ DAY_OF_WEEK

YEAR+ MONTH+ DAY_OF_WEEK_IN_MONTH+ DAY_OF_WEEK

YEAR+ DAY_OF_WEEK+ WEEK_OF_YEAR

如果在选定的字段组合中,还有尚未设置值的任一日历字段,那么 Calendar将使用其默认值。每个字段的默认值可能依据具体的日历系统而有所不同。例如,在 GregorianCalendar中,字段的默认值与历元起始部分的字段值相同:即 YEAR= 1970、MONTH= JANUARY、DAY_OF_MONTH= 1,等等。

注:对于某些特别时间的解释可能会有某些歧义,可以用下列方式解决:

23:59是一天中的最后一分钟,而 00:00是下一天的第一分钟。因此,1999年 12月 31日的 23:59< 2000年 1月 1日的 00:00。

尽管从历史上看不够精确,但午夜也属于"am",,中午属于"pm",所以在同一天,12:00 am(午夜)< 12:01 am,12:00 pm(中午)< 12:01 pm。

日期或时间格式字符串不是日历定义的一部分,因为在运行时,用户必须能够修改或重写它们。可以使用 DateFormat格式化日期。

可以使用三种方法更改日历字段:set()、add()和 roll()。

set(f, value)将日历字段 f更改为 value。此外,它设置了一个内部成员变量,以指示日历字段 f已经被更改。尽管日历字段 f是立即更改的,但是直到下次调用 get()、getTime()、getTimeInMillis()、add()或 roll()时才会重新计算日历的时间值(以毫秒为单位)。因此,多次调用 set()不会触发多次不必要的计算。使用 set()更改日历字段的结果是,其他日历字段也可能发生更改,这取决于日历字段、日历字段值和日历系统。此外,在重新计算日历字段之后,get(f)没必要通过调用 set方法返回 value集合。具体细节是通过具体的日历类确定的。

示例:假定 GregorianCalendar最初被设置为 1999年 8月 31日。调用 set(Calendar.MONTH, Calendar.SEPTEMBER)将该日期设置为 1999年 9月 31日。如果随后调用 getTime(),那么这是分析 1999年 10月 1日的一个暂时内部表示。但是,在调用 getTime()之前调用 set(Calendar.DAY_OF_MONTH, 30)会将该日期设置为 1999年 9月 30日,因为在调用 set()之后没有发生重新计算。

add(f, delta)将 delta添加到 f字段中。这等同于调用 set(f, get(f)+ delta),但要带以下两个调整:

Add规则 1。调用后 f字段的值减去调用前 f字段的值等于 delta,以字段 f中发生的任何溢出为模。溢出发生在字段值超出其范围时,结果,下一个更大的字段会递增或递减,并将字段值调整回其范围内。

Add规则 2。如果期望某一个更小的字段是不变的,但让它等于以前的值是不可能的,因为在字段 f发生更改之后,或者在出现其他约束之后,比如时区偏移量发生更改,它的最大值和最小值也在发生更改,然后它的值被调整为尽量接近于所期望的值。更小的字段表示一个更小的时间单元。HOUR是一个比 DAY_OF_MONTH小的字段。对于不期望是不变字段的更小字段,无需进行任何调整。日历系统会确定期望不变的那些字段。

三、Java中,为什么Date类被Calendar类取代了

使用Java中的Date和Calendar类2008-05-25 21:13Java语言的Calendar(日历),Date(日期),和DateFormat(日期格式)组成了Java标准的一个基本但是非常重要的部分.日期是商业逻辑计算一个关键的部分.所有的开发者都应该能够计算未来的日期,定制日期的显示格式,并将文本数据解析成日期对象.我们写了两篇文章,这是第一篇,我们将大概的学习日期,日期格式,日期的解析和日期的计算.

1、具体类(和抽象类相对)java.util.Date

2、抽象类java.text.DateFormat和它的一个具体子类,java.text.SimpleDateFormat

3、抽象类java.util.Calendar和它的一个具体子类,java.util.GregorianCalendar

具体类可以被实例化,但是抽象类却不能.你首先必须实现抽象类的一个具体子类.

Date类从Java开发包(JDK) 1.0就开始进化,当时它只包含了几个取得或者设置一个日期数据的各个部分的方法,比如说月,日,和年.这些方法现在遭到了批评并且已经被转移到了Calendar类里去了,我们将在本文中进一步讨论它.这种改进旨在更好的处理日期数据的国际化格式.就象在JDK 1.1中一样, Date类实际上只是一个包裹类,它包含的是一个长整型数据,表示的是从GMT(格林尼治标准时间)1970年, 1月 1日00:00:00这一刻之前或者是之后经历的毫秒数.

让我们看一个使用系统的当前日期和时间创建一个日期对象并返回一个长整数的简单例子.这个时间通常被称为Java虚拟机(JVM)主机环境的系统时间.

public static void main(String[] args){

System.out.println(date.getTime());

在星期六, 2001年9月29日,下午大约是6:50的样子,上面的例子在系统输出设备上显示的结果是 1001803809710.在这个例子中,值得注意的是我们使用了Date构造函数创建一个日期对象,这个构造函数没有接受任何参数.而这个构造函数在内部使用了System.currentTimeMillis()方法来从系统获取日期.

那么,现在我们已经知道了如何获取从1970年1月1日开始经历的毫秒数了.我们如何才能以一种用户明白的格式来显示这个日期呢?在这里类java.text.SimpleDateFormat和它的抽象基类 java.text.DateFormat就派得上用场了.

假如我们希望定制日期数据的格式,比方星期六-9月-29日-2001年.下面的例子展示了如何完成这个工作:

import java.text.SimpleDateFormat;

public static void main(String[] args){

SimpleDateFormat bartDateFormat=

new SimpleDateFormat("EEEE-MMMM-dd-yyyy");

System.out.println(bartDateFormat.format(date));

只要通过向SimpleDateFormat的构造函数传递格式字符串"EEE-MMMM-dd-yyyy",我们就能够指明自己想要的格式.你应该可以看见,格式字符串中的ASCII字符告诉格式化函数下面显示日期数据的哪一个部分. EEEE是星期, MMMM是月, dd是日, yyyy是年.字符的个数决定了日期是如何格式化的.传递"EE-MM-dd-yy"会显示 Sat-09-29-01.请察看Sun公司的Web站点获取日期格式化选项的完整的指示.

假设我们有一个文本字符串包含了一个格式化了的日期对象,而我们希望解析这个字符串并从文本日期数据创建一个日期对象.我们将再次以格式化字符串"MM-dd-yyyy"调用SimpleDateFormat类,但是这一次,我们使用格式化解析而不是生成一个文本日期数据.我们的例子,显示在下面,将解析文本字符串"9-29-2001"并创建一个值为001736000000的日期对象.

import java.text.SimpleDateFormat;

public static void main(String[] args){

// Create a date formatter that can parse dates of

SimpleDateFormat bartDateFormat=

new SimpleDateFormat("MM-dd-yyyy");

// Create a string containing a text date to be parsed.

String dateStringToParse="9-29-2001";

// Parse the text version of the date.

// We have to perform the parse method in a

// try-catch construct in case dateStringToParse

// does not contain a date in the format we are expecting.

Date date= bartDateFormat.parse(dateStringToParse);

// Now send the parsed date as a long value

System.out.println(date.getTime());

System.out.println(ex.getMessage());

既然我们已经可以生成和解析定制的日期格式了,让我们来看一看如何使用内建的格式化过程.方法 DateFormat.getDateTimeInstance()让我们得以用几种不同的方法获得标准的日期格式化过程.在下面的例子中,我们获取了四个内建的日期格式化过程.它们包括一个短的,中等的,长的,和完整的日期格式.

public static void main(String[] args){

DateFormat.getDateTimeInstance(

DateFormat.getDateTimeInstance(

DateFormat.getDateTimeInstance(

DateFormat.getDateTimeInstance(

System.out.println(shortDateFormat.format(date));

System.out.println(mediumDateFormat.format(date));

System.out.println(longDateFormat.format(date));

System.out.println(fullDateFormat.format(date));

注意我们在对 getDateTimeInstance的每次调用中都传递了两个值.第一个参数是日期风格,而第二个参数是时间风格.它们都是基本数据类型int(整型).考虑到可读性,我们使用了DateFormat类提供的常量: SHORT, MEDIUM, LONG,和 FULL.要知道获取时间和日期格式化过程的更多的方法和选项,请看Sun公司Web站点上的解释.

运行我们的例子程序的时候,它将向标准输出设备输出下面的内容:

September 29, 2001 8:44:45 PM EDT

Saturday, September 29, 2001 8:44:45 PM EDT

我们现在已经能够格式化并创建一个日期对象了,但是我们如何才能设置和获取日期数据的特定部分呢,比如说小时,日,或者分钟?我们又如何在日期的这些部分加上或者减去值呢?答案是使用Calendar类.就如我们前面提到的那样, Calendar类中的方法替代了Date类中被人唾骂的方法.

假设你想要设置,获取,和操纵一个日期对象的各个部分,比方一个月的一天或者是一个星期的一天.为了演示这个过程,我们将使用具体的子类 java.util.GregorianCalendar.考虑下面的例子,它计算得到下面的第十个星期五是13号.

import java.util.GregorianCalendar;

public static void main(String[] args){

DateFormat.getDateInstance(DateFormat.FULL);

// Create our Gregorian Calendar.

GregorianCalendar cal= new GregorianCalendar();

// Set the date and time of our calendar

// to the system's date and time

System.out.println("System Date:"+

dateFormat.format(cal.getTime()));

// Set the day of week to FRIDAY

cal.set(GregorianCalendar.DAY_OF_WEEK,

System.out.println("After Setting Day of Week to Friday:"+

dateFormat.format(cal.getTime()));

while(friday13Counter<= 10){

// Go to the next Friday by adding 7 days.

cal.add(GregorianCalendar.DAY_OF_MONTH, 7);

// If the day of month is 13 we have

if(cal.get(GregorianCalendar.DAY_OF_MONTH)== 13){

System.out.println(dateFormat.format(cal.getTime()));

在这个例子中我们作了有趣的函数调用:

cal.set(GregorianCalendar.DAY_OF_WEEK,

cal.add(GregorianCalendar.DAY_OF_MONTH, 7);

set方法能够让我们通过简单的设置星期中的哪一天这个域来将我们的时间调整为星期五.注意到这里我们使用了常量 DAY_OF_WEEK和 FRIDAY来增强代码的可读性. add方法让我们能够在日期上加上数值.润年的所有复杂的计算都由这个方法自动处理.

System Date: Saturday, September 29, 2001

当我们将它设置成星期五以后就成了: Friday, September 28, 2001

好了,本文到此结束,如果可以帮助到大家,还望关注本站哦!