java JDK1.5新特性


        1.泛型(Generic)

   

    JDK1.5後提供的新特性.用於解決安全問題,是一個類型安全機制 Generic Generic

    好處:
    1.將運行時期出現問題的ClassCastException,轉移到了編譯時期,方便於程序員解決問題,讓運行時期問題減少,安全

    2.避免了類型轉換的麻煩


  泛型格式:通過<>來定義要操作的引用數據類型.

    在使用java提供的對象時,什麼時候寫泛型呢?
    通常在集合框架中很常見
    只要見到<>就要定義泛型

    其實<>就是用來接收類型的
    當使用集合時,將集合中要存儲的數據類型作爲參數傳遞到<>中即可.
 
    什麼時候定義泛型類?
    當類中藥操作的引用數據類型不確定時,早期定義Object來完成擴展,現在定義泛型來完成擴展


 泛型類:
 定義的泛型,在整個類中有效,如果被方法使用,那麼泛型類的對象要明確要操作的具體類型後,所有要操作的類型就已經固定了,


 泛型方法: 
 爲了讓不同方法操作不同類型,而且類型還不確定,那麼可以將泛型定義在方法中

     例如: public <T> void show(T t){}

     特殊之處:::
  靜態方法不可以訪問類上定義的泛型
  如果靜態方法操作的引用數據類型不確定,可以講泛型定義在方法上
  如:public static <W> void fun(W t){}

泛型接口:
 可將泛型定義在接口上,使用的時候,實現類可以傳入具體類型參數,如果實現類也不知道具體類型,可將將泛型傳遞下去,讓使用者傳參


泛型高級應用:

   ? 通配符,也可以理解爲佔位符

   泛型的限定: 是爲了泛型擴展用的
      ? extends E : 可以接收E類型或者E的子類型  上限

      ? super E  :可以接收E類型或者E的父類型   下限

 
 
   2.For-Each循環

   For-Each循環得加入簡化了集合的遍歷。假設我們要遍歷一個集合對其中的元素進行一些處理。典型的代碼爲:

 void processAll(Collection c){
     for(Iterator i=c.iterator(); i.hasNext();){
         MyClass myObject = (MyClass)i.next();
         myObject.process();
     }
 }

   使用For-Each循環,我們可以把代碼改寫成:

 void processAll(Collection<MyClass> c){
     for (MyClass  myObject :c)
         myObject.process();
 }

  這段代碼要比上面清晰許多,並且避免了強制類型轉換。

 

      

格式:
for(數據類型 變量名:被遍歷的集合(Collection)或數組){ }

對集合進行遍歷.只能獲取元素,但是不能對集合進行操作.

迭代器除了遍歷,還可以進行remove集合中元素的動作,如果使用ListIterator,還可以在遍歷過程中進行增刪改查的操作

傳統for和高級for有什麼區別?
  高級for有一個侷限性,必須有被遍歷的目標.比如:把"hello world"打印100次

建議:在遍歷數組時,還是使用傳統for,因爲有角標

 

 

     3.自動裝箱/拆箱(Autoboxing/unboxing)

  

基本數據類型對象包裝類

byte Byte
short Short
int Integer
long Long
boolean Boolean
float Float
double Double
char character

基本數據類型對象包裝類的最常見作用.
就是用於基本數據類型和字符串類型之間做轉換

基本數據類型轉成字符串
   基本數據類型+"";
   基本數據類型.toString(基本數據類型值);
   如:Integer.toString(34);//將34變成"34"


字符串轉成基本數據類型
  1. xxx a = Xxx.parseXxx(str);
  如: int a = Integer.parseInt("a12");//必須傳入數字格式的字符串
    double d = Double.parseDouble("12.22");
    boolean b = Boolean.parseBoolean("true");

  2.先通過Integer構造方法轉成Integer對象,再調用Integer.intValue()方法
    如:Integer i = new Integer("23");
      int num = i.intValue();

 

Integer x = new Integer(4);
Integer x = 4; //自動裝箱 //隱式的new Integer(4);
x = x/*x.intValue()*/+2; //x+2:x 進行自動拆箱,變成了int類型,和2進行加法運算,再將和進行裝箱賦給x


Integer m = 128;
Integer n = 128;
m==n -->false; //可以理解;因爲m和n是兩個對象

Integer a = 127;
Integer b = 127;
a==b -->true;  //因爲a和b指向了同一個Integer對象,因爲當數值在byte範圍內,對於新特性,如果該數值已經存在,則不會在開闢新的空間

 

  4.枚舉(Enums)

  JDK1.5加入了一個全新類型的“類”-枚舉類型。爲此JDK1.5引入了一個新關鍵字enmu. 我們可以這樣來定義一個枚舉類型。
 
public enum Color
{
   Red,
   White,
   Blue
}

  然後可以這樣來使用Color myColor = Color.Red.

  枚舉類型還提供了兩個有用的靜態方法values()和valueOf(). 我們可以很方便地使用它們,例如

for (Color c : Color.values())
            System.out.println(c);

 

  5.可變參數(Varargs)

  可變參數使程序員可以聲明一個接受可變數目參數的方法。注意,可變參數必須是函數聲明中的最後一個參數。假設我們要寫一個簡單的方法打印一些對象,

util.write(obj1);
util.write(obj1,obj2);
util.write(obj1,obj2,obj3);


  在JDK1.5之前,我們可以用重載來實現,但是這樣就需要寫很多的重載函數,顯得不是很有效。如果使用可變參數的話我們只需要一個函數就行了

public void write(Object... objs) {
   for (Object obj: objs)
      System.out.println(obj);
}

  在引入可變參數以後,Java的反射包也更加方便使用了。對於c.getMethod("test", new Object[0]).invoke(c.newInstance(), new Object[0])),現在我們可以這樣寫了c.getMethod("test").invoke(c.newInstance()),這樣的代碼比原來清楚了很多。 

     

其實就是數組參數的簡寫形式,不用每一次都手動的建立數組對象,只要將要操作的元素作爲參數傳遞即可,隱式將這些參數封裝成了數組

注意:在使用時,可變參數一定要定義在參數列表的最後面

 

  6.靜態導入(Static Imports)

  要使用用靜態成員(方法和變量)我們必須給出提供這個方法的類。使用靜態導入可以使被導入類的所有靜態變量和靜態方法在當前類直接可見,使用這些靜態成員無需再給出他們的類名。

import static java.lang.Math.*;

r = sin(PI * 2); //無需再寫r = Math.sin(Math.PI);

import static java.util.Arrays.*;//導入的是Arrays這個類中的所有靜態成員


//int[] arr = {3,1,5}
//Arrays.sort(arr);
//Arrays.binarySearch(arr,2);

//Arrays.toString(arr);// Object裏也有toString方法.

當方法重名時,需要指定所屬的對象或者類

過度使用這個特性也會一定程度上降低代碼地可讀性。

 

 

 

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章