《Java核心技術 卷I》學習筆記10:使用預定義類

ALL禿發表於2020-11-15

1 物件與物件變數

要想使用物件,首先必須構造物件,並指定其初始狀態,然後對物件應用方法。

使用構造器構造新例項。構造器是一種特殊的方法,用來構造並初始化物件。下面以標準Java庫中的Date類為例,介紹構造器的使用方法。

構造器的名字與類名相同,在構造器前面加上new操作符,就可以構造一個物件。例如:

new Date();

這個表示式構造了一個新物件,並被初始化為當前的日期和時間。

可以將新物件傳遞給一個方法,例如:

System.out.println(new Date());

也可以對新物件應用一個方法,例如:

String s = new Date().toString(); //返回日期的字串描述

在上面的例子中,構造的物件只能使用一次。為了讓物件可以多次使用,需要將物件存放在一個變數中。例如:

Date birthday = new Date();

物件變數不等於物件。物件變數並不包含物件,它只是引用一個物件。當物件變數沒有引用任何物件時,不能在這個變數上使用方法,否則會產生編譯錯誤。例如:

Date deadline;
String s = deadline.toString(); //錯誤

必須首先初始化變數,可以讓它引用一個新構造的物件,也可以引用一個已有的物件。例如:

Date deadline = new Date();
Date date = deadline; //此時變數deadline和date引用同一個物件

可以顯式地將物件變數設定為null,指示這個物件變數沒有引用任何物件。例如:

Date time = null;

在Java中,任何物件變數的值都是對儲存在另外一個地方的某個物件的引用,new操作符的返回值也是一個引用。可以將Java中的物件變數看做類似於C++的物件指標。

2 LocalDate類

上面提到的Date類用來表示時間點,而LocalDate類用日曆表示法表示日期。下面列出LocalDate類的一些常用方法。

/* java.time.LocalDate */
static LocalDate now() //構造一個表示當前日期的物件
static LocalDate of(int year, int month, int dayOfMonth) //構造一個表示給定日期的物件
int getYear() //得到當前物件指定日期的年
int getMonthValue() //得到當前物件指定日期的月
int getDayOfMonth() //得到當前物件指定日期的日
DayOfWeek getDayOfWeek()
	//得到當前物件指定日期的星期數,返回DayOfWeek類的一個例項。
	//對DayOfWeek類的例項呼叫getValue方法得到1~7之間的一個數,1表示星期一,7表示星期日。
LocalDate plusDays(long daysToAdd) //生成當前物件指定日期之後n天的日期
LocalDate minusDays(long daysToSubtract) //生成當前物件指定日期之前n天的日期

只訪問物件而不修改物件的方法稱為訪問器方法,修改物件的方法稱為更改器方法。例如,上面的plusDays方法得到當前物件指定日期之後n天的日期,但並不改變當前物件,因此它是訪問器方法。

應用例項:列印當前月的日曆

import java.time.*;

public class Calendar
{
	public static void main(String[] args)
	{
		LocalDate date = LocateDate.now(); //構造一個物件,並用當前日期初始化
		int month = date.getMonthValue(); //得到當前月份
		int today = date.getDayOfMonth(); //得到當前日期

		date = date.minusDays(today - 1); //將date設定為這個月的第一天
		int value = date.getDayOfWeek().getValue(); //得到這個月的第一天是星期幾

		System.out.println("Mon Tue Wed Thu Fri Sat Sun"); //列印表頭
		for (int i = 1; i < value; i++)
		{
			System.out.print("    "); //列印第一行的縮排,內容為4個空格
		}
		
		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();
		}
	}
}

執行結果:
Mon Tue Wed Thu Fri Sat Sun
                          1 
  2   3   4   5   6   7   8 
  9  10  11  12  13  14  15*
 16  17  18  19  20  21  22 
 23  24  25  26  27  28  29 
 30 

在這個例子中,不需要考慮這個月有幾天,不需要考慮星期數如何計算,只需要呼叫方法,而不用考慮方法的具體實現,這體現了封裝性的優勢。

相關文章