public voidtest1(){

String s= "1";

System.out.println("调用方法hange1前s的内存地址:"+System.identityHashCode(s));

Integer i= 1;

System.out.println("调用方法change1前:"+s+"-----"+i);

change1(s, i);

System.out.println("调用方法change1后s的内存地址:"+System.identityHashCode(s));

System.out.println("调用change1方法后:"+s+"-----"+i);

String[] arr= {"1","2"};

System.out.println("调用方法hange2前arr的内存地址:"+System.identityHashCode(arr));

System.out.println("调用change2方法前:"+arr[1]);

change2(arr);

System.out.println("调用方法hange2后arr的内存地址:"+System.identityHashCode(arr));

System.out.println("调用change2方法后:"+arr[1]);

}private voidchange1(String s, Integer i){

String str= "1";

System.out.println("新定义str(与未改变的s相同):"+System.identityHashCode(str));

s= "2";

System.out.println("方法里改变s后内存地址:"+System.identityHashCode(s));

i= 2;

}private voidchange2(String[] arr){

arr[1] = "lll";

System.out.println("方法hange2的arr的内存地址:"+System.identityHashCode(arr));

}

//结果

如图:方法中形参的“s”(String类型)改变后地址发生了变化,只是形参的“s”(这里也可以随便起个名称如“s1”,“s2”)地址发生了改变,主方法实参“s”地址一直是原地址

故:在方法中形参地址改变不会影响到实参地址;

基本类型和String值改变是会改变对应的地址,但主方法“s”和“i”指向地址一直未变;故不会发生改变

**** 注意:因为Integer和String都是final修饰,改变值后会指向新的地址;

arr是引用类型在方法change2中修改后。方法中的形参“arr”和主方法中的实参“arr”指向的还是同一个地址,故改变后主方法实参“arr”指向地址的值发生改变,实参“arr”发生改变;

故:引用类型的形参的引用地址与实参一样时,形参改变会影响到实参(非String和基本类型)

举例:如果change2的方法中写的是 arr = new String[]{};

也就是

private voidchange2(String[] arr){//arr[1] = "lll";

arr = new String[]{"222", "333"};

System.out.println("方法hange2的arr的内存地址:"+System.identityHashCode(arr));

}

结果(在主方法中arr未改变):

在change2中arr = new String[]{"222", "333"};相当于给方法中的形参“arr”指向了一个新的地址(此时change2中的“arr”和主方法中的“arr”指向地址已经不同),此时形参“arr”改变已经影响不到实参“arr”;

因此又证明了:在方法中形参地址改变不会影响到实参地址;

举例:如下面代码:

public classTestPerson {public static voidmain(String[] args) {

Person p1= new Person("张无忌");

Person p2= new Person("赵敏");

System.out.println("p1原值:"+p1);

System.out.println("p2原值:"+p2);

System.out.println("p1内存地址:"+System.identityHashCode(p1));

System.out.println("p2内存地址:"+System.identityHashCode(p2));

change3(p1, p2);

System.out.println();

System.out.println("调用change3之后p1值:"+p1);

System.out.println("调用change3之后p2值:"+p2);

System.out.println("调用change3之后p1内存地址:"+System.identityHashCode(p1));

System.out.println("调用change3之后p2内存地址:"+System.identityHashCode(p2));

}public static voidchange3(Person x, Person y){

Person temp=x;

x=y;

y=temp;

System.out.println();

System.out.println("change3方法中交换后(之前x=p1;现在x=p2)x="+x);

System.out.println("change3方法中交换后(之前y=p2)y="+y);

System.out.println("change3方法中交换后(之前x=p1;现在x=p2)x内存地址:"+System.identityHashCode(x));

System.out.println("change3方法中交换后(之前y=p2)y内存地址:"+System.identityHashCode(y));

}

}classPerson{publicString name;publicPerson(String name) {this.name =name;

}

@OverridepublicString toString() {return "Person [name=" + name + "]";

}

}

在change3中只不过是让x和y的引用地址发生了改变;但不会影响到原有的p1和p2指向的地址

开始p1和x指向同一个地址,p2和y指向同一个地址,在方法未交换之前实参和形参的地址(即p1->17984913、x->17984913、p2->14116828、y->14116828),调用方法后因为x和y互换(即p1->17984913、x->14116828、p2->14116828、y->17984913)p1和p2不变,x和y地址互换,之后没发生具体值的改变,且p1和y指向同一个地址,p2和x指向对一个地址,故p1和p2不会发生变化;

举例:p1发生变化

public static voidchange3(Person x, Person y){

Person temp=x;

x=y;

y=temp;

y.name="张三";

System.out.println();

System.out.println("change3方法中交换后(之前x=p1;现在x=p2)x="+x);

System.out.println("change3方法中交换后(之前y=p2)y="+y);

System.out.println("change3方法中交换后(之前x=p1;现在x=p2)x内存地址:"+System.identityHashCode(x));

System.out.println("change3方法中交换后(之前y=p2)y内存地址:"+System.identityHashCode(y));

}

//结果

在方法中交换之后p1个y指向同一个地址 如上图y和p1内存地址为8600110;故地址相同,修改y.name = "张三"; (即地址8600110的内容改变),因为p1也是指向8600110所以p1也会发生变化;

故:当形参的引用地址与实参一样时,形参改变会影响到实参(非String和基本类型)

.

java形参改变实参_java方法改变形参后得到实参值是否改变相关推荐

  1. 两个组件绑定vuex中相同的状态值,但是一个组件改变的时候,另一个组件中的值同步改变了,但是页面没有更新

    最近在做项目中,遇到了一个问题,就是两个组件绑定vuex中相同的状态值,但是一个组件改变的时候,另一个组件中的值同步改变了,但是页面没有更新,只有数组有这个问题.后来思路就是深度监听到数组改变后,再更 ...

  2. java 默认参数_Java 方法的参数可以有默认值吗?

    Java 方法的参数可以有默认值吗? 例如 void method(String p1, int p2, bool p3=false); 回答 Java不支持这种特性, 如果你真的有需求,你可以 通过 ...

  3. java -jar 未响应_Java 方法性能监控和统计工具 MyPerf4J

    一个针对高并发.低延迟应用设计的高性能 Java 性能监控和统计工具. 特性 高性能: 单线程支持每秒 1000 万次 响应时间的记录,每次记录只花费 73 纳秒 无侵入: 采用 JavaAgent ...

  4. java自定义方法参数注解_Java方法中的参数太多,第1部分:自定义类型

    java自定义方法参数注解 我认为构造函数和方法中冗长的参数列表是Java开发中的另一个" 危险信号 ",就逻辑和功能而言,它们不一定是"错误的",但通常暗示当 ...

  5. java 构建者模式_Java方法中的参数太多,第3部分:构建器模式

    java 构建者模式 在我的前两篇文章中,我研究了如何通过自定义类型和参数对象减少构造函数或方法调用所需的参数数量. 在本文中,我将讨论如何使用构建器模式来减少构造器所需的参数数量,并讨论该模式如何甚 ...

  6. java 覆盖和隐藏_Java方法的覆盖与隐藏的区别分析

    本篇文章介绍了,关于Java方法的覆盖与隐藏的区别分析.需要的朋友参考下 关于隐藏和覆盖的区别,要提到RTTI(run-time type identification)(运行期类型检查),也就是运行 ...

  7. java线程立刻执行_Java 线程调用start()后会立即执行run()方法吗?

    别想当然 问题 Java 线程调用start()后会立即执行run()方法吗? 我们在开发中,经常和线程打交道,有些东西总是司空见惯,想当然地认为某些事情理所当然... 但是今天偶然发现一个有趣的现象 ...

  8. java 常量池溢出_Java方法区和运行时常量池溢出问题分析(转)

    运行时常量池是方法区的一部分,方法区用于存放Class的相关信息,如类名.访问修饰符.常量池.字段描述.方法描述等. String.intern()是一个native方法,它的作用是:如果字符串常量池 ...

  9. java 重载 调用指定_java 方法重载的时候,同一个类,父子类,调用哪个方法的问题...

    展开全部 package com.java.test; public class Test extends Parent { public static void main(String[] args ...

最新文章

  1. php gbk字符串 存utf8 html,php utf8 gbk 数组 互转(示例代码)
  2. js 技巧杂引(转)
  3. leetcode-search-in-rotated-sorted-array
  4. python写入指定行_python文件操作如何写在指定的行
  5. 超级签名源码_TestFlight 为什么那么多人选择TF签名?
  6. Application,Session,Cookie和ViewState等对象用法和区别
  7. jquery解析php json,Jquery解析json数据详解_jquery
  8. 机器视觉运动控制一体机应用|工件同心度检测
  9. 计算机网络常用五种编码方式,五种常见的基带数字编码方式
  10. python 正则表达式(3.24)
  11. 60位移动游戏大佬共同发起成立“上方汇”
  12. 全国计算机二级考c考点,2019年全国计算机二级C语言考试考点解析(1)
  13. PC天翼云盘v6.3.4精简版
  14. 魅族魅蓝新品15日发布 售价或超过千元?
  15. MeterSphere案例分享丨易盛信息MeterSphere接口测试使用经验
  16. python找出3或者5的倍数_python – 3和5的倍数之和
  17. 揭秘广告软文的五种写法
  18. MySQL中查询某年某月的数据
  19. 高校房产管理—周转房、经营性房产管理分析
  20. Linux分区页框分配器之水位

热门文章

  1. Spring之 Bean的自动装配
  2. (入门级小项目)JSP编程+web项目发布到Tomcat+mysql数据库
  3. Shiro(二)通过shiro实现登录 连接数据库+集成Springboot
  4. 新版Ubuntu安装日文输入法
  5. Unity3D学习笔记(二十五):文件操作
  6. Python day13文件的读写
  7. Eclipse配置jstl标准标签库详解
  8. jQuery选择器之id选择器
  9. Android平台的用户行为记录解决方案
  10. U盘的用法用途与维护