在 Java 中,并不是所有的类都具有面向对象特征。例如,Math 类。里面都是静态变量和静态方法。
对象与对象变量
要想使用对象,就必须首先构造对象,并指定其初始状态。然后,对对象应用方法。在 Java 程序设计语言中,使用构造器(constructor)构造新实例。构造器是一种特殊的方法,用来构造并初始化对象。
所有的 Java 对象都存在堆中。
new Date(); // 构造一个 Date 对象
Date birthday = new Date(); // 构造一个 Date 对象,并存放在变量中
Date deadline; // 此时 deadline 只是一个对象变量。它没有包含一个对象,而仅仅引用一个对象
deadline = new Date; // 初始化对象变量。new 操作符返回值也是一个引用
deadline = birthday; // 引用 birthday
deadline = null;
在方法中的局部变量不会自动初始化(0,false,null),必须手动来进行。
LocalDate 类
不要使用构造器来构造 LocalDate 类的对象。应当使用静态工厂方法(factory method)来调用构造器。
LocalDate.now();
LocalDate.of(1999, 12, 31);
LocalDate newYearsEve = LocalDate.of(1999, 12, 31);
int year = newYearsEve.getYear(); // 1999
int month = newYearsEve.getMothValue(); // 12
int day = newYearsEve.getDayOfMonth() // 31
LocalDate aThousandDaysLater = newYearsEve.plusDays(1000);
更改器方法和访问器方法
一个对象调用某个方法后,该对象会改变。该方法就是更改器方法(mutator method)。
一个对象调用某个方法后,该对象不会改变。该方法就是访问器方法(accessor method)。
更改器方法不一定是要改变传入的对象,也可以是要改变返回的对象。如,在上述的 LocalDate
类中,newYearEve.plusDays(1000)
就是一个更改器方法。它本身并不会改变(因为它是不可变类),但是它返回了一个从 newYearsEve
基础上改变的 LocalDate
实例。
我们来写一个打印日历的程序来学习这两个方法:
LocalDate date = LocalDate.now(); // get now time
int month = date.getMonthValue();
int today = date.getDayOfMonth();
date = date.minusDays(today - 1); // Set to start of month // 设置成一个月的第一天
DayOfWeek weekday = date.getDayOfWeek();
int value = weekday.getValue(); // 1 = Monday, ... 7 = Sunday
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(); // 如果是星期一,代表真实的日期是 周末,在 while 循环里已经换过行了。