java对象引用和对象值得行为

关于java对象和传值得问题,偶然间在看js的时候,发现的一个无效转换对象数据的问题,自己感觉有点疑惑,以为是js的特性,随机想在java上面证实一下,结果发现并不是js的特性,java也是如此然后查了些许资料发现自己学习的疏忽,当时确实惊出了一身冷汗呀,现在就具体说下问题:

在做值转换的时候碰到了如下情况

示例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并没有发生改变

再看以下例子

示例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;
		}

	}

输出结果:

woman,18
man,20
in main method : man,20
in main method : woman,18

同样我们可以发现在objChange()内部,变量user1,user2的值发生了改变,但是main方法中的user1,user2并没有发生改变,下来我们再看一个实例:

示例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

时间: 2024-10-20 09:14:10

java对象引用和对象值得行为的相关文章

Java --对象引用与对象的区别

最近做项目时,遇到了一个错误: public class UserJobFilteredServiceImpl implements UserJobFilteredService {          //方法1,业务方法,实现service层的方法     public void getAttention(int userId) {         //这个方法里面需要调用方法2,我采用如下方式调用,运行时报错         UserJobFilteredServiceImpl  userJ

浅谈Java中的对象和对象引用

浅谈Java中的对象和对象引用 在Java中,有一组名词经常一起出现,它们就是“对象和对象引用”,很多朋友在初学Java的时候可能经常会混淆这2个概念,觉得它们是一回事,事实上则不然.今天我们就来一起了解一下对象和对象引用之间的区别和联系. 1.何谓对象? 在Java中有一句比较流行的话,叫做“万物皆对象”,这是Java语言设计之初的理念之一.要理解什么是对象,需要跟类一起结合起来理解.下面这段话引自<Java编程思想>中的一段原话: “按照通俗的说法,每个对象都是某个类(class)的一个实

C语言结构体,C语言结构体指针,java对象引用,传值,传地址,传引用

C语言结构体,C语言结构体指针,java对象引用,传值,传地址,传引用 传值 把实参的值赋值给行参 那么对行参的修改,不会影响实参的值 传地址 传值的一种特殊方式,只是他传递的是地址,不是普通的如int 那么传地址以后,实参和行参都指向同一个对象 传引用 真正的以地址的方式传递参数 传递以后,行参和实参都是同一个对象,只是他们名字不同而已 对行参的修改将影响实参的值 所谓变量是内存地址的一个抽象名字,在静态编译的程序中,所有变量名都会在编译时转换成内存地址,机器不知道变量名,只知道地址. C 语

Java中字符串对象

Java中字符串对象创建有两种形式,一种为字面量形式,如String str = "droid";,另一种就是使用new这种标准的构造对象的方法,如String str = new String("droid");,这两种方式我们在代码编写时都经常使用,尤其是字面量的方式.然而这两种实现其实存在着一些性能和内存占用的差别.这一切都是源于JVM为了减少字符串对象的重复创建,其维护了一个特殊的内存,这段内存被成为字符串常量池或者字符串字面量池. 工作原理 当代码中出现字

浅谈Java中的对象和引用

浅谈Java中的对象和对象引用 在Java中,有一组名词经常一起出现,它们就是"对象和对象引用",很多朋友在初学Java的时候可能经常会混淆这2个概念,觉得它们是一回事,事实上则不然.今天我们就来一起了解一下对象和对象引用之间的区别和联系. 1.何谓对象? 在Java中有一句比较流行的话,叫做"万物皆对象",这是Java语言设计之初的理念之一.要理解什么是对象,需要跟类一起结合起来理解.下面这段话引自<Java编程思想>中的一段原话: "按照通

Java - 对象引用的初始化方式

Java对象引用的初始化方式: (1) 在定义对象的位置; (2) 在类的构造器中; (3) 在使用对象之前, 即惰性初始化; (4) 实例初始化. 代码 /** * 四种初始化方式 * <p/> * Created by wang on 15/8/5. */ class Soap { public Soap() { System.out.println("Soap"); } @Override public String toString() { return "

java对象引用在方法中传递

java对象引用在方法中传递 package com.cy; public class Client { public static void main(String[] args) { Student std = new Student("cy", 24); changeStudentNameAndAge(std); System.out.println(std.toString()); } // 改变学生姓名和年纪 // 1.直接操作对象 private static void c

学java教程之对象数组

学编程吧学java教程之对象数组发布了,欢迎通过xuebiancheng8.com来访问 什么是对象数组呢,对象数组顾名思义是对象的数组. 首先定义一个对象 public class Student{ private String username; private String password; setter,getter.... } 如上面所示,定义了一个Student对象 加入现在需要3个Student对象怎么办呢,我们得 Student stu1 = new Student(); St

Java解析JSON对象

今天学习一下Java 解析 JSON 准备工作 参考文档 1) www.json.org 2 ) 参考公司其他人的代码(这个就不说了) 依赖jar包 1) org.json.jar 提供以下我的网盘链接 http://pan.baidu.com/s/1jG2zSwe 主要的类 JSON主要有两种结构 1)name/value 的集合 2)value 的集合,在大多数语言中的list,array等,这里的 value 个人觉得就是一个JSON,也就是说是JSON的集合 JAVA处理JSON的类 1