JAVA1.5後新增語法:
[java]
1. 泛性編程
C 通過模板技術可以指定集合的元素類型,而Java在1.5之前一直沒有相對應的功能。一個集合可以放任何類型的對象,相應地從集合裡面拿對象的時 候我們也不得不對他們進行強制得類型轉換。猛虎引入瞭泛型。例子如下:
ArrayList<String> list = new ArrayList<String>();
list.add(new String("Hello!"));
System.out.println(list.get(0));
2. 自動裝箱/拆箱
Java中經常需要在原始數據類型和它們的包裝類之間轉換,尤其是將數據放入Collection容器中和取出來時。為瞭減少這些重復代碼,JDK 5.0添加瞭自動裝箱/解箱操作,從此之後,基本上可以將原始數據類型當作對象來操作瞭。
自動裝箱:指開發人員可以把一個基本數據類型直接賦給對應的包裝類。
自動拆箱:指開發人員可以把一個包裝類對象直接賦給對應的基本數據類型。
例:public void test(){
Integer i = 1000; //裝箱
int c = i; //拆箱
//典型的應用案例
List list = new ArrayList();
list.add(12); //裝箱
int temp = (Integer)list.get(0); //拆箱
}
3. 增強的循環結構(for-each循環)
引入增強for循環的原因:在JDK5以前的版本中,遍歷數組或集合中的元素,需先獲得數組的長度或集合的迭代器,比較麻煩!加入這種循環方式也是為瞭簡化一些代碼開發,尤其是對Collection容器的遍歷,以前都需要得到Iterator,然後調用next()得到下一個對象,調用hasNext()判斷是否還有,要不停寫這種重復的代碼,用foreach則很簡單。因此JDK5中定義瞭一種新的語法——增強foreach循環,以簡化此類操作。增強for循環隻能用在數組、或實現Iterable接口的集合類上, 語法格式:
for(變量類型 變量 :需迭代的數組或集合){具體代碼 }
例: int data[] = { 1, 2, 3, 4, 5 };
for(int j : data)
System.out.println(j);
4. 枚舉類型
Java添加瞭對枚舉類型的支持,使用enum關鍵字進行定義。下面是一個例子:
public enum Meal {BREAKFAST, LUNCH, SUPPER};
public static void main( String[] args ) {
Meal m = Meal.BREAKFAST;
System.out.println( m );
}
其中定義的每一個常量都是Meal的一個實例。可以看到枚舉類型的定義非常像一個類,可以有方法,可以有構造函數,不過構造函數不能是public或者protected的;此外實例必須在一開始就定義。另外就是enum不能被繼承,因為事實上定義瞭一個enum後,編譯器會自動生成一個繼承瞭java.lang.Enum的同名的類,而Java是不支持多重繼承的,所以定義的enum就不能被繼承瞭,這一點在某些時候帶來瞭一些限制,比如想重用代碼來擴展enum時。此外,註意上面定義中的語法,各個實例間用逗號分隔,實例全部結束後用分號。
枚舉類型還定義瞭一些方法:toString(), values()和ordinal()等。
enum還支持靜態導入,支持用在switch語句中。
5. 靜態導入
靜態導入非常簡單,就是將一個類的靜態變量或者方法導入,這樣在引用時就不需要再寫類名瞭,減少瞭代碼輸入的工作量。例子如下:
import static java.lang.System.out;
public class StaticImport {
public static void main( String[] args ) {
out.println( "Good" );
}
}
代碼中用瞭最常用的輸出語句,原來需要寫System.out.println(),現在將out靜態導入,則隻需寫out.println()
通常導入的語句也可以寫成import static java.lang.System.*來將該類中的所有靜態變量和方法都導入。可以看到靜態導入是非常簡單的,隻需記住雖然該特性一般稱為“靜態導入(static import)”,寫代碼時卻要寫成“import static”。
6. 可變參數列表
從C中借鑒來的功能,如果方法想要接受任意數目的參數的話,就可以用,得到的參數則用foreach語法一個一個讀出來。以前則可能需要用一大堆的重載方法。形式如:
void argtest(Object … args) {
for(int i = 0; i < args.length; i++)
System.out.println(i);
}
例子如下:
public class Test {
public static void test( int…values ) {
System.out.println( values.length );
for ( int i : values ) {
System.out.println( i );
}
}
public static void main( String[] args ) {
test( 1 );
test( 1, 2 );
test( 1, 2, 3 );
}
}上面代碼中可以看到,可變參數列表還有個屬性是length。
然後我們可以這樣調用這個函數:
argtest(1);
argtest(1, 2, 4, 5, 6);
7. 格式化輸出
System.out.printf("This is a test: %4.2f\n", 123.123);
這就會打印出:This is a test: 123.12
8. 從終端讀取數據
剛開始接觸Java 的時候,我怎麼也不能用Java 在終端像C一樣方便的讀取數據。要從終端讀取一個整數我以前是這麼弄的:
try {
BufferedReader reader = new BufferedReader(new
InputStreamReader(System.in));
int i = Integer.parseInt(reader.readLine());
} catch(IOException e) { }
現在好瞭,Java 裡面引入瞭一個Scanner(),可以方便的從終端讀取數據:
public class ScannerExample{
public static void main(String[] args){
Scanner read = new Scanner(System.in);
int i = read.nextInt();
System.out.println(“輸入的i=”+i);
}
}
1. 泛性編程
C 通過模板技術可以指定集合的元素類型,而Java在1.5之前一直沒有相對應的功能。一個集合可以放任何類型的對象,相應地從集合裡面拿對象的時 候我們也不得不對他們進行強制得類型轉換。猛虎引入瞭泛型。例子如下:
ArrayList<String> list = new ArrayList<String>();
list.add(new String("Hello!"));
System.out.println(list.get(0));
2. 自動裝箱/拆箱
Java中經常需要在原始數據類型和它們的包裝類之間轉換,尤其是將數據放入Collection容器中和取出來時。為瞭減少這些重復代碼,JDK 5.0添加瞭自動裝箱/解箱操作,從此之後,基本上可以將原始數據類型當作對象來操作瞭。
自動裝箱:指開發人員可以把一個基本數據類型直接賦給對應的包裝類。
自動拆箱:指開發人員可以把一個包裝類對象直接賦給對應的基本數據類型。
例:public void test(){
Integer i = 1000; //裝箱
int c = i; //拆箱
//典型的應用案例
List list = new ArrayList();
list.add(12); //裝箱
int temp = (Integer)list.get(0); //拆箱
}
3. 增強的循環結構(for-each循環)
引入增強for循環的原因:在JDK5以前的版本中,遍歷數組或集合中的元素,需先獲得數組的長度或集合的迭代器,比較麻煩!加入這種循環方式也是為瞭簡化一些代碼開發,尤其是對Collection容器的遍歷,以前都需要得到Iterator,然後調用next()得到下一個對象,調用hasNext()判斷是否還有,要不停寫這種重復的代碼,用foreach則很簡單。因此JDK5中定義瞭一種新的語法——增強foreach循環,以簡化此類操作。增強for循環隻能用在數組、或實現Iterable接口的集合類上, 語法格式:
for(變量類型 變量 :需迭代的數組或集合){具體代碼 }
例: int data[] = { 1, 2, 3, 4, 5 };
for(int j : data)
System.out.println(j);
4. 枚舉類型
Java添加瞭對枚舉類型的支持,使用enum關鍵字進行定義。下面是一個例子:
public enum Meal {BREAKFAST, LUNCH, SUPPER};
public static void main( String[] args ) {
Meal m = Meal.BREAKFAST;
System.out.println( m );
}
其中定義的每一個常量都是Meal的一個實例。可以看到枚舉類型的定義非常像一個類,可以有方法,可以有構造函數,不過構造函數不能是public或者protected的;此外實例必須在一開始就定義。另外就是enum不能被繼承,因為事實上定義瞭一個enum後,編譯器會自動生成一個繼承瞭java.lang.Enum的同名的類,而Java是不支持多重繼承的,所以定義的enum就不能被繼承瞭,這一點在某些時候帶來瞭一些限制,比如想重用代碼來擴展enum時。此外,註意上面定義中的語法,各個實例間用逗號分隔,實例全部結束後用分號。
枚舉類型還定義瞭一些方法:toString(), values()和ordinal()等。
enum還支持靜態導入,支持用在switch語句中。
5. 靜態導入
靜態導入非常簡單,就是將一個類的靜態變量或者方法導入,這樣在引用時就不需要再寫類名瞭,減少瞭代碼輸入的工作量。例子如下:
import static java.lang.System.out;
public class StaticImport {
public static void main( String[] args ) {
out.println( "Good" );
}
}
代碼中用瞭最常用的輸出語句,原來需要寫System.out.println(),現在將out靜態導入,則隻需寫out.println()
通常導入的語句也可以寫成import static java.lang.System.*來將該類中的所有靜態變量和方法都導入。可以看到靜態導入是非常簡單的,隻需記住雖然該特性一般稱為“靜態導入(static import)”,寫代碼時卻要寫成“import static”。
6. 可變參數列表
從C中借鑒來的功能,如果方法想要接受任意數目的參數的話,就可以用,得到的參數則用foreach語法一個一個讀出來。以前則可能需要用一大堆的重載方法。形式如:
void argtest(Object … args) {
for(int i = 0; i < args.length; i++)
System.out.println(i);
}
例子如下:
public class Test {
public static void test( int…values ) {
System.out.println( values.length );
for ( int i : values ) {
System.out.println( i );
}
}
public static void main( String[] args ) {
test( 1 );
test( 1, 2 );
test( 1, 2, 3 );
}
}上面代碼中可以看到,可變參數列表還有個屬性是length。
然後我們可以這樣調用這個函數:
argtest(1);
argtest(1, 2, 4, 5, 6);
7. 格式化輸出
System.out.printf("This is a test: %4.2f\n", 123.123);
這就會打印出:This is a test: 123.12
8. 從終端讀取數據
剛開始接觸Java 的時候,我怎麼也不能用Java 在終端像C一樣方便的讀取數據。要從終端讀取一個整數我以前是這麼弄的:
try {
BufferedReader reader = new BufferedReader(new
InputStreamReader(System.in));
int i = Integer.parseInt(reader.readLine());
} catch(IOException e) { }
現在好瞭,Java 裡面引入瞭一個Scanner(),可以方便的從終端讀取數據:
public class ScannerExample{
public static void main(String[] args){
Scanner read = new Scanner(System.in);
int i = read.nextInt();
System.out.println(“輸入的i=”+i);
}
}
JAVA1.7後新增語法:
[java]
:對整型支持改進。
int i = 0b0011;
int j = 0b0011_0101;
以0B或者0b開頭的二進制代碼可以給整型賦值,並且也支持以下劃線_為分割的二進制整型支持,為的是代碼有更好的可讀寫。
2:swicth對String的整型
復制代碼
switch (s) {
case "1":
break;
case "2":
break;
case "3":
break;
}
復制代碼
3:泛型的支持深化
Map<String,String> map=new HashMap<>();
這個功能其實帶來的改變不算太大,特別是Java依然沒有改變假泛型。
4:多層次catch
try {
}
catch (SQLException | IOException e) {
e.printStackTrace();
}
5:自動資源管理
凡是繼承瞭Closeable這個類,系統在方法退出的時候都會自動的關閉資源。
6:FileSystem的API支持
Java7對文件系統支持較為廣泛,無論是copy, move,delete等操作,還是文件系統的監視,遞歸,獲取文件的元數據都有瞭大大的提高。
1:對整型支持改進。
int i = 0b0011;
int j = 0b0011_0101;
以0B或者0b開頭的二進制代碼可以給整型賦值,並且也支持以下劃線_為分割的二進制整型支持,為的是代碼有更好的可讀寫。
2:swicth對String的整型
復制代碼
switch (s) {
case "1":
break;
case "2":
break;
case "3":
break;
}
復制代碼
3:泛型的支持深化
Map<String,String> map=new HashMap<>();
這個功能其實帶來的改變不算太大,特別是Java依然沒有改變假泛型。
4:多層次catch
try {
}
catch (SQLException | IOException e) {
e.printStackTrace();
}
5:自動資源管理
凡是繼承瞭Closeable這個類,系統在方法退出的時候都會自動的關閉資源。
6:FileSystem的API支持
Java7對文件系統支持較為廣泛,無論是copy, move,delete等操作,還是文件系統的監視,遞歸,獲取文件的元數據都有瞭大大的提高。