關於java對象和傳值得問題,偶然間在看js的時候,發現的一個無效轉換對象數據的問題,本身感受有點疑惑,覺得是js的特性,隨機想在java上面證明一下,結果發現並非js的特性,java也是如此而後查了些許資料發現本身學習的疏忽,當時確實驚出了一身冷汗呀,如今就具體說下問題:
java
在作值轉換的時候碰到了以下狀況ide
示例1:函數
public static void intValueChange(int a,int b){ int temp = a; a = b; b = temp; System.out.println(a+","+b); }
public static void main(String[] args){ int a = 1; int b = 2; intValueChange(a,b); System.out.println("in main method : "+a+","+b); }
輸出結果是:學習
2,1 in main method : 1,2
發如今intValueChange()內部,變量a,b的值發生了改變,可是main方法中的a,b並無發生改變this
再看如下例子spa
示例2:指針
public static void main(String[] args){ User user1 = new User("man","20"); User user2 = new User("woman","18"); objChange(user1,user2); System.out.println("in main method : "+user1.toString()); System.out.println("in main method : "+user2.toString()); } public static void objChange(User new1, User new2){ User temp = new1; new1 = new2; new2 = temp; System.out.println(new1.toString()); System.out.println(new2.toString()); } static class User{ public User(){ } public User(String name,String age){ this.name = name; this.age = age; } private String name; private String age; @Override public String toString(){ return this.name + "," + this.age; } public String getName() { return name; } public void setName(String name) { this.name = name; } public String getAge() { return age; } public void setAge(String age) { this.age = age; } }
輸出結果:code
woman,18 man,20 in main method : man,20 in main method : woman,18
一樣咱們能夠發如今objChange()內部,變量user1,user2的值發生了改變,可是main方法中的user1,user2並無發生改變,下來咱們再看一個實例:orm
示例3:對象
public static void main(String[] args){ User user1 = new User("man","20"); changeUser(user1); System.out.println(user1); } public static void changeUser(User user1){ user1.name = "test1"; user1.age = "100"; }
輸入結果:
in main method : test1,100
此次咱們發如今main方法中對象的值居然發生了變化,之因此會有以上變化,是由於java在傳遞實參的時候,傳遞的是這個實參的指針,在傳遞的過程當中,對指針進行了複製能夠這麼來理解
user1--->User對象1
user2--->User對象2
在執行方法objChange(User new1,User new2)的時候,並無直接將user1和user2傳過來,由於傳遞對象不是那麼簡單,而是傳遞了一個user1和user2對象的副本(即他們的指針):
user1--->User對象1 <---new1
user2--->User對象2 <---new2
進入函數以後咱們改變的是副本的引用,而不是user1和user2的引用:
user1--->User對象1 <---new2
user2--->User對象2 <---new1
這樣咱們就能明確的看到改變的是user1和user2的副本,可是user1和user2自己並無變化,所以就能夠解釋爲何老是在函數內部值發生了改變了;
接下來實例3是由於在函數內部,傳遞的副本修改了指針自己的值,因此咱們就會在main中看到user1的值修改了
接下來咱們根據實例2和實例3,再來看實例4
public static void main(String[] args){ User user1 = new User("man","20"); User user2 = new User("woman","18"); user1 = objChange(user1,user2); System.out.println("in main method : "+user1.toString()); System.out.println("in main method : "+user2.toString()); } public static User objChange(User new1, User new2){ User temp = new1; new1 = new2; new2 = temp; System.out.println(new1.toString()); System.out.println(new2.toString()); return new1; }
輸出結果:
woman,18 man,20 in main method : woman,18 in main method : woman,18
咱們能夠看到main方法中user1的值也發生了改變,是由於在objChange()中,咱們傳遞的引用他的指針改變了而且咱們在函數中將已經改變了的new1做爲一個新的User對象return了回來,而且在main中將他指向了user1,因此main中user1的值發生了改變。
故此得出,Java中當傳遞一個對象的是時候咱們並無去傳遞這個對象自己,而是傳遞的是指向這個對象指針的一個副本,咱們在函數中所操做的是這個對象的副本而不是對象自己。這個是本人對java傳遞對象的理解,若是有不對的地方你們能夠互相指正討論。
原文參考:http://fuliang.iteye.com/blog/69313