java注意的一些細節問題

1. 大括弧作用域問題

public static void main(String[] args) {{int x;{int x;//編譯錯誤:Duplicate local variable x
        }}
}

2.boolean值的運算

public static void main(String[] args) {if(true && false) {}if(true & false) {}System.out.println(true & false);System.out.println(true ^ false);System.out.println(true | false);
}

false
true
true

?

3.continue label 和 break label

public static void main(String[] args) {label:for(int i=0; i<2; ++i){System.out.println("i=" + i);for(int j=0; j<3; ++j){if(j == 1){//continue;//break;//continue label;break label;}System.out.println("   j=" + j);}}
}

  這個例子中,continue label和break具有同樣的作用。

public static void main(String[] args) {label:for(int k=0; k<2; ++k){System.out.println("k=" + k);for(int i=0; i<2; ++i){System.out.println("    i=" + i);for(int j=0; j<3; ++j){if(j == 1){//break;continue label;}System.out.println("        j=" + j);}}}
}

  這個例子就更加直觀的看到 continue label實現不一樣的效果!

4.基本類型和對應對象分別做參數的函數重載

class A{public void fun(int x){System.out.println("int 重載");}public void fun(Integer x){System.out.println("Integer 重載");}
}public class Main{public static void main(String[] args) {A a = new A();int x = 1;Integer ix = 1;a.fun(x);a.fun(ix);}
}

int 重載
Integer 重載

?5.獲取絕對路徑

  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");

6.異常鏈

public class Main{public static void test2(){throw new NullPointerException("空指針異常!");}public static void test() throws Exception{try{test2();} catch (Exception e){//throw new Exception("自定義異常!"); //(1)throw new Exception("自定義異常!", e);//(2)
        }}public static void main(String[] args) {try{test();} catch(Exception e) {StringWriter sw = new StringWriter();PrintWriter pw = new PrintWriter(sw);e.printStackTrace(pw);System.out.println(sw.toString());}}
}

注意:(1)和(2)的輸出差別

(1)java.lang.Exception: 自定義異常!at com.hjzgg.Main.test(Main.java:28)at com.hjzgg.Main.main(Main.java:34)(2)java.lang.Exception: 自定義異常!at com.hjzgg.Main.test(Main.java:29)at com.hjzgg.Main.main(Main.java:35)
Caused by: java.lang.NullPointerException: 空指針異常!at com.hjzgg.Main.test2(Main.java:21)at com.hjzgg.Main.test(Main.java:26)... 1 more

?7.web中一些地址信息

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();
  String url = null;
  url = request.getScheme()+"://" //請求協議 http 或 https
    + request.getServerName() //服務器地址(可以替換成 InetAddress.getLocalHost().getHostAddress())
    + ":"
    + request.getServerPort() //端口號
    + request.getContextPath(); //項目名稱
  System. out.println(url);

  輸出:http://localhost:8080/HJZGG_BLOG

8.內部類和內嵌口

//如果外部類返回是  private類型的內部類,非此外部類的其他方法不能訪問這個內部類
class A{private class B{public void fun(){}}public B getBInstance(){return new B();}public void invokeBMethod(B b){b.fun();}private int x;public int getX(){return x;}
}//內嵌接口, 如果你不想將你的借口暴露給外部,寫成如下方式,否則將內嵌接口定義成 public,或者將接口寫成非內嵌接口的形式
class C{interface E{void gun();}private interface D {void fun();}private class DImpl implements D{@Overridepublic void fun() {}}public D getDImpl(){return new DImpl();}public void invokeDMethod(D d){d.fun();}
}//內部鏈接提供給外部
interface H{void fun();
}
class I{private class G implements H{@Overridepublic void fun() {}}public H getHImpl(){return new G();}
}class F implements C.E{@Overridepublic void gun() {}
}public class Main{public static void main(String[] args) {A a = new A();int x = a.getX();//error, The type A.B is not visible//a.getBInstance().fun();
         a.invokeBMethod(a.getBInstance());C c = new C();//error, The type A.B is not visible
//         c.getDImpl().fun();
         c.invokeDMethod(c.getDImpl());H h = new I().getHImpl();h.fun();}
}

?9.協變類型

java中泛型是不變的,可有時需要實現逆變與協變,怎么辦呢?這時,通配符?派上了用場:

  • <? extends>實現了泛型的協變,比如:
List<? extends Number> list = new ArrayList<Integer>();
  • <? super>實現了泛型的逆變,比如:
List<? super Number> list = new ArrayList<Object>();

class Parent{public Parent getSelf(){return new Parent();}
}class Child extends Parent{@Overridepublic Child getSelf(){return new Child();}
}

  在Java1.4及以前,子類方法如果要覆蓋超類的某個方法,必須具有完全相同的方法簽名,包括返回值也必須完全一樣。
  Java5.0放寬了這一限制,只要子類方法與超類方法具有相同的方法簽名,或者子類方法的返回值是超類方法的子類型,就可以覆蓋。
  注意:"協變返回(covariant return)",僅在subclass(子類)的返回類型是superclass(父類)返回類型的extension(繼承)時才被容許。

10.接口內部的類

interface C{class D{public void fun(){System.out.println("this is D class!");}}D getDInstance();
}class E implements C{@Overridepublic D getDInstance() {return new D();}
}

  正常情況下,不能再接口內部放置任何代碼,但是嵌套類可以作為接口的一部分。你放到接口中的任何類都自動是public和static的。因為類是static的,只是將嵌套類至于接口的命名空間內,這并不違反接口的規則。你設置可以在內部類中實現外層接口。另外實現該接口的類,都可以使用該接口中的內部嵌套類,如上所示。

11.內部類的一個好處

  要求,不使用內部類的情況下,實現下面的兩個接口。

接口

interface A{void fun();
}interface B{int fun();
}

不使用內部類,實現兩個接口

//The return type is incompatible with B.fun()
class C implements A, B{@Overridepublic void fun() {}
}
class C implements A{@Overridepublic void fun() {}
}//The return types are incompatible for the inherited methods B.fun(), C.fun()
class D extends C implements B{}

使用內部類,方式1

class C implements A{@Overridepublic void fun() {}class D implements B{@Overridepublic int fun() {return 0;}}
}

使用內部類,方式2

class C{class D implements A{@Overridepublic void fun() {}}class E implements B{@Overridepublic int fun() {return 0;}}
}

?12.java不能使用范型數組原因

  轉自:http://www.cnblogs.com/exmyth/p/4598971.html

Java 不支持泛型數組。也就是說,

  1. List<String>[]?ls?=?new?ArrayList<String>[10];??

是不支持的,而

  1. List<String>[]?ls?=?new?ArrayList[10] ?或者?List[]?ls?=?new?ArrayList[10]?卻可以。

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

直到今天我看到Sun的一篇文檔才清楚,里面提到了一種情況:

  1. List<String>[]?lsa?=?new?List<String>[10];?//?Not?really?allowed.??
  2. Object?o?=?lsa;??
  3. Object[]?oa?=?(Object[])?o;??
  4. List<Integer>?li?=?new?ArrayList<Integer>();??
  5. li.add(new?Integer(3));??
  6. oa[1]?=?li;?//?Unsound,?but?passes?run?time?store?check??
  7. String?s?=?lsa[1].get(0);?//?Run-time?error:?ClassCastException. ?

這種情況下,由于JVM泛型的擦除機制,在運行時JVM是不知道泛型信息的,所以可以給oa[1]賦上一個ArrayList<Integer>而不會出現ArrayStoreException,但是在取出數據的時候卻要做一次類型轉換,所以就會出現ClassCastException,如果可以進行泛型數組的聲明,上面說的這種情況在編譯期將不會出現任何的警告和錯誤,只有在運行時才會出錯。而對泛型數組的聲明進行限制,對于這樣的情況,可以在編譯期提示代碼有類型安全問題,比沒有任何提示要強很多。

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

  1. List<?>[]?lsa?=?new?List<?>[10];?//?OK,?array?of?unbounded?wildcard?type.??
  2. Object?o?=?lsa;??
  3. Object[]?oa?=?(Object[])?o;??
  4. List<Integer>?li?=?new?ArrayList<Integer>();??
  5. li.add(new?Integer(3));??
  6. oa[1]?=?li;?//?Correct.??
  7. String?s?=?(String)?lsa[1].get(0);?//?Run?time?error,?but?cast?is?explicit.??


因為對于通配符的方式,最后取出數據是要做顯式的類型轉換的,所以并不會存在上一個例子的問題。

?13.try..catch..finally中的return

public static int fun(){int x = 1;try{return x;} catch(Exception e){} finally {x = 2;}return x;
}public static int fun(){int x = 1;try{return x;} catch(Exception e){} finally {x = 2;return x;}
}public static int fun(){int x = 1;try{if(x == 1)throw new Exception("test");} catch(Exception e){return x;} finally {x = 2;return x;}
}

  輸出 1 ?2 ?1

14.內部類繼承

class Outer{private String s;public Outer(String s){System.out.println("Outer initial :" + s);}public void outFun(){System.out.println("outFun");}class Inner{public void innerFun(){System.out.print("內部類調用外部類中的方法: ");outFun();}}
}class InheritInner extends Outer.Inner{public InheritInner(Outer out){out.super();}@Overridepublic void innerFun(){super.innerFun();System.out.println("InheritInner override innerFun");}
}public class Main{public static void main(String[] args) {Outer out = new Outer("Outer");InheritInner inheritInner = new InheritInner(out);inheritInner.innerFun();}
}
這是在《JAVA編程思想》上看到的一道例題,是關于繼承inner   classes(內隱類)的。 先把代碼和書上的一些原話寫出來,如下: 由于inner   class的構造函數必須連接到一個reference指向outer   class   對象身上,所以 
當你繼承inner   class時,事情便稍微復雜些。問題出在“指向outer   class對象”的那個 
神秘reference必須被初始化。但derived   class之內不存在可連接的缺省對象,這個問題 
的答案是,使用專用語法,明確產生該關聯性: class   WithInner   { class   Inner{} 
} public   class   InheritInner   extends   WithInner.Inner   { InheritInner(WithInner   wi)   { wi.super();                   //---這里不懂,wi.super()指的是什么,有什么用? 
        } public   static   void   main(String[]   args)   { WithInner   wi   =   new   WithInner(); InheritInner   ii   =   new   InheritInner(wi); } 
} 

?15.java自定義注解類,如何獲取注解,如何反射內部類,this$0是什么意思

?  http://www.cnblogs.com/hujunzheng/p/5719611.html

轉載于:https://www.cnblogs.com/hujunzheng/p/5638553.html

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/531303.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/531303.shtml
英文地址,請注明出處:http://en.pswp.cn/news/531303.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

python表白

馬上就要520了&#xff0c;不少小伙伴們一定開始想盡各種辦法進行表白了…那么身為奔跑在程序員道路上的我們也一定要有獨特的表白方法&#xff01; 下面是一段表白代碼&#xff0c;請直接搬去用吧&#xff01;&#xff01;&#xff01; import turtle import timedef hart_ar…

git revert和reset區別

1.在github上建立測試項目并克隆到本地 2.本地中新建兩個文本文件 3.將a.txt commit并push到遠程倉庫 執行 git add a.txt, git commit -m "a.txt", git push 4.將b.txt提交到本地倉庫&#xff0c;不執行push 通過gitk命令查看提交歷史如下&#xff1a; 情景&#xf…

python基礎知識點整理(1)

目錄一、變量與數據類型1、變量① 變量的命名規則2、字符串常用的庫函數二、列表1、列表的基礎定義2、列表常用的庫函數3、for循環與列表4、列表切片5、元組三、if語句四、字典1、字典定義2、對字典的操作一、變量與數據類型 1、變量 ① 變量的命名規則 只能包含數字、字母以…

sorl6.0+jetty+mysql搭建solr服務

1.下載solr 官網&#xff1a;http://lucene.apache.org/solr/ 2.目錄結構如下 3.啟動solr&#xff08;默認使用jetty部署&#xff09; 在path路徑下將 bin文件夾對應的目錄加入&#xff0c;然后輸入 solr start&#xff08;或者 solr start -p port&#xff0c;指定端口啟動&am…

Maven中安裝本地Jar包到倉庫中或將本地jar包上傳

摘要 maven install 本地jar命令格式 mvn install:install-file -DgroupId<group_name> -DartifactId<artifact_name> -Dversion<version_no> -Dfile<path_of_the_local_jar> -Dpackagingjar -DgeneratePomtrue 示例 mvn install:install-file -Dgroup…

二維碼登錄原理及生成與解析

一、前言 這幾天在研究二維碼的掃碼登錄。初來乍到&#xff0c;還有好多東西不懂。在網上看到有人寫了一些通過QRCode或者Zxing實現二維碼的生成和解碼。一時興起&#xff0c;決定自己親手試一試。本人是通過QRCode實現的&#xff0c;下面具體的說一下。 二、二維碼原理 基礎知…

knockout+echarts實現圖表展示

一、需要學習的知識 knockout, require, director, echarts, jquery。簡單的入一下門&#xff0c;網上的資料很多&#xff0c;最直接就是進官網校習。 二、效果展示 三、require的配置 require.config.js中可以配置我們的自定義模塊的加載。 require.config({baseUrl: ".&…

Maven在Eclipse中的實用小技巧

前言 我們在開發的工程中很多都是Maven項目&#xff0c;這樣更加便于我們jar包的管理。而我們一般使用的IDE都是Eclipse&#xff0c;由于我們在日常的開發過程中會經常要用到一些Maven的操作&#xff0c;所以我今天主要跟大家分享一下我們在日常開發中的Maven實用小知識&#x…

React中使用Ant Table組件

一、Ant Design of React http://ant.design/docs/react/introduce 二、建立webpack工程 webpackreact demo下載 項目的啟動&#xff0c;參考 三、簡單配置 1.工程下載下來之后&#xff0c;在src目錄下新建目錄“table”&#xff0c;新建app.js&#xff0c;內容如下。 import R…

解決“Dynamic Web Module 3.0 requires Java 1.6 or newer.”錯誤

一、問題描述 1.錯誤截圖如下。 2.設計的問題 在Eclipse中新建了一個Maven工程, 然后更改JDK版本為1.6, 結果每次使用Maven > Update project的時候JDK版本都恢復成1.5。 二、原因分析 Maven官方文檔有如下描述&#xff1a; 編譯器插件用來編譯項目的源文件.從3.0版本開始, …

java自定義注解類

一、前言 今天閱讀帆哥代碼的時候&#xff0c;看到了之前沒有見過的新東西, 比如java自定義注解類&#xff0c;如何獲取注解&#xff0c;如何反射內部類&#xff0c;this$0是什么意思? 于是乎&#xff0c;學習并整理了一下。 二、代碼示例 import java.lang.annotation.Elemen…

解決cookie跨域訪問

一、前言 隨著項目模塊越來越多&#xff0c;很多模塊現在都是獨立部署。模塊之間的交流有時可能會通過cookie來完成。比如說門戶和應用&#xff0c;分別部署在不同的機器或者web容器中&#xff0c;假如用戶登陸之后會在瀏覽器客戶端寫入cookie&#xff08;記錄著用戶上下文信息…

React使用antd Table生成層級多選組件

一、需求 用戶對不同的應用需要有不同的權限&#xff0c;用戶一般和角色關聯在一起&#xff0c;新建角色的時候會選擇該角色對應的應用&#xff0c;然后對應用分配權限。于是寫了一種實現的方式。首先應用是一個二級樹&#xff0c;一級表示的是應用分組&#xff0c;二級表示的是…

junit4進行單元測試

一、前言 提供服務的時候&#xff0c;為了保證服務的正確性&#xff0c;有時候需要編寫測試類驗證其正確性和可用性。以前的做法都是自己簡單寫一個控制層&#xff0c;然后在控制層里調用服務并測試&#xff0c;這樣做雖然能夠達到測試的目的&#xff0c;但是太不專業了。還是老…

快速搭建springmvc+spring data jpa工程

一、前言 這里簡單講述一下如何快速使用springmvc和spring data jpa搭建后臺開發工程&#xff0c;并提供了一個簡單的demo作為參考。 二、創建maven工程 http://www.cnblogs.com/hujunzheng/p/5450255.html 三、配置文件說明 1.application.properties jdbc.drivercom.mysql.jd…

dubbo服務提供與消費

一、前言 項目中用到了Dubbo&#xff0c;臨時抱大腿&#xff0c;學習了dubbo的簡單實用方法。現在就來總結一下dubbo如何提供服務&#xff0c;如何消費服務&#xff0c;并做了一個簡單的demo作為參考。 二、Dubbo是什么 Dubbo是一個分布式服務框架&#xff0c;致力于提供高性能…

git親測命令

一、Git新建本地分支與遠程分支關聯問題 git checkout -b branch_name origin/branch_name 或者 git branch --set-upstream branch_name origin/branch_name 或者 git branch branch_name git branch --set-upstream-toorigin/branch_name branch_name 二、查看本地分支所關…

mysql 7下載安裝及問題解決

mysql 7安裝及問題解決 一、mysql下載 下載地址&#xff1a;https://www.mysql.com/downloads/Community (GPL) DownloadsMySQL Community Server (GPL)Windows (x86, 64-bit), ZIP ArchiveNo thanks, just start my download.二、mysql安裝 解壓到指定目錄在mysql bin目錄下打…

RestTemplate發送請求并攜帶header信息

1、使用restTemplate的postForObject方法 注&#xff1a;目前沒有發現發送攜帶header信息的getForObject方法。 HttpHeaders headers new HttpHeaders(); Enumeration<String> headerNames request.getHeaderNames(); while (headerNames.hasMoreElements()) {String k…

工作中常用到的命令

linux zip 和 unzip http://blog.csdn.net/shenyunsese/article/details/17556089 linux 查看日志 http://blog.chinaunix.net/uid-15463753-id-2943532.html linux 刪除 http://www.jb51.net/LINUXjishu/179430.html linux查看末尾日志&#xff08;tail -f&#xff09; http:/…