5.6 System類與Runtime類
5.6.1 System類
Java
不支持全局函數(shù)和全局變量,Java
設(shè)計者將一些與系統(tǒng)相關(guān)的重要函數(shù)和變量收集到了一個System
類中,System
類中的所有成員都是靜態(tài)的,當(dāng)要應(yīng)用這些變量和方法的時候棵帽,直接使用System
類名做前綴就可以了愕把。
1. exit()方法
終止當(dāng)前正在運行的虛擬機频鉴,參數(shù)用作狀態(tài)碼榄檬,按照慣例,非0的狀態(tài)碼表示異常終止刹悴。事實上要退出Java
程序行楞,可以使用destory()
退出一個獨立運行的過程。
2. currentTimeMills方法
System.currentTimeMills()
產(chǎn)生一個當(dāng)前的毫秒數(shù)土匀,這個毫秒就是自1970年1月1日0時起的毫秒數(shù)子房。
5.6.2 Runtime類
Runtime
類封裝了Java
命令本身所啟動的實例進(jìn)程,也就是封裝了Java
虛擬機進(jìn)程。一個Java
虛擬機對應(yīng)一個Runtime
實例對象证杭。Runtime
類中的許多方法和System
類中的方法重復(fù)田度,不能直接創(chuàng)建Runtime
的實例對象,也就是不能通過new
來創(chuàng)建解愤,只能通過Runtime.getRuntime
靜態(tài)方法來獲得Runtime
實例對象的引用镇饺。
Java
虛擬機本身就是Windows
上的一個進(jìn)程,這個進(jìn)程可以啟動其他的Windows
程序送讲,通過這種方式啟動的Windows
程序?qū)嵗头Q為子進(jìn)程奸笤。Java
虛擬機調(diào)用Runtime
的exec
方法可以啟動這個子進(jìn)程,其返回值就是代表子進(jìn)程的Process對象李茫。
Process類是一個抽象類揭保,封裝一個進(jìn)程。
5.7 Date類和Carlendar類
Java
語言提供了以下兩個類來處理日期魄宏。
java.util.Date
包裝了一個long
類型的數(shù)據(jù),表示與GMT
(格林威治標(biāo)準(zhǔn)時間)的1970年1月1日00:00:00這一刻所相距的毫秒數(shù)存筏。java.util.Calendar
可以靈活地設(shè)置或讀取日期中的年宠互,月,日椭坚,時予跌,分,秒等信息善茎。
5.7.1 Date類
java.util
包中的Date
類表示特定的時間券册,精確到毫秒。使用Date
類的無參構(gòu)造函數(shù)Date()
創(chuàng)建的對象可以獲取本地當(dāng)前時間垂涯。
Date();
分配Date
對象并初始化此對象烁焙,以表示分配它的時間(精確到毫秒)。在類Date
所有可以接受或返回年耕赘,月骄蝇,日,小時操骡,分鐘和秒值的方法中九火,將使用下面的表示形式。
- 年份
y
由整數(shù)y-1900表示- 月份由從0-11的整數(shù)表示册招。0是一月岔激,1是二月等,因此11是十二月是掰。
- 日期(一月中的某天)按通常方式由整數(shù)1-31表示
- 小時由從0-23的整數(shù)表示虑鼎,因此從午夜到1 a.m.的時間是0點,從中午到1 p.m.的時間是12點冀惭。
- 分鐘按通常方式由0-59的整數(shù)表示震叙。
- 秒由0-61的整數(shù)表示掀鹅,值60和61只對閏秒發(fā)生,盡管那樣媒楼,也只用在實際正確跟蹤閏秒的
Java
實現(xiàn)中乐尊。若按當(dāng)前引入閏秒的方式,兩個閏秒在同一分鐘內(nèi)發(fā)生是極不可能的划址,但此規(guī)范遵循ISO C的日期和時間約定扔嵌。
3中格式輸出時間
Date nowTime = new Date();
System.out.println(nowTime);
SimpleDateFormat matter1 = new SimpleDateFormat("'time':yyyy年mm月dd日E 北京時間");
System.out.println(matter1.format(nowTime));
SimpleDateFormat matter2 = new SimpleDateFormat("北京時間:yyyy年mm月dd日hh時mm分ss秒");
System.out.println(matter2.format(nowTime));
Date date1 = new Date(1000);
Date date2 = new Date(-1000);
System.out.println(matter2.format(date1));
System.out.println(matter2.format(date2));
System.out.println(new Date(System.currentTimeMillis()));
Tue Apr 17 21:54:20 CST 2018
time:2018年54月17日星期二 北京時間
北京時間:2018年54月17日09時54分20秒
北京時間:1970年00月01日08時00分01秒
北京時間:1970年59月01日07時59分59秒
Tue Apr 17 21:54:20 CST 2018
5.7.2 Calendar類
java.util.Calendar
類是一個抽象類。它為特定瞬間與一組諸如YEAR
夺颤,MONTH
痢缎,DAY_OF_MONTH
,HOUR
等日歷字段之間的轉(zhuǎn)換提供了一些方法世澜,并為操作日歷字段(例如獲得下星期的日期)提供了一些方法独旷。
抽象類不能采用new
實例化,但可以使用Calendar
類的static
方法getInstance()
初始化一個日歷對象寥裂。
Calendar calendar = Calendar.getInstance();
set
和get
方法可用來設(shè)置和讀取日期的特定部分嵌洼,比如年,月封恰,日麻养,時,分诺舔,秒等鳖昌。
將日歷翻到任何一個時間,參數(shù)year取負(fù)數(shù)時表示公元前低飒。
public int get(int field);
可以獲取有關(guān)年份许昨,月份,小時逸嘀,星期等信息车要,參數(shù)field
的有效值由Calendar
的靜態(tài)常量指定。
calendar.get(Calendar.MONTH);
返回一個整數(shù)崭倘,如果該整數(shù)是0表示當(dāng)前日歷是在一月翼岁,該整數(shù)是1表示當(dāng)前日歷是在二月等。
public long getTimeInMillis();
返回此calendar的時間值司光,以毫秒為單位琅坡。
public class GregorianCalendar1 {
public static void main(String[] args) {
GregorianCalendar cal = new GregorianCalendar(); // 表示當(dāng)前時間
System.out.println(new SimpleDateFormat("yyyy-mm-dd hh:mm:ss EEEE").format(cal.getTime()));
cal.clear();
cal.set(Calendar.YEAR, 2018);
cal.set(Calendar.MONTH, Calendar.JULY);
cal.set(Calendar.DAY_OF_MONTH, 15);
cal.set(Calendar.HOUR_OF_DAY, 12);
cal.set(Calendar.MINUTE, 33);
cal.set(Calendar.SECOND, 55);
System.out.println(new SimpleDateFormat("yyyy-mm-dd hh:mm:ss EEEE").format(cal.getTime()));
}
}
2018-17-17 09:17:25 星期二
2018-33-15 12:33:55 星期日
private void initDate() {
String temp = "2018-04-19";
DateFormat format = new SimpleDateFormat("yyyy-MM-dd");
try {
Date date = format.parse(temp);
Calendar calendar = new GregorianCalendar();
calendar.setTime(date);
calendar.set(Calendar.DATE,19); // 設(shè)置該月的日期 即4月19日
int a = calendar.get(Calendar.DAY_OF_WEEK); // 星期四,但是顯示是5残家,因為星期日是1榆俺,星期六是7
int b = calendar.getActualMaximum(Calendar.DATE); // 得到字段Calendar.DATE在日歷中的最大值
calendar.add(Calendar.DATE,1); // 天數(shù)增加1
} catch (ParseException e) {
e.printStackTrace();
}
}
5.8 Math與Random類
5.8.1 Math類
java.lang包中的Math類也稱數(shù)學(xué)類,是一個工具類,它在解決與數(shù)學(xué)有關(guān)的一些問題時有著非常重要的作用茴晋。Math類包含許多用來進(jìn)行科學(xué)計算的類方法陪捷,涉及到大多數(shù)數(shù)學(xué)函數(shù),如sin诺擅,cos市袖,exp,abs等烁涌,這些方法可以直接通過類名調(diào)用苍碟。Math類還提供了Math.PI和Math.E兩個靜態(tài)數(shù)學(xué)常量:E和PI,它們的值分別為2.7182828284590452354和3.14159265358979323846撮执,該類是final的微峰,不能被繼承,類中的方法和屬性全部是靜態(tài)的抒钱,不允許在類的外部創(chuàng)建Math類的對象蜓肆。因此只能使用Math類的方法而不能對其做任何更改。
Math.abs(12.3); //12.3 返回這個數(shù)的絕對值
Math.abs(-12.3); //12.3
Math.copySign(1.23, -12.3); //-1.23,返回第一個參數(shù)的量值和第二個參數(shù)的符號
Math.copySign(-12.3, 1.23); //12.3
Math.signum(x); //如果x大于0則返回1.0继效,小于0則返回-1.0症杏,等于0則返回0
Math.signum(12.3); //1.0
Math.signum(-12.3); //-1.0
Math.signum(0); //0.0
//指數(shù)
Math.exp(x); //e的x次冪
Math.expm1(x); //e的x次冪 - 1
Math.scalb(x, y); //x*(2的y次冪)
Math.scalb(12.3, 3); //12.3*23
//取整
Math.ceil(12.3); //返回最近的且大于這個數(shù)的整數(shù)13.0
Math.ceil(-12.3); //-12.0
Math.floor(12.3); //返回最近的且小于這個數(shù)的整數(shù)12.0
Math.floor(-12.3); //-13.0
//x和y平方和的二次方根
Math.hypot(x, y); //√(x2+y2)
//返回概述的二次方根
Math.sqrt(x); //√(x) x的二次方根
Math.sqrt(9); //3.0
Math.sqrt(16); //4.0
//返回該數(shù)的立方根
Math.cbrt(27.0); //3
Math.cbrt(-125.0); //-5
//對數(shù)函數(shù)
Math.log(e); //1 以e為底的對數(shù)
Math.log10(100); //10 以10為底的對數(shù)
Math.log1p(x); //Ln(x+ 1)
//返回較大值和較小值
Math.max(x, y); //返回x、y中較大的那個數(shù)
Math.min(x, y); //返回x瑞信、y中較小的那個數(shù)
//返回 x的y次冪
Math.pow(x, y);
Math.pow(2, 3); //即23 即返回:8
//隨機返回[0,1)之間的無符號double值
Math.random();
//返回最接近這個數(shù)的整數(shù),如果剛好居中,則取偶數(shù)
Math.rint(12.3); //12.0
Math.rint(-12.3); //-12.0
Math.rint(78.9); //79.0
Math.rint(-78.9); //-79.0
Math.rint(34.5); //34.0
Math.rint(35.5); //36.0
Math.round(12.3); //與rint相似穴豫,返回值為long
//三角函數(shù)
Math.sin(α); //sin(α)的值
Math.cos(α); //cos(α)的值
Math.tan(α); //tan(α)的值
//求角
Math.asin(x/z); //返回角度值[-π/2凡简,π/2] arc sin(x/z)
Math.acos(y/z); //返回角度值[0~π] arc cos(y/z)
Math.atan(y/x); //返回角度值[-π/2,π/2]
Math.atan2(y-y0, x-x0); //同上精肃,返回經(jīng)過點(x据过,y)與原點的的直線和經(jīng)過點(x0翅睛,y0)與原點的直線之間所成的夾角
Math.sinh(x); //雙曲正弦函數(shù)sinh(x)=(exp(x) - exp(-x)) / 2.0;
Math.cosh(x); //雙曲余弦函數(shù)cosh(x)=(exp(x) + exp(-x)) / 2.0;
Math.tanh(x); //tanh(x) = sinh(x) / cosh(x);
//角度弧度互換
Math.toDegrees(angrad); //角度轉(zhuǎn)換成弧度,返回:angrad * 180d / PI
Math.toRadians(angdeg); //弧度轉(zhuǎn)換成角度,返回:angdeg / 180d * PI