這篇文章帶給大家的內容是關於如何理解JAVA方法中的參數用final來修飾,有一定的參考價值,有需要的朋友可以參考一下,希望對你有幫助。
JAVA方法中的參數用final來修飾的原因
很多人都說在JAVA中用final來修飾方法參數的原因是防止方法參數在呼叫時被竄改,其實也就是這個原因,但理解起來可能會有歧義,有的人認為是呼叫語句的地方的變數的實際值不會被修改,另一種理解就是僅在呼叫方法內部不能被修改。
其實第一種理解是有錯誤的,對於基本型別來說在呼叫的地方,用不用final來修飾都是一樣的效果,如下面的程式碼:
publi cstatic void main(String hh[]) { int i = 1; System.out.println(i); checkInt(i); System.out.println(i); } public static void checkInt(final int i) { //do something } |
#你把checkInt()方法中的參數設為final和非final的效果對調用的地方來說是一樣子的。
但是,對於引用型別來說也是一樣子的,用不用修飾都不會改變引用位址,而都可以改變引用變數的屬性值。如下:
publicstaticvoid main(String hh[]) { LoginInfo login = new LoginInfo(); login.setPassword("1235"); login.setUserName("mygod"); System.out.println("username:"+login.getUserName()+",password:"+login.getPassword()); checkLoginInfo(login); System.out.println("username:"+login.getUserName()+",password:"+login.getPassword()); } publicstaticvoid checkLoginInfo(final LoginInfo login) { login.setUserName("yun"); } |
#對於第二種說法,是這個樣子的,我給了這個參數,你只能用這個參數的值,你不能修改它,對於基本型別和引用型別是一樣的,如下:
//如果不是final 的话,我可以在checkInt方法内部把i的值改变(有意或无意的, //虽然不会改变实际调用处的值),特别是无意的,可能会引用一些难以发现的BUG publicstaticvoid checkInt(int i) { i = 200;//这样是可以的,不会编译出错的 //do something } //如果是final 的话,我可以在checkInt方法内部就没办法把i的值改变 //可以完全避免上面的问题 publicstaticvoid checkInt(finalint i) { i = 200;//这样是不可以的,会编译出错的 //do something } //final 的引用类型方法参数 publicstaticvoid checkLoginInfo(final LoginInfo login) { login = new LoginInfo();//error,编译不过去 //do something } //非final的引用类型方法参数 publicstaticvoid checkLoginInfo(LoginInfo login) { //没有任何问题,但是肯定不符合此参数存在的初衷 login = new LoginInfo(); //do something } |
以上是如何理解JAVA方法中的參數用final來修飾的詳細內容。更多資訊請關注PHP中文網其他相關文章!