關(guān)于在Java中使用預(yù)定義類
在Java中,沒有類就無(wú)法做任何事情。然而,并不是所有的類都表現(xiàn)出面向?qū)ο蟮牡湫吞卣?。?strong>Math.Random為例,我們不必具體了解如何實(shí)現(xiàn)的,只需要方法名和參數(shù)。這正是封裝的關(guān)鍵所在。Math類只封裝了功能,所以不需要隱藏?cái)?shù)據(jù)。由于沒有數(shù)據(jù),因此不必考慮創(chuàng)建對(duì)象和初始化它們的實(shí)例字段,因?yàn)楦緵]有實(shí)例字段。
一、對(duì)象與對(duì)象變量
要使用對(duì)象首先必須構(gòu)造對(duì)象,并指定其初始化狀態(tài),然后對(duì)對(duì)象應(yīng)用方法。
在Java中,要使用構(gòu)造器(constructor,或稱構(gòu)造函數(shù))構(gòu)造新實(shí)例。構(gòu)造器是一種特殊的方法,其作用是構(gòu)造并初始化對(duì)象。
構(gòu)造器總是與類名同名。因此,Date類的構(gòu)造器就名為Date。要想構(gòu)造一個(gè)Date對(duì)象,需要在構(gòu)造器前面加上new操作符。如下例子:
new Date()
這個(gè)表達(dá)式會(huì)構(gòu)造一個(gè)新對(duì)象。這個(gè)對(duì)象初始化為當(dāng)前的日期和時(shí)間。
如果需要,可以將這個(gè)對(duì)象傳遞給一個(gè)方法:
System.out.println(new Date());
或者對(duì)剛構(gòu)造的對(duì)象應(yīng)用一個(gè)方法。Date類中有一個(gè)toString方法。這個(gè)方法將生成日期的一個(gè)字符串描述,可以如下對(duì)Date對(duì)象應(yīng)用toString方法:
String s = new Date().toString();
上面兩個(gè)例子,構(gòu)造對(duì)象僅使用了一次。通常,你可能希望保留所構(gòu)造的對(duì)象從而能繼續(xù)使用,為此,需要將對(duì)象存放值一個(gè)變量中:
Date rightNow = new Date();
對(duì)象和對(duì)象變量存在一個(gè)重要的區(qū)別,例如:
Date startTime; s = startTime.toString(); //not yet
上例定義了一個(gè)對(duì)象變量startTime,它可以引用Date類型的變量。但是,startTime不是一個(gè)對(duì)象,而且實(shí)際上它甚至還沒有引用任何對(duì)象,所以不能在這個(gè)變量上用任何Date方法,將會(huì)產(chǎn)生編譯錯(cuò)誤。
必須初始化startTime變量,讓它引用一個(gè)新構(gòu)造的對(duì)象:
startTime = new Date();
也可以設(shè)置這個(gè)變量,讓它引用一個(gè)已有的對(duì)象:
startTime = rightNow;
重要的一點(diǎn):對(duì)象變量并不實(shí)際包含一個(gè)對(duì)象,它只是引用一個(gè)對(duì)象
在Java中,任何對(duì)象變量的值都是一個(gè)引用,指向存儲(chǔ)在另外一個(gè)地方的某個(gè)對(duì)象。
二、Java類庫(kù)中的LocalDate類
標(biāo)準(zhǔn)Java類庫(kù)分別包含了兩個(gè)類:一個(gè)是用來(lái)表示時(shí)間點(diǎn)的Date類;另一個(gè)是用大家熟悉的日歷表示法表示日期的LocalDate類。將時(shí)間度量與日歷分開是一種很好的面向?qū)ο笤O(shè)計(jì)。
不要使用構(gòu)造器來(lái)構(gòu)造LocalDate對(duì)象。應(yīng)用使用靜態(tài)工廠方法(factory method),它會(huì)代表你調(diào)用的構(gòu)造器,下面式表達(dá)式:
LocalDate.now()
上例會(huì)構(gòu)造一個(gè)新對(duì)象,表示構(gòu)造這個(gè)對(duì)象時(shí)的日期。
可以提供年、月、日來(lái)構(gòu)造對(duì)應(yīng)一個(gè)特定日期的對(duì)象,并保存在一個(gè)對(duì)象變量中:
LocalDate newYearEve = LocalDate.of(2020,2,2)
也可以使用plusDays方法,把應(yīng)用這個(gè)方法的對(duì)象稱為當(dāng)前對(duì)象,那么這個(gè)新日期對(duì)象則是距當(dāng)前對(duì)象指定天數(shù)的一個(gè)新日期:
LocalDate aThousandDaysLater = newYearsEve.plusDays(1000); int year = aThousandDays.getYear(); int month = aThousanDays.getMonthValue(); int day = aThousanDays.getDayOfMonth();
LocalDate類封裝了一些實(shí)例字段來(lái)維護(hù)所設(shè)置的日期。
三、更改器方法與訪問器方法
Java庫(kù)較早版本曾經(jīng)有另一個(gè)處理日歷的類,名為GregorianCalender。如下這個(gè)類表示的是一個(gè)日期增加1000天:
GregorianCalendar someDay = new GregorianCalendar(1999,11,31); someDay.add(Calender.DAY_OF_MONTH,1000);
與LocalDate.plusDays方法不同,GregorianCalendar.add方法是一個(gè)更改器方法(mutator method)。調(diào)用這個(gè)方法后,someDay對(duì)象的狀態(tài)會(huì)改變。
相反,只訪問對(duì)象而不修改對(duì)象的方法有時(shí)稱為訪問器方法(accessor method)。例如,LocalDate.getYear和GregorianCalender.get就是訪問器方法。
使用LocalDate類顯示當(dāng)前月的日歷:
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();
}
}
}執(zhí)行結(jié)果:

java.time.LocalDate API:
- static LocalDate now()
構(gòu)造一個(gè)表示當(dāng)前日期的對(duì)象
- static LocalDate of(int year, int month, int day)
構(gòu)造一個(gè)表示給定日期的對(duì)象
- int getYear()
- int getMonthValue()
- int getDayOfMonth()
得到當(dāng)前日期的年、月和日
- DayOfWeek getDayOfWeek()
得到當(dāng)前日期是星期幾,作為DayOfWeek類的一個(gè)實(shí)例返回。在DayOfWeek實(shí)例上調(diào)用getValue來(lái)得到1-7之間的一個(gè)數(shù),表示這是返回的星期幾,1表示星期一,7表示星期日
- LocalDate plusDays(int n)
- LocalDate minusDays(int n)
生成當(dāng)前日期之后或之前n天的日期
到此這篇關(guān)于關(guān)于在Java中使用預(yù)定義類的文章就介紹到這了,更多相關(guān)Java預(yù)定義類內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
MyBatis-Plus多數(shù)據(jù)源的示例代碼
本文主要介紹了MyBatis-Plus多數(shù)據(jù)源的示例代碼,包括依賴配置、數(shù)據(jù)源配置、Mapper 和 Service 的定義,具有一定的參考價(jià)值,感興趣的可以了解一下2024-05-05
springmvc處理響應(yīng)數(shù)據(jù)的解析
今天小編就為大家分享一篇關(guān)于springmvc處理響應(yīng)數(shù)據(jù)的解析,小編覺得內(nèi)容挺不錯(cuò)的,現(xiàn)在分享給大家,具有很好的參考價(jià)值,需要的朋友一起跟隨小編來(lái)看看吧2019-01-01
Maven導(dǎo)入依賴時(shí)報(bào)錯(cuò)如何解決
這篇文章主要介紹了Maven導(dǎo)入依賴時(shí)報(bào)錯(cuò)如何解決,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2020-12-12
AsyncHttpClient?RequestFilter請(qǐng)求篩選源碼解讀
這篇文章主要為大家介紹了AsyncHttpClient?RequestFilter請(qǐng)求篩選源碼解讀,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2023-12-12
SpringBoot利用filter實(shí)現(xiàn)xss防御功能
Cross-Site?Scripting(跨站腳本攻擊)簡(jiǎn)稱?XSS,是一種代碼注入攻擊,攻擊者通過(guò)在目標(biāo)網(wǎng)站上注入惡意腳本,使之在用戶的瀏覽器上運(yùn)行,利用這些惡意腳本,攻擊者可獲取用戶的敏感信息,本文給大家介紹了SpringBoot利用filter實(shí)現(xiàn)xss防御功能,需要的朋友可以參考下2024-09-09
提示:Decompiled.class file,bytecode version如何解決
在處理Decompiled.classfile和bytecodeversion問題時(shí),通過(guò)修改Maven配置文件,添加阿里云鏡像并去掉默認(rèn)鏡像,解決了下載源的問題,同時(shí),檢查并修改了依賴版本,確保了問題的解決2024-12-12
Java concurrency線程池之線程池原理(一)_動(dòng)力節(jié)點(diǎn)Java學(xué)院整理
這篇文章主要為大家詳細(xì)介紹了Java concurrency線程池之線程池原理,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2017-06-06

