天天看點

java注意的一些細節問題

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>&lt;? extends&gt;</code>實作了泛型的協變,比如:

<code>&lt;? super&gt;</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&lt;String&gt;[] ls = new ArrayList&lt;String&gt;[10];  

是不支援的,而

List&lt;String&gt;[] ls = new ArrayList[10]  或者 List[] ls = new ArrayList[10] 卻可以。

是我一直不清楚為什麼不能夠聲明泛型的數組,指定類型可以讓編譯的時候不會出現類型安全的提示。

List&lt;String&gt;[] lsa = new List&lt;String&gt;[10]; // Not really allowed.  

Object o = lsa;  

Object[] oa = (Object[]) o;  

List&lt;Integer&gt; li = new ArrayList&lt;Integer&gt;();  

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&lt;Integer&gt;而不會出現ArrayStoreException,但是在取出資料的時候卻要做一次類型轉換,是以就會出現ClassCastException,如果可以進行泛型數組的聲明,上面說的這種情況在編譯期将不會出現任何的警告和錯誤,隻有在運作時才會出錯。而對泛型數組的聲明進行限制,對于這樣的情況,可以在編譯期提示代碼有類型安全問題,比沒有任何提示要強很多。

基于以上的原因,Java不支援聲明泛型數組,更确切地表達是:數組的類型不可以是類型變量,除非是采用通配符的方式,看下面這個例子:

List&lt;?&gt;[] lsa = new List&lt;?&gt;[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