java對象引用和對象值得行爲

關於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

相關文章
相關標籤/搜索