目录
- 一、对象与对象变量
- 二、Java类库中的LocalDate类
- 三、更改器方法与访问器方法
在Java中,没有类就无法做任何事情。然而,并不是所有的类都表现出面向对象的典型特征。以Math.Random为例,我们不必具体了解如何实现的,只需要方法名和参数。这正是封装的关键所在。Math类只封装了功能,所以不需要隐藏数据。由于没有数据,因此不必考虑创建对象和初始化它们的实例字段,因为根本没有实例字段。
一、对象与对象变量
要使用对象首先必须构造对象,并指定其初始化状态,然后对对象应用方法。
在Java中,要使用构造器(constructor,或称构造函数)构造新实例。构造器是一种特殊的方法,其作用是构造并初始化对象。
构造器总是与类名同名。因此,Date类的构造器就名为Date。要想构造一个Date对象,需要在构造器前面加上new操作符。如下例子:
new Date()
这个表达式会构造一个新对象。这个对象初始化为当前的日期和时间。
如果需要,可以将这个对象传递给一个方法:
System.out.println(new Date());
或者对刚构造的对象应用一个方法。Date类中有一个toString方法。这个方法将生成日期的一个字符串描述,可以如下对Date对象应用toString方法:
String s = new Date().toString();
上面两个例子,构造对象仅使用了一次。通常,你可能希望保留所构造的对象从而能继续使用,为此,需要将对象存放值一个变量中:
Date rightNow = new Date();
对象和对象变量存在一个重要的区别,例如:
Date startTime; s = startTime.toString(); //not yet
上例定义了一个对象变量startTime,它可以引用Date类型的变量。但是,startTime不是一个对象,而且实际上它甚至还没有引用任何对象,所以不能在这个变量上用任何Date方法,将会产生编译错误。
必须初始化startTime变量,让它引用一个新构造的对象:
startTime = new Date();
也可以设置这个变量,让它引用一个已有的对象:
startTime = rightNow;
重要的一点:对象变量并不实际包含一个对象,它只是引用一个对象
在Java中,任何对象变量的值都是一个引用,指向存储在另外一个地方的某个对象。
二、Java类库中的LocalDate类
标准Java类库分别包含了两个类:一个是用来表示时间点的Date类;另一个是用大家熟悉的日历表示法表示日期的LocalDate类。将时间度量与日历分开是一种很好的面向对象设计。
不要使用构造器来构造LocalDate对象。应用使用静态工厂方法(factory method),它会代表你调用的构造器,下面式表达式:
LocalDate.now()
上例会构造一个新对象,表示构造这个对象时的日期。
可以提供年、月、日来构造对应一个特定日期的对象,并保存在一个对象变量中:
LocalDate newYearEve = LocalDate.of(2020,2,2)
也可以使用plusDays方法,把应用这个方法的对象称为当前对象,那么这个新日期对象则是距当前对象指定天数的一个新日期:
LocalDate aThousandDaysLater = newYearsEve.plusDays(1000); int year = aThousandDays.getYear(); int month = aThousanDays.getMonthValue(); int day = aThousanDays.getDayOfMonth();
LocalDate类封装了一些实例字段来维护所设置的日期。
三、更改器方法与访问器方法
Java库较早版本曾经有另一个处理日历的类,名为GregorianCalender。如下这个类表示的是一个日期增加1000天:
GregorianCalendar someDay = new GregorianCalendar(1999,11,31); someDay.add(Calender.DAY_OF_MONTH,1000);
与LocalDate.plusDays方法不同,GregorianCalendar.add方法是一个更改器方法(mutator method)。调用这个方法后,someDay对象的状态会改变。
相反,只访问对象而不修改对象的方法有时称为访问器方法(accessor method)。例如,LocalDate.getYear和GregorianCalender.get就是访问器方法。
使用LocalDate类显示当前月的日历:
import java.time.DayOfWeek; import java.time.LocalDate; public class CalendarTest { public static void main(String[] args) { LocalDate date = LocalDate.now(); int month = date.getMonthValue(); int today = date.getDayOfMonth(); date = date.minusDays(today - 1); DayOfWeek weekday = date.getDayOfWeek(); int value = weekday.getValue(); System.out.println("Mon Tue Wed Thu Fri Sat Sun"); for(int i = 1; i < value; i++){ System.out.print(" "); } while (date.getMonthValue() == month){ System.out.printf("%3d",date.getDayOfMonth()); if(date.getDayOfMonth() == today){ System.out.print("*"); }else { System.out.print(" "); } date = date.plusDays(1); if(date.getDayOfWeek().getValue() == 1){ System.out.println(); } } if(date.getDayOfWeek().getValue()!=1){ System.out.println(); } } }
执行结果:
java.time.LocalDate API:
- static LocalDate now()
构造一个表示当前日期的对象
- static LocalDate of(int year, int month, int day)
构造一个表示给定日期的对象
- int getYear()
- int getMonthValue()
- int getDayOfMonth()
得到当前日期的年、月和日
- DayOfWeek getDayOfWeek()
得到当前日期是星期几,作为DayOfWeek类的一个实例返回。在DayOfWeek实例上调用getValue来得到1-7之间的一个数,表示这是返回的星期几,1表示星期一,7表示星期日
- LocalDate plusDays(int n)
- LocalDate minusDays(int n)
生成当前日期之后或之前n天的日期
原文地址:https://blog.csdn.net/m0_61961937/article/details/130668167