Java學習第十一天

關於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()錯誤。要和聲明一致!!
 

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