原创:转载需注明原创地址 https://www.cnblogs.com/fanerwei222/p/11405920.html

  下面通过一段代码和debug结果来展示Java中=操作的赋值改变过程。Test实体类会在最后贴出。

        Test test1 = new Test();
test1.setKey(1);
test1.setValue(1);
Test test4 = new Test();
test4.setKey(4);
test4.setValue(4);
Test test2 = test1;
test2.setIndex(2);
test2 = test4;
test2.setIndex(4);

  

  结果:

  

  可以看出:Java的=操作符会将=右侧对象实例的地址引用赋值给=左侧的对象实例,在被赋值期间,值的改变是怎样的呢?

  继续看:  

  

  可以看到test1的index值是改变了的,test4的index值也是改变了的,test2首先是test1的引用,在引用test1的时候改变test2的值,test1的值也会相应改变,说明在引用期间所有的改变都是针对实际内存地址操作的,而不是单纯针对该对象的值进行改变。

  接下来,我们再看一下方法传递时候的引用是怎么改变的:

  先贴上两个传入test参数并且在方法内尝试改变index值的方法:

  

    /**
* 尝试直接改变test的index值
* @param test
*/
public static void tryInChangeIndex(Test test){
test.setIndex(123);
} /**
* 尝试间接改变test的index值
* @param test
*/
public static void tryLinkChangeIndex(Test test){
Test testLink = new Test();
testLink = test;
testLink.setIndex(456);
}

  结果:

  

  毫无疑问,成功改变test1的值。

  再看下一个方法:

  

  同样可以改变,没有问题。

  再看看String传递是怎么回事;

  先贴尝试改变String的两个方法:

    /**
* 尝试改变string的值
* @param str
*/
public static void tryChangeString(String str){
str = "hello new str value";
} /**
* 尝试改变string的值方法2
* @param str
*/
public static void tryChangeStringTwo(String str){
String newStr = str;
newStr = "world in this place";
}
    String str1 = "good nice";
String str2 = "i'm iron man";
tryChangeString(str1);
tryChangeStringTwo(str2);

  debug结果:

  

  

  从这里可以看出,方法里面的str值是有改变的,但是方法外str1的值依然是“good nice”,这说明传入的String 类型是不能被改变的。

  继续看下面这个方法:

  

  同样的,在方法里面,虽然把str指向了newStr,并且给newStr赋了新的值,但是str的值依然是没有变化的,我们再看一下str2的值:

  

  str2的值也是没有被改变。

  我猜测: 这是因为参数方法在参数列表这里的String str 重新创建了一个实例,而且将该实例的内存引用地址指向了str2的内存引用地址,所以值会相等,但是当对str进行赋值操作的时候,会重新new String,也就是重新开辟一块内存空间去存放这个新的值,并且str会指向这块内存地址,所以改变str的值是无法改变str2的值的,因为它俩根本就不是同一个实例,只是指向了相同的内存引用地址而已.

  *** String 是final类,不可被继承, 但是String如果实例化的时候没有定义为final变量,还是可以重新赋值的!编译器不会报错!注意区别 final类和final变量.

  再来看一种情况:

        TestFather father = new TestFather();
Test son = new Test();
son.setIndex(123456);
father.setSon(son);
son.setIndex(789);

  这种情况下,father里面的son值会怎么变化?debug看一下

  

  到了72行,72行还没执行的之后,father的son的index值还是123456的,再往下走一步:

  BOOM!!! Every thing is diffrent   

  

  很明显,son变了,father拥有的只是son的一个引用,拥有了son的身体却没有son的灵魂,这里涉及到一个深拷贝和浅拷贝的问题,有兴趣可以自行Google或者Baidu。

  Test.java文件  

package entity;

/**
* 测试实体类
*/
public class Test {
private int key;
private int value;
private int index; //getter setter 省略
}

  TestFather.java

 

package entity;

/**
* Test的father
*/
public class TestFather {
private int num;
private Test son; public int getNum() {
return num;
} public void setNum(int num) {
this.num = num;
} public Test getSon() {
return son;
} public void setSon(Test son) {
this.son = son;
}
}

  结束

关于Java的=赋值操作和方法传递对象时的引用的更多相关文章

  1. java字符流操作flush()方法及其注意事项

    java字符流操作flush()方法及其注意事项   flush()方法介绍 查阅文档可以发现,IO流中每一个类都实现了Closeable接口,它们进行资源操作之后都需要执行close()方法将流关闭 ...

  2. Java继承中属性、方法和对象的关系

    大家都知道子类继承父类是类型的继承,包括属性和方法!如果子类和父类中的方法签名相同就叫覆盖!如果子类和父类的属性相同,父类就会隐藏自己的属性! 但是如果我用父类和子类所创建的引用指向子类所创建的对象, ...

  3. 【转】两道面试题,带你解析Java类加载机制(类初始化方法 和 对象初始化方法)

    本文转自 https://www.cnblogs.com/chanshuyi/p/the_java_class_load_mechamism.html 关键语句 我们只知道有一个构造方法,但实际上Ja ...

  4. Java的参数传递是「值传递」还是「引用传递」?

    关于Java传参时是引用传递还是值传递,一直是一个讨论比较多的话题. 有人说Java中只有值传递,也有人说值传递和引用传递都是存在的,比较容易让人产生疑问. 关于值传递和引用传递其实需要分情况看待. ...

  5. spring mvc 处理pojo传递对象时该对象继承父类的属性在网络接收端接收该属性值总是null,why?

    //=========================== 情形一: ===============================//在网络上传递User1类对象时info属性值在网络的另一端能够接 ...

  6. java 保护内存操作的方法

    1.与c++不同,在java中,没有通过使用强制转换指针类型或者通过进行指针运算直接访问内存的方法.在java中使用对象时,需要严格地遵守类型规则.如果存在一个Mountain类对象的引用(类似于c+ ...

  7. java File文件操作共用方法整理

    package org.jelly.util; import java.io.BufferedReader; import java.io.BufferedWriter; import java.io ...

  8. form插件ajaxForm和ajaxSubmit方法传递对象参数说明

    form插件的ajaxForm和ajaxSubmit方法的Options对象还可以用来将值传递给jQuery的$.ajax方法.如果你熟悉$.ajax所支持的options,你可以利用它们来将Opti ...

  9. Java 中如何使用clone()方法克隆对象?

    java为什么要 对象克隆: 在程序开发时,有时可能会遇到以下情况:已经存在一个对象A,现在需要一个与A对象完全相同的B 对象,并对B 对象的属性值进行修改,但是A 对象原有的属性值不能改变.这时,如 ...

随机推荐

  1. 【Warrior刷题笔记】力扣169. 多数元素 【排序 || 哈希 || 随机算法 || 摩尔投票法】详细注释 不断优化 极致压榨

    题目 来源:力扣(LeetCode) 链接:https://leetcode-cn.com/problems/majority-element/ 注意,该题在LC中被标注为easy,所以我们更多应该关 ...

  2. 关于一类容斥原理设计 dp 状态的探讨

    写在前面 为什么要写?因为自己学不明白希望日后能掌握. 大体思路大概是 设计一个容斥的方案,并使其贡献可以便于计算. 得出 dp 状态,然后优化以得出答案. 下列所有类似 \([l,r]\) 这样的都 ...

  3. nignx-防盗链

    环境 主机                  IP            角色 centos6.5-1       192.168.3.10      源主机 centos6.5-2       19 ...

  4. Count Sequences

    \(考虑问题的转换,即把用n个球,分为r-l+2个部分,其中第1部分表示该区域的球值为l,第二部分表示该区域的球值为l+1\) \(......第r-l+2部分为不选该区域的球\) \(该问题等价于在 ...

  5. 初识python:格式化输出

    使用input函数输入用户值,再使用三种方法格式化输出. #!/user/bin env python # author:Simple-Sir # 20180831 # 格式化输出: name = i ...

  6. Django_环境配置(一)

    一.安装Django # 在CMD中运行 pip install django # 查看djangp版本 python manage.py version 二.创建项目 # 在CMD中运行django ...

  7. 第10组 Alpha冲刺 (3/6)(组长)

    1.1基本情况 ·队名:今晚不睡觉 ·组长博客:https://www.cnblogs.com/cpandbb/p/13971668.html ·作业博客:https://edu.cnblogs.co ...

  8. Java集合为什么设计为:实现类继承了抽象类,同时实现抽象类实现的接口

    更好阅读体验:Java集合为什么设计为:实现类继承了抽象类,同时实现抽象类实现的接口 问题 Java集合源码为什么设计为:「实现类继承了抽象类,同时实现抽象类实现的接口?」 看着List 集合的UML ...

  9. Jarvis OJ--PHPINFO

    一道浙大的题目 题目地址:http://web.jarvisoj.com:32784 拿到这道题目, 是一道反序列化的题目,题目源码很简单,当创建OowoO()这个类的对象时,会自动调用__const ...

  10. Manacher算法求解回文字符串

    Manacher算法可以在\(O(N)\)时间内求解出一个字符串的所有回文子串(正反遍历相同的字串). 注:回文串显然有两种,一种是奇数长度,如abczcba,有一个中心字符z:另外一种是偶数个长度, ...