Java泛型
- Java泛型是JDK5引入的一個新的特性,泛型提供了編譯時的類型安全檢測機制,這個機制運行程序員在編譯的時候檢測到非法的類型。
- 泛型的本質是參數化類型,也就是所操作的數據類型被指定為一個參數。
泛型方法
- 可以寫一個泛型方法,這個方法在調用時候可以接受不同類型的參數,根據參數類型適當調用一個方法。
- 定義泛型方法的規則
聲明類型參數部分<>,定義在返回類型之前
聲明多個類型參數,彼此用逗號隔開
類型參數能被用于聲明返回值類型,并且能作為泛型方法得到的實際參數類型的占位符
方法體的聲明和其他的方法一樣,但是只能是代表引用型類型
- 泛型標記符
E–Element(元素)
T–Type(Java類)
K–Key(鍵)
V–Value(值)
N–Number(數值類型)
?–不確定的類型
- 聲明實例,聲明一個方法用于遍歷各種數組
public class generics {//遍歷元素的方法public static <E> void printArray(E[] type){for(E item:type){System.out.print(item);}System.out.println();}
}
public class Init {//main函數,程序入口public static void main(String[] args) {// 創建不同類型數組: Integer, Double 和 CharacterInteger[] intArray = { 1, 2, 3, 4, 5 };Double[] doubleArray = { 1.1, 2.2, 3.3, 4.4 };Character[] charArray = { 'H', 'E', 'L', 'L', 'O' };generics.printArray(intArray);generics.printArray(doubleArray);generics.printArray(charArray);}
}
- 界定類型參數
有時候需要限制被允許傳到一個類型參數種類范圍。這需要用extends關鍵字來界定范圍
public class Init {public static <T extends Comparable<T>> T maximum(T x, T y, T z){//使用Comparable<T>對范圍進行界定,必須是可以被比較的類型T max = x; // 假設x是初始最大值if ( y.compareTo( max ) > 0 ){max = y; //y 更大}if ( z.compareTo( max ) > 0 ){max = z; // 現在 z 更大}return max; // 返回最大對象}//main函數,程序入口public static void main(String[] args) {System.out.printf( "%d, %d 和 %d 中最大的數為 %d\n\n",3, 4, 5, maximum( 3, 4, 5 ) );System.out.printf( "%.1f, %.1f 和 %.1f 中最大的數為 %.1f\n\n",6.6, 8.8, 7.7, maximum( 6.6, 8.8, 7.7 ) );System.out.printf( "%s, %s 和 %s 中最大的數為 %s\n","pear","apple", "orange", maximum( "pear", "apple", "orange" ) );}
}
泛型類
- 泛型類的定義只是在后面添加了類型參數的聲明部分。
public class Box<T> {private T t;public void add(T t) {this.t = t;}public T get() {return t;}
類型通配符
- 使用?代替具體的類型參數
- 例如List<?>是所有的List以及List等具有具體類型參數的父類
import java.util.*;
public class Init {public static void getData(List<?> data) {System.out.println("data :" + data.get(0));}public static void main(String[] args) {List<String> name = new ArrayList<String>();List<Integer> age = new ArrayList<Integer>();List<Number> number = new ArrayList<Number>();name.add("icon");age.add(18);number.add(314);getData(name);getData(age);getData(number);}
}
-
因為 getData() 方法的參數是 List<?> 類型的,所以 name,age,number 都可以作為這個方法的實參,這就是通配符的作用。
-
對于通配符也可使用限定:List<? extends Number>
序列化
- 一個對象可以被表示為一個字節序列,這個字節序列包含了這個對象的數據。
- 將序列化寫入文件之后還可以從文件中讀取出來,并且對其進行反序列化。
- 過程在Java虛擬機中獨立,可以直接跨平臺進行序列化和反序列化。
- 如果一個類要想實現序列化,必須滿足兩個條件:
必須實現java.io.Serializable接口
這個類的所有屬性必須是可被序列化的,如果有一個屬性不能被序列化,這個屬性必須被聲明為短暫的
- 下面的實例指明了構造一個可以被序列化的類
public class serializable implements java.io.Serializable {public String name;public String address;public transient int SSN;//transient修飾的作用,讓某些變量不被序列化public int number;public void mailCheck(){System.out.println("Mailing a check to "+ this.name+" "+this.address);}
}
創建一個序列化對象
- ObjectOutputStream類用于序列化一個對象。下面是一個實例,用于序列化一個對象。
- 對于序列化,Java里面有一個特殊的方法用于輸出序列化對象,這個方法包含在ObjectOutputStream類里面。
public final void writeObject(Object x) throws IOException
上述writeObject()方法用于序列化一個對象之后,輸出到一個數據流,約定的Java中的序列化數據拓展名是.ser
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.ObjectOutputStream;
public class Init {public static void main(String[] args) {Employee employee = new Employee("ABC","12123",31232);try{FileOutputStream fileBuffer = new FileOutputStream("D:\\employee.ser");ObjectOutputStream out = new ObjectOutputStream(fileBuffer);//用FileOutputStream來初始化OjectOutputStreamout.writeObject(employee);out.close();fileBuffer.close();System.out.println("True");}catch (IOException i){i.printStackTrace();}}
}
反序列化對象
- 對于反序列化,Java里面有一個特殊的方法用于輸出序列化對象,這個方法包含在ObjectInputStream類里面。
public final Object readObject() throws IOException, ClassNotFoundException
上述readObject()對象用于在一個數據流中讀取反序列化信息,并且實現反序列化。
import java.io.FileInputStream;
import java.io.IOException;
import java.io.ObjectInputStream;
public class Init {public static void main(String[] args) {Employee employee = null;try{FileInputStream fileBuffer = new FileInputStream("D:\\employee.ser");ObjectInputStream in = new ObjectInputStream(fileBuffer);//用FileInputStream來初始化ObjectInputStreamemployee = (Employee)in.readObject();in.close();fileBuffer.close();System.out.println("True");}catch (IOException i){i.printStackTrace();return;}catch (ClassNotFoundException c){System.out.println("Employee class Noet found!");c.printStackTrace();return;}employee.show();}
}
True
我叫ABC,我的工號是12123,我的薪水是31232.00
進程已結束,退出代碼0