false
true
這個例子中,continue label和break具有同樣的作用。
這個例子就更加直覺的看到 continue label實作不一樣的效果!
int 重載
Integer 重載
request.getSession().getServletContext() 擷取的是Servlet容器對象,相當于tomcat容器了。getRealPath("/") 擷取實際路徑,“/”指代項目根目錄,是以代碼傳回的是項目在容器中的實際釋出運作的根路徑。
ClassLoader類的getResource(String name),getResourceAsStream(String name)等方法,使用相對于目前項目的classpath的相對路徑來查找資源。
1.jsp頁面
String path = pageContext.getServletContext().getRealPath("/");
或者 String path = request.getSession().getServletContext().getRealPath("/");
String realPath = path+"/WEB-INF/classes/abc.properties";
2.java 程式
InputStream in = getClass().getClassLoader().getResourceAsStream("abc.properties"); // abc.properties放在webroot/WEB-INF/classes/目錄下
推薦使用Thread.currentThread().getContextClassLoader().getResource("")來得到目前的classpath的絕對路徑的URI表示法。
prop.load(in);
in.close();
3.隻通過Java程式操作資源檔案
InputStream in = new FileInputStream("abc.properties"); // 相對路徑,項目下的路徑
OutputStream out = new FileOutputStream("abc.properties");
注意:(1)和(2)的輸出差别
1).位址欄輸入:http://localhost:8080/HJZGG_BLOG/pictureAction!pictureGroupJspGetAllGroups
System.out.println(ServletActionContext.getServletContext().getRealPath("/savePath"));
System.out.println(ServletActionContext.getRequest().getServletPath());
System.out.println(ServletActionContext.getRequest().getRequestURL());
System.out.println(ServletActionContext.getRequest().getRequestURI());
列印的結果如下:
F:\eclipseEE_workspace\.metadata\.plugins\org.eclipse.wst.server.core\tmp0\wtpwebapps\HJZGG_BLOG\savePath
/pictureAction!pictureGroupJspGetAllGroups
http://localhost:8080/HJZGG_BLOG/pictureAction!pictureGroupJspGetAllGroups
/HJZGG_BLOG/pictureAction!pictureGroupJspGetAllGroups
2).得到完整的URL請求
通路:http://localhost:8080/HJZGG_BLOG/pictureAction!pictureGroupJspGetAllGroups
HttpServletRequest request;
String url = null;
url = request.getScheme()+"://" //請求協定 http 或 https
+ request.getServerName() //伺服器位址
+ ":"
+ request.getServerPort() //端口号
+ request.getContextPath() //項目名稱
+ request.getServletPath() //請求頁面或其他位址 ,例如:pictureAction!pictureGroupJspGetAllGroups
+ "?" + (request.getQueryString()); //參數
System. out.println(url);
輸出:http://localhost:8080/HJZGG_BLOG/pictureAction!pictureGroupJspGetAllGroups?null
3).得到項目根目錄的URL
HttpServletRequest request = ServletActionContext.getRequest();
+ request.getServerName() //伺服器位址(可以替換成 InetAddress.getLocalHost().getHostAddress())
+ request.getContextPath(); //項目名稱
輸出:http://localhost:8080/HJZGG_BLOG
java中泛型是不變的,可有時需要實作逆變與協變,怎麼辦呢?這時,通配符<code>?</code>派上了用場:
<code><? extends></code>實作了泛型的協變,比如:
<code><? super></code>實作了泛型的逆變,比如:
在Java1.4及以前,子類方法如果要覆寫超類的某個方法,必須具有完全相同的方法簽名,包括傳回值也必須完全一樣。
Java5.0放寬了這一限制,隻要子類方法與超類方法具有相同的方法簽名,或者子類方法的傳回值是超類方法的子類型,就可以覆寫。
注意:"協變傳回(covariant return)",僅在subclass(子類)的傳回類型是superclass(父類)傳回類型的extension(繼承)時才被容許。
正常情況下,不能再接口内部放置任何代碼,但是嵌套類可以作為接口的一部分。你放到接口中的任何類都自動是public和static的。因為類是static的,隻是将嵌套類至于接口的命名空間内,這并不違反接口的規則。你設定可以在内部類中實作外層接口。另外實作該接口的類,都可以使用該接口中的内部嵌套類,如上所示。
要求,不使用内部類的情況下,實作下面的兩個接口。
接口
不使用内部類,實作兩個接口
使用内部類,方式1
使用内部類,方式2
轉自:http://www.cnblogs.com/exmyth/p/4598971.html
Java 不支援泛型數組。也就是說,
List<String>[] ls = new ArrayList<String>[10];
是不支援的,而
List<String>[] ls = new ArrayList[10] 或者 List[] ls = new ArrayList[10] 卻可以。
是我一直不清楚為什麼不能夠聲明泛型的數組,指定類型可以讓編譯的時候不會出現類型安全的提示。
List<String>[] lsa = new List<String>[10]; // Not really allowed.
Object o = lsa;
Object[] oa = (Object[]) o;
List<Integer> li = new ArrayList<Integer>();
li.add(new Integer(3));
oa[1] = li; // Unsound, but passes run time store check
String s = lsa[1].get(0); // Run-time error: ClassCastException.
這種情況下,由于JVM泛型的擦除機制,在運作時JVM是不知道泛型資訊的,是以可以給oa[1]賦上一個ArrayList<Integer>而不會出現ArrayStoreException,但是在取出資料的時候卻要做一次類型轉換,是以就會出現ClassCastException,如果可以進行泛型數組的聲明,上面說的這種情況在編譯期将不會出現任何的警告和錯誤,隻有在運作時才會出錯。而對泛型數組的聲明進行限制,對于這樣的情況,可以在編譯期提示代碼有類型安全問題,比沒有任何提示要強很多。
基于以上的原因,Java不支援聲明泛型數組,更确切地表達是:數組的類型不可以是類型變量,除非是采用通配符的方式,看下面這個例子:
List<?>[] lsa = new List<?>[10]; // OK, array of unbounded wildcard type.
oa[1] = li; // Correct.
String s = (String) lsa[1].get(0); // Run time error, but cast is explicit.
因為對于通配符的方式,最後取出資料是要做顯式的類型轉換的,是以并不會存在上一個例子的問題。
輸出 1 2 1