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

相关文章
相关标签/搜索