在 Java 中,并不是所有的类都具有面向对象特征。例如,Math 类。里面都是静态变量和静态方法。

对象与对象变量

要想使用对象,就必须首先构造对象,并指定其初始状态。然后,对对象应用方法。在 Java 程序设计语言中,使用构造器(constructor)构造新实例。构造器是一种特殊的方法,用来构造并初始化对象。
所有的 Java 对象都存在堆中。

  1. new Date(); // 构造一个 Date 对象
  2. Date birthday = new Date(); // 构造一个 Date 对象,并存放在变量中
  3. Date deadline; // 此时 deadline 只是一个对象变量。它没有包含一个对象,而仅仅引用一个对象
  4. deadline = new Date; // 初始化对象变量。new 操作符返回值也是一个引用
  5. deadline = birthday; // 引用 birthday
  6. deadline = null;

在方法中的局部变量不会自动初始化(0,false,null),必须手动来进行。

LocalDate 类

不要使用构造器来构造 LocalDate 类的对象。应当使用静态工厂方法(factory method)来调用构造器。

  1. LocalDate.now();
  2. LocalDate.of(1999, 12, 31);
  3. LocalDate newYearsEve = LocalDate.of(1999, 12, 31);
  4. int year = newYearsEve.getYear(); // 1999
  5. int month = newYearsEve.getMothValue(); // 12
  6. int day = newYearsEve.getDayOfMonth() // 31
  7. LocalDate aThousandDaysLater = newYearsEve.plusDays(1000);

更改器方法和访问器方法

一个对象调用某个方法后,该对象会改变。该方法就是更改器方法(mutator method)。
一个对象调用某个方法后,该对象不会改变。该方法就是访问器方法(accessor method)。
更改器方法不一定是要改变传入的对象,也可以是要改变返回的对象。如,在上述的 LocalDate 类中,newYearEve.plusDays(1000) 就是一个更改器方法。它本身并不会改变(因为它是不可变类),但是它返回了一个从 newYearsEve 基础上改变的 LocalDate 实例。
我们来写一个打印日历的程序来学习这两个方法:

  1. LocalDate date = LocalDate.now(); // get now time
  2. int month = date.getMonthValue();
  3. int today = date.getDayOfMonth();
  4. date = date.minusDays(today - 1); // Set to start of month // 设置成一个月的第一天
  5. DayOfWeek weekday = date.getDayOfWeek();
  6. int value = weekday.getValue(); // 1 = Monday, ... 7 = Sunday
  7. System.out.println("Mon Tue Wed Thu Fri Sat Sun");
  8. for (int i = 1; i < value; i++)
  9. System.out.print(" ");
  10. while (date.getMonthValue() == month)
  11. {
  12. System.out.printf("%3d", date.getDayOfMonth());
  13. if (date.getDayOfMonth() == today)
  14. System.out.print("*");
  15. else
  16. System.out.print(" ");
  17. date = date.plusDays(1);
  18. if (date.getDayOfWeek().getValue() == 1) System.out.println();
  19. }
  20. if (date.getDayOfWeek().getValue() != 1) System.out.println(); // 如果是星期一,代表真实的日期是 周末,在 while 循环里已经换过行了。