Java中幾個常用類總結
一. System:
1. 首先是System類,因為從一開始從接觸java起,我們就無時無刻都在接觸它,經常用它來向螢幕,向控制檯列印輸出一些資訊,System.out.println(“hello world”);這個只是在控制檯輸出一條資訊“hello world”,今天我們學到這裡,才知道out只是System類中的一個欄位,也就是一個成員變數,而且還是靜態的,是一個物件的引用,即PrintStream,是標準的輸出流,向標準的輸出裝置輸出資訊的,所以我們這裡才呼叫了物件out的println()這個方法。所以類似與out欄位的還有其他兩個,如in是InputStream類的一個物件,那麼in則是一個標準的輸入物件,他可以讀取或則也可以說從鍵盤或則其他輸入裝置接收或者讀入一個資訊,那麼err也是PrintStream類的一個物件,則是標準的錯誤輸出流,那其實這些所謂的標準的輸入輸出,他們功能實現底層是靠C語言和裝置直接溝通的,java只是依賴C語言完成了這些功能。
2. 老師說學習System這個類並不是說要去做太多的深入瞭解,而是希望我們能掌握一些查閱API,掌握這個類中常用的幾個方法,在以後的開發中能夠寫出一些需要的小東西。
3. Java中System這個類中的屬性和方法都是靜態的,可以通過類名可以直接呼叫,而且它位於java預設的包中java.lang包中,一般情況下我們要使用它的方法和屬性,是不需要做匯入包的動作的,然後我們還發先這個類沒有構造方法,所以這就說明我們不能建立一個System類的物件,只能通過類名來直接呼叫它的屬性和方法了,注意,它還是一個final型別的修飾的類。那麼我們來看看還有什麼那些方法比較重要呢?
A. static Properties
它的返回值是Properties,通過產看API文件我們知道這是一個類物件,是Map集合範疇的一個子類物件,它繼承於HashTable<Object,Object>這個類,所以我們可以得知,我們可以使用Map種的一些方法去獲得Properties的一些屬性資訊了,所以Properties中存放的也都是以鍵值對的形式存在的了,練習一下這個方法吧。。。
package com.System; import java.util.*; public class PropertiesDemo { public static void main(String[] args) { System.out.println("java.vendor = "+System.getProperty("java.vendor")); //@獲取當前系統所有屬性和java虛擬機器載入的一些系統屬性 Properties p = System.getProperties(); //通過上一步驟獲得之後,我們可以利用Map種的方法獲得//Map.Entry<Object,Object>型別的set集合的迭代器來遍歷我們獲取到//的資訊了//這只是其中一種方法,還可以使用其他的方法。 Iterator<Map.Entry<Object,Object>> iter = p.entrySet().iterator(); while(iter.hasNext()) { Map.Entry<Object,Object> map = iter.next(); //因為這裡沒有使用泛型,所以要做一個強制轉換的動作,我們知道這些屬 //性和key獲得之後都是以String的方式存在的,我們直接將其轉換為String //型別就好 String key = (String)map.getKey(); String value = (String)map.getValue(); System.out.println(key+" = " +value); } } }
通過執行以上程式碼,我們可以看到當前作業系統的版本,使用者國別,java虛擬機器執行目錄等資訊。
B. 接下來看一下static String getProperty()
那麼我們還可使用這個方法獲得指定key的屬性:
如上程式碼中這行語句,System.getProperty("java.vendor"),就可以單獨獲得java.vendor這個key對應的屬性了,哦,對了,它的返回值是一個String型別的,其實這個的主要功能是用在判斷當前系統版本和型別,來實現我們在不同作業系統上完成一些對應的功能,所以這也算是體現java跨平臺的一個小體現吧。
C. 既然能獲得一些key和屬性,那麼我們也可以設定一些自己的key和屬性,讓java虛擬機器執行的時候,我們可以去使用他們,去獲取他們,那就要使用到
staticString setProperty(String key , String value)方法了
System.setProperty("name","ansem");這樣我們就可以將自己定義的一個特有的屬性設定到系統中,然後就可以通過以上的獲得讀取方法進行獲得了。
D. 另外我們還可以在啟動java虛擬機器的時候,也就是執行javaXXXXXX的時候動態的設定一個key和屬性,起方式如下:
Java-D(name)=(value) 類名,就可以了。
二. Runtime
A. 接下來就要來做一下Runtime類的筆記了,通過查API,我們知道這個Runtime是一個與應用程式能夠與其執行的環境相關聯的,接下來我們發現這個類卻沒有構造方法,自身還不是一個抽象類或者介面,這時候我們就不能new出來一個Runtime類的物件了,那我們是不是會想到直接通過類名呼叫他的方法呢?可是我們檢視API,發現它還有很多不是靜態的方法,表示我們就不能直接呼叫了,所以我們會聯想到,這個類肯定有一個靜態的方法是使用來獲取Runtime物件例項的,那麼這個方法我們在API中可以找到是getRuntime()這個方法:
Runtime r = Runtime.getRuntime()這個方法就可以返回一個Runtime類的例項了,
而且是這個例項是當前與java應用程式相關的執行時物件。
B. 由此我們可以深刻的體會到,這就是運用了java單例設計模式,保證了此時此刻只能有一個當前與java應用程式相關的執行時物件。
C. 接下來我們來看一個Runtime類比較常用的一個方法exec(String command),這個方法是建立一個指定的本機程序,直接貼程式碼吧。。。。。。
package com.Runtime;
public class RuntimeDemo
{
public static void main(String[] args) throws Exception
{
//如上所說,利用Runtime類的getRuntime()方法來返回一個當前與java應用程式相、//關的執行時物件
Runtime re = Runtime.getRuntime();
/*檢視API我們知道exec(String command)方法返回的是一個Process類的物件
所以我們在這裡定一個Process類變數,返回值賦給p,所以當代碼執行到這一行的時候,就會執行本機器上的一個外部應用程式即notepad.exe文字編輯器,這裡沒加notepad.exe的所在目錄,是因為,notepad.exe是在C:\Windows\system32目錄下面,系統預設將這個目錄新增到path環境變數中了,系統會在當前目錄下尋找,找不到的話會自動到C:\Windows\system32去找,然後執行它。
*/
Process p = re.exec("notepad.exe");
Thread.sleep(5000);
p.destroy();
System.out.println(p.exitValue());
}
}
D. 說到Runtiem,然後和他聯絡十分緊密的一個類是Process,這個類中是一個抽象類,方法全部是抽象的,同樣也沒有任何子類,所以他一般是通過ProcessBuilder.start()
和Runtime.exec
方法建立一個本機程序,並返回Process
子類的一個例項,該例項可用來控制程序並獲取相關資訊。Process
類提供了執行從程序輸入、執行輸出到程序、等待程序完成、檢查程序的退出狀態以及銷燬(殺掉)程序的方法,它的一個destroy()方法可以用來結束一個程序,而且它只能結束ProcessBuilder.start()
和Runtime.exec
方法獲得Process例項所對應的程序。
我們也來貼幾段幾行程式碼看一看吧。。。。。
package com.Runtime;
public class RuntimeDemo
{
public static void main(String[] args) throws Exception
{
Runtime re = Runtime.getRuntime();
Process p = re.exec("notepad.exe");
//呼叫執行緒類得sleep(long Milli),就是程式執行到這行程式碼的時候,先停止繼續執//行,休眠指定的時間,因為下面的結束程序語句執行非常快,會秒殺Process p = /re.exec("notepad.exe")程式碼執行出來的程序,所以才加sleep的
Thread.sleep(5000);
p.destroy();
System.out.println(p.exitValue());
}
}
三. Date類
接下來是Date類,可想而知,Date就是一個跟時間操作相關的,不多說我們來看看吧,Date類是位於java.util包中的,Date
表示特定的瞬間,精確到毫秒。我們檢視API可以發現,他有多個構造方法,但是大多數構造方法都已經過時了,這裡的過時就表明這個方法或則構造方法不建議被使用了,所以剩下來的,比較常用的一個構造方法就是Date()了,它可以將當前系統的時間資訊作為值初始化給他的成員變數,好了不多說,我們建立一個物件看看看效果吧。。。
package com.date;
import java.util.*;
import java.text.*;
public class DateDemo
{
public static void main(String[] args)
{
Date d = new Date();
System.out.println(d);
}
}
執行結果為: MonAug05 16:20:29 CST 2010
看上去結果特別彆扭,那麼我們要怎麼才能轉換成我們喜歡的格式呢?是不是有相應的方法去實現以某種格式顯示時間呢?
接著,我們查API,發現這個類中有一些獲得年,月,日….的一些方法,可是都表明已經過時了,這就以為著我們在開發中不能使用了,那麼接下來,再檢視API,發現在另請參見這個地方有一個與之相關聯的類DateFormat,我們再看看它的API吧,我們發現這個類是一個抽象類,當然這個類的大部分功能使用來格式化一個時間的,既然他是一個抽象類,那麼我們只能依靠它的子類SimpleDateFormat了我們再看SimpleDateFormat,這個類是存在於java.text包中,我們看到這個類有四個構造方法,但是我這裡只介紹一個比較常用的構造方法SimpleDateFormat(
String
pattern)
,用給定的模式和預設語言環境的日期格式符號構造 SimpleDateFormat
,也就是說我們可以給她傳遞一個字串型別的引數,然後去呼叫他的時間格式化方法,就能按照給定字串方式轉換出我們需要的時間格式,不多說,看程式碼。。。。。。
package com.date;
import java.util.*;
import java.text.*;
public class DateDemo
{
public static void main(String[] args)
{
//首先建立一個Date物件。
Date d = new Date();
//然後使用DateFormat類的子類SimpleDateFormat類來建立一個物件
//並傳遞一個字串引數,至於這個字串引數,其實是有規定的,待會會說明。
SimpleDateFormat df = new SimpleDateFormat("yyyy年MM月d日 E a");
//接下來在使用其format方法,將Date作為被各式化物件傳遞進去,format方//法返回的是一個字串型別的時間表示。
String date = df.format(d);
System.out.println(date);
}
}
執行結果: 2010年08月5日 星期一 下午
很顯然結果是非常符合我們中國人的使用標準,哈哈,比較本地化了。。。。
說明一下SimpleDateFormat df = newSimpleDateFormat("yyyy年MM月d日 E a");這個構造方法的裡面的字串引數到底是怎麼回事,為什麼我們傳遞一個"yyyy年MM月d日 E a"引數就能拿到我們想要的時間格式呢?這是因為使用這個類的時候他們有一個時間日期模式的約定:
日期和時間格式由日期和時間模式 字串指定。在日期和時間模式字串中,未加引號的字母 'A' 到 'Z' 和 'a' 到 'z' 被解釋為模式字母,用來表示日期或時間字串元素。文字可以使用單引號 (') 引起來,以免進行解釋。"''" 表示單引號。所有其他字元均不解釋;只是在格式化時將它們簡單複製到輸出字串,或者在分析時與輸入字串進行匹配。
定義了以下模式字母(所有其他字元 'A' 到 'Z' 和 'a' 到 'z' 都被保留):
字母 |
日期或時間元素 |
表示 |
示例 |
|
Era 標誌符 |
Text |
|
|
年 |
Year |
|
|
年中的月份 |
Month |
|
|
年中的週數 |
Number |
|
|
月份中的週數 |
Number |
|
|
年中的天數 |
Number |
|
|
月份中的天數 |
Number |
|
|
月份中的星期 |
Number |
|
|
星期中的天數 |
Text |
|
|
Am/pm 標記 |
Text |
|
|
一天中的小時數(0-23) |
Number |
|
|
一天中的小時數(1-24) |
Number |
|
|
am/pm 中的小時數(0-11) |
Number |
|
|
am/pm 中的小時數(1-12) |
Number |
|
|
小時中的分鐘數 |
Number |
|
|
分鐘中的秒數 |
Number |
|
|
毫秒數 |
Number |
|
|
時區 |
General time zone |
|
|
時區 |
RFC 822 time zone |
|
示例
以下示例顯示瞭如何在美國語言環境中解釋日期和時間模式。給定的日期和時間為美國太平洋時區的本地時間 2001-07-0412:08:56。
日期和時間模式 |
結果 |
"yyyy.MM.dd G 'at' HH:mm:ss z" |
2001.07.04 AD at 12:08:56 PDT |
"EEE, MMM d, ''yy" |
Wed, Jul 4, '01 |
"h:mm a" |
12:08 PM |
"hh 'o''clock' a, zzzz" |
12 o'clock PM, Pacific Daylight Time |
"K:mm a, z" |
0:08 PM, PDT |
"yyyyy.MMMMM.dd GGG hh:mm aaa" |
02001.July.04 AD 12:08 PM |
"EEE, d MMM yyyy HH:mm:ss Z" |
Wed, 4 Jul 2001 12:08:56 -0700 |
"yyMMddHHmmssZ" |
010704120856-0700 |
"yyyy-MM-dd'T'HH:mm:ss.SSSZ" |
2001-07-04T12:08:56.235-0700 |
想必看到這裡大家就應該明白為什麼要這樣傳遞一個字串引數了.
四. Calender類
接下來再看與Date相關的另外一個類,Calender,它是一個抽象類,不過這裡類中有很多靜態的具體方法和欄位,這些是我們可以通過類名直接使用的,它的一欄位都表示一個日曆欄位,我們發現它有一個getInstance()
方法,他還有ige過載版本的,這裡就不多講了,一般我們使用不帶引數的就行了,這個方法會使用預設時區和語言環境獲得一個日曆,然後我再介紹幾個它的比較重要的方法就行了,看程式碼吧。。。。。
package com.date;
import java.util.*;
import java.text.*;
public class DateDemo2
{
public static void main(String[] args)
{
String[] week = {"","週日","週一","週二","週三","週四","週五","週六"};
String[] year = {"一月","二月","三月","四月","五月","六月","七月","八月","九月","十月","十一月","十二月"};
//獲取一個Calender類的例項。
Calendar c = Calendar.getInstance();
//獲取週中的星期幾,並用中文表示,利用查表法在week陣列中獲得中文表示
int index1 = c.get(Calendar.DAY_OF_WEEK);
//獲得日曆欄位中的月,也表示用中文表示,同樣也利用查表法獲得中文表示
int index2 = c.get(Calendar.MONTH);
//獲得完整的時間,並列印。
System.out.println(c.get(Calendar.YEAR)+"年"+year[index2]+c.get(Calendar.DAY_OF_MONTH)+"日"+"星期"+week[index1]);
}
}
列印結果: 2010年八月5日 星期週一
再看一個例子,這個例子是獲得任意年的2月有多少天:
package com.date;
import java.util.*;
import java.text.*;
public class DateDemo3
{
public static void main(String[] args)
{
System.out.println(getDays(2012));
}
public static int getDays(int year)
{
Calendar c = Calendar.getInstance();
//強制設定c例項當中的月份為傳進來年的3月1日,注意這裡的要表示3月
//1日卻為什麼是2呢,因為calender中月是從0開始表示的。
c.set(year,2,1);
//然後利用add方法將月裡面的天數往前減去1天,也就是表示2月的最後一天。
c.add(Calendar.DAY_OF_MONTH,-1);
int days = c.get(Calendar.DAY_OF_MONTH);
return days;
}
}
執行結果為:29
五. Math類Math類是一個用Final型別修飾的,是一個與數學操作相關的類,他和System類一樣沒有構造方法,但是他的欄位和方法都是靜態的,那就好了不用建立物件就能使用,太爽了,裡面一些方法是求什麼一些求正切,餘切等等,這些方法我就不多說了,直接貼程式碼,在程式碼中加註解說說幾個常用的方法就好了。。。
package com.Math;
public class MathCeilDemo
{
public static void main(String[] args)
{
//返回最小的(最接近負無窮大)double 值,該值大於或等於引數,並且等於某個整數。
double d = Math.ceil(21.56);
//返回最大的(最接近正無窮大)double 值,該值小於或等於引數,並且等於某個整數。
double d1 = Math.floor(21.56);
//round(double a) 返回最接近引數的 long。round(float a) 返回最接近引數的 int。
int l = (int)Math.round(12.54);
int l2 = (int)Math.round(12.34);
int l3 = (int)Math.round(-12.34);
//pow(double a, double b) 返回第一個引數的第二個引數次冪的值。
double d3 = Math.pow(3,3);
int a = 23;
int b = 24;
//min(int a, int b) 返回兩個 int 值中較小的一個。max(int a, int b) 返回兩個 int 值中較//大的一個。
int max = Math.max(a,b);
int min = Math.min(a,b);
sop(d3);
sop(d);
sop(d1);
sop(max);
sop(min);
sop(l);
sop(l2);
sop(l3);
//最重要的一個方法random(),返回帶正號的 double 值,大於或等於 0.0,小於 1.0,//不包含1.0,與這個方法異曲同工之妙的類還有java.util.Random,使用方法差不多,這//裡就不介紹了。
for (int i = 1; i<=10 ; i++)
{
int d2 = (int)(Math.random()*11+20);
System.out.println(d2);
}
}
public static void sop(Object o)
{
System.out.println(o);
}
}
執行結果:
27.0
22.0
21.0
24
23
13
12
-12
21
22
24
29
30
21
21
21
23
28
最後還有一個java.lang.String這個類也是一個經常用的的類,而且它是是使用最頻繁的,所以要單獨做一個筆記來講解他了,所以這裡就不多說了。