泛型的例子,不用進行強制類型轉換
1、代碼更加簡單
2、所以的類型轉換都是隱式和自動的,提高代碼重用率
類型安全
向後兼容
層次清晰
性能更高(反射機制可以得等到更多類型信息)
ArrayList<Dog> al = new ArrayList<Dog>();
Dog dog1 = new Dog();
al.add(dog1);
Dog temp = al.get(0);
ArrayList al = new ArrayList();
Dog dog1 = new Dog();
al.add(dog1);
Dog temp = (Dog)al.get(0);
class Gen<T>{
private T o;
public Gen(T a){
this.o = a;
}
public void showTypeName(){
System.out.println(o.getClass().getName());
}
}
在主函數中調用:
Gen<String> gen1 = new Gen<String>("aaa");
gen1.showTypeName();
是可以的
而下面的定義是不可以的
Gen<Float> gen1 = new Gen<Float>("aaa");
反射機制
JAVA反射機制是在運行狀態中,對於任意一個類,都能夠知道這個類的所有屬性和方法;
對於任意一個對象,都能夠調用它的任意一個方法;
這種動態獲取的以及動態調用對象的方法的功能稱爲java語言的反射機制。
Java反射機制主要提供了以下功能:在運行時判定任意一個對象所屬的類;
在運行時構造任意一個類的對象;在運行時判定任意一個類所具有的成員變量和方法;
在運行時調用任意一個對象的方法。
異常處理
try {
FileReader fr = new FileReader("aaa.txt");
} catch (Exception e) {
// TODO: handle exception
e.printStackTrace();
}
最大捕獲,所有的異常由e捕獲
try {
FileReader fr = new FileReader("aaa.txt");
} catch (FileNotFoundException e) {
// TODO: handle exception
e.printStackTrace();
} catch (IOException e2){
e2.printStackTrace();
最小捕獲,只能捕獲一種異常
一旦捕獲,中止執行代碼,直接進入catch,多個catch則進入匹配的條件
FileReader fr = null;
try {
fr = new FileReader("aaa.txt");
} catch (FileNotFoundException e) {
// TODO: handle exception
e.printStackTrace();
} catch (IOException e2){
e2.printStackTrace();
}
finally{
if(fr != null)
try {
fr.close();
} catch (Exception e) {
// TODO: handle exception
e.printStackTrace();
}
}
finally用於異常之後的處理,比如文件的處理。
finally之前如果出現system.exit(),cpu掉電,等情況都不會被執行
異常可以拋出,throws Exception