關於Properties類:
代碼:
package lesson10;
import java.util.*;
import java.io.*;
class Test
{
public static void main(String[] args) throws Exception
{
Properties pro1 = new Properties();//由於Properties繼承自Hashtable,所以,裏面的鍵值對每次讀取順序可能不一樣。
pro1.setProperty("username","128128001");
pro1.setProperty("password","inklo888");
pro1.setProperty("displayname","你人");
//爲了不出現亂碼,建議保存爲xml,因爲可以指定字符集
pro1.storeToXML(new FileOutputStream("m.xml"),"啓動配置","gb2312");
System.out.println(pro1);
System.out.println("***************************************");
Properties pro2 = new Properties();
pro2.setProperty("Gender","男");
//與storeToXML()相對應,加載時請用loadFromXML()
pro2.loadFromXML(new FileInputStream("m.xml"));
System.out.println(pro2);
}
}
運行結果:
所保存的xml文件內容:
<?xml version="1.0" encoding="GB2312" standalone="no"?>
<!DOCTYPE properties SYSTEM "http://java.sun.com/dtd/properties.dtd">
<properties>
<comment>啓動配置</comment>
<entry key="password">inklo888</entry>
<entry key="displayname">你人</entry>
<entry key="username">128128001</entry>
</properties>
泛型:
無論實際參數(實參)是哪種類型,其實都是一個Class對象。例如ArrayList<String> r1 = new ArrayList<String>(); ArrayList<Integer> r2 = new ArrayList<Integer>(); r1.getClass()==r2.getClass() 結果是true。
這也說明在靜態屬性、靜態初始化塊、靜態方法的聲明中,不能使用泛型形參:因爲此時可能根本不知道是哪種具體類型。
由於在系統中不會生成真正的泛型,所以 類似 c instanceof List<String>是錯誤的。
泛型不能類型轉換。例如test(List<Object> lst); 假若使用List<String> lst = new ArrayList<String>();調用test(lst);將出錯。List<Object>與List<String>並不兼容。
如果有一個類Person,很顯然,他是Object的子類,也是IPerson(假設存在該接口,Person並實現了她)的子類,但對於泛型而言,則不成立。
例如:List<Person>並不是List<Object>或List<IPerson>的子類。
但通配符?是所有泛型的父類。例如test(List<?> lst)可以接受任何List的泛型類型。
但聲明一個通配符引用,指向具體泛型,則該通配符引用不能用於執行包含泛型的操作。例如:List<?> lst = ArrayList<Integer>();lst.add(100);執行add時,出錯。
其實,通配符?表示Object,所以,所有通過get返回的元素,否認都是Object。{假設返回類型爲泛型}。但添加add時則需指明類型。
package lesson11;
import java.util.*;
class MyList<T>
{
private static T info001;//error:不能在靜態屬性聲明中使用泛型形參
private T info ;
public MyList()
{
}
public MyList(T info)
{
this.info = info;
}
T getInfo()
{
return info;
}
//錯誤,不能在靜態方法聲明中使用泛型形參
public static T getType()
{
return info;
}
}
class A extends MyList<T>//Error 接口 抽象類 繼承(實現),規則一樣。
{
}
class A extends MyList<String>//Ok 接口 抽象類 繼承(實現),規則一樣。
{
}
class A extends MyList//Ok,默認變成Object類型 接口 抽象類 繼承(實現),規則一樣。
{
}
class Test
{
public static void main(String[] args)
{
/* MyList hs = new MyList();
hs.add("Java高手");
hs.add("C#戰艦");
hs.add("C++期間");
//hs.add(100);
for(int i = 0 ; i < hs.size();i++ )
{
System.out.println((String)hs.get(i));
}
*/
ArrayList<String> al = new ArrayList<String>();//泛型
al.add("a");
//al.add(new Object());
System.out.println(al.get(0));
MyList<String> c0 = new MyList<String>("同志們好");
System.out.println(c0.getInfo());
MyList c1 = new MyList(1008);//若不指定具體類型,則默認爲Object
System.out.println(c1.getInfo());
}
}
泛型繼承(實現)重寫方法時,例如class A extends MyList<String>,public String getInfo()正確;但public Object getInfo()錯誤。要和聲明一致!!