Java方法传参,测试在方法内部改变参数内容是否会影响到原值
我分了三种类型的参数进行测试
一、基本类型
public static void main(String[] args) {
System.out.println("验证基本类型int作为参数传入方法中进行修改后原值是否会改变");
int item1 = 1;
System.out.println("int:改变前值为" + item1);
changeInt(item1);
System.out.println("int:类型改变后值为" + item1);
System.out.println("-------------------------------------------------------");
}
private static void changeInt(int param) {
param = 10;
System.out.println("int:方法中值为" + param);
}
打印结果:

这里我用的是int,基本类型算是比较简单明了,传入方法的参数是int item1的值拷贝,所以方法内改变的不是item1。
二、 引用类型
public static void main(String[] args) {
System.out.println("验证引用类型ItemModel作为参数传入方法中进行修改后原值是否会改变");
System.out.println("第一次测试");
ItemModel item4 = new ItemModel("xiao ming");
System.out.println("ItemModel:改变前对象的hashCode为" + System.identityHashCode(item4) + " 值为" + item4.toString());
changeItemModel1(item4);
System.out.println("ItemModel:改变后对象的hashCode为" + System.identityHashCode(item4) + " 值为" + item4.toString());
System.out.println("第二次测试");
ItemModel item5 = new ItemModel("xiao ming");
System.out.println("ItemModel:改变前对象的hashCode为" + System.identityHashCode(item5) + " 值为" + item5.toString());
changeItemModel2(item5);
System.out.println("ItemModel:改变后对象的hashCode为" + System.identityHashCode(item5) + " 值为" + item5.toString());
System.out.println("-------------------------------------------------------");
}
private static void changeItemModel1(ItemModel param) {
param.setName("xiao hong");
System.out.println("ItemModel:方法中对象的hashCode为" + System.identityHashCode(param) + " 值为" + param);
}
private static void changeItemModel2(ItemModel param) {
param = new ItemModel();
param.setName("xiao hong");
System.out.println("ItemModel:方法中对象的hashCode为" + System.identityHashCode(param) + " 值为" + param);
}
class ItemModel {
private String name;
public ItemModel() {
}
ItemModel(String name) {
this.name = name;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
@Override
public String toString() {
return "ItemModel{" +
"name='" + name + '\'' +
'}';
}
}
打印结果:

这里我打印了ItemModel的hashCode和toString方法,我们可以看到在第一次测试中,改变前、方法中、改变后对象的hashCode的是一样的,所以我们可以确认传入方法的是对象的引用,所以这一次原对象发生改变。在第二次测试的方法中,多了一行
param = new ItemModel();
这里一行是新创建了一个ItemModel对象,param被赋予了新的引用地址,所以能看到打印出的hashCode和原本是不一样的,所以第二次测试中原对象并没有被改变。
三、String 和 Integer
这里提一点,String和Integer对象都是不可改变的,每次重新赋值都是指向一个新的引用而已(可以参考上面的第二次测试)
public static void main(String[] args) {
System.out.println("验证引用类型Integer作为参数传入方法中进行修改后原值是否会改变");
Integer item2 = new Integer(1);
System.out.println("Integer:改变前对象的hashCode为" + System.identityHashCode(item2) + " 值为" + item2);
changeInteger(item2);
System.out.println("Integer:改变后对象的hashCode为" + System.identityHashCode(item2) + " 值为" + item2);
System.out.println("-------------------------------------------------------");
System.out.println("验证引用类型String作为参数传入方法中进行修改后原值是否会改变");
String item3 = "xiao ming";
System.out.println("String:改变前对象的hashCode为" + System.identityHashCode(item3) + " 值为" + item3);
changeString(item3);
System.out.println("String:改变后对象的hashCode为" + System.identityHashCode(item3) + " 值为" + item3);
System.out.println("-------------------------------------------------------");
}
private static void changeInteger(Integer param) {
param = 10;
System.out.println("Integer:方法中对象的hashCode为" + System.identityHashCode(param) + " 值为" + param);
}
private static void changeString(String param) {
param = "xiao hong";
System.out.println("String:方法中对象的hashCode为" + System.identityHashCode(param) + " 值为" + param);
}
打印结果:

所以像这种不可变的引用类型,虽然传入的也是对象的引用,但是无论在方法中如何操作,原对象的值是不会发生变化的
Java方法传参,测试在方法内部改变参数内容是否会影响到原值的更多相关文章
- Java 常用类库一,main方法传参String[] args;获取输入Scanner ;hasNext();hasNextInt()
1. main方法传参 package com.zmd.common_class_libraries; /** 给mian方法传参测试 */ public class MainArgsTest { p ...
- 再谈Java方法传参那些事
把一个变量带进一个方法,该方法执行结束后,它的值有时会改变,有时不会改变.一开始会觉得--“好神奇呀”.当我们了解java内存分析的知识后,一切都是那么简单明了了--“哦,这么回事呀”.但是今天的上机 ...
- java的方法传参,最容易混淆的问题!!!
参数传递 参数传递,可以理解当我们要调用一个方法时,我们会把指定的数值,传递给方法中的参数,这样方法中的参数就拥有了这个指定的值,可以使用该值,在方法中运算了.这种传递方式,我们称为参数传递. 在这里 ...
- 关于Java函数传参以及参数在函数内部改变的问题——JAVA值传递与引用最浅显的说明!
看了很多关于阐述JAVA传参到底是值传递还是引用的问题,有些说得很肤浅让人感觉似懂非懂的感觉,但是好像又能解决一些问题,然后就止步了.还有一些则是,讲得很深奥,看着好像很有道理的样子,但是其实还是没怎 ...
- 对象引用 方法传参 值传递 引用传递 易错点 MD
Markdown版本笔记 我的GitHub首页 我的博客 我的微信 我的邮箱 MyAndroidBlogs baiqiantao baiqiantao bqt20094 baiqiantao@sina ...
- python -- unittest测试用例函数无法传参的处理方法(ddt)
1.超继承 重写测试用例类的init方法,如下所示. import requests import unittest class XiaoheiCases(unittest.TestCase): de ...
- MyBatis dao层 方法传参
MyBatis dao层 方法传参有三种方法. 1. 以下标的方法获取参数. <update id="insertSuccessKilled"> INSER ...
- EasyUI queryParams属性 在请求远程数据同时给action方法传参
http://www.cnblogs.com/iack/p/3530500.html?utm_source=tuicool EasyUI queryParams属性 在请求远程数据同时给action方 ...
- javascript 字符串方法传参
javascript 字符串方法传参由于嵌套的单引号,双引号过多.有点混乱.. 正确方法如下: ' <td align="left"><input type= ...
随机推荐
- 5.15 牛客挑战赛40 B 小V的序列 关于随机均摊分析 二进制
LINK:小V的序列 考试的时候 没想到正解 于是自闭. 题意很简单 就是 给出一个序列a 每次询问一个x 问序列中是否存在y 使得x^y的二进制位位1的个数<=3. 容易想到 暴力枚举. 第一 ...
- zabbix监控配置一般流程
目录 zabbix监控配置流程 1. 配置客户端 2. 配置监控 2.1 创建主机组 2.2 添加主机并加入主机组 2.3 添加监控项 2.3.1 模板的方式(不用添加触发器) 2.3.2 手动添加的 ...
- 安装Hive 使用beeline 链接 出现 User: AAA is not allowed to impersonate BBB
AAA 指的是 hdfs 文件系统的用户 BBB 是hive 设置的 hiveserver2 配置文件中的登陆用户名 在hadoop 配置如下 <property> <name> ...
- 部署Python应用
目录 安装Python 3.7.5 部署文件 安装Python 3.7.5 CentOS默认安装的是2.7.5版本的python [root@iZuf6e3zah39uzoj5pg1myZ ~]# p ...
- tracebace用法
介绍一下traceback 平时看到的程序的错误信息也就是traceback信息 举个简单例子: import traceback try: s = [1, 2, 3] print s[5] exce ...
- Flink的流处理API(二)
一.Environment 1,getExecutionEnvironment getExecutionEnvironment会根据查询运行的方式决定返回什么样的运行环境,是最常用的一种创建执行环境的 ...
- 015_go语言中的闭包
代码演示 package main import "fmt" func intSeq() func() int { i := 0 return func() int { i++ r ...
- Java实现短信验证码
前言 本人使用的是阿里短信服务,一开始尝试了许多不同的第三方短信服务平台,比如秒滴科技.梦网云通讯.当初开始为什么会选择这两个,首先因为,他们注册就送10元钱(#^.^#),但是后来却发现他们都需要认 ...
- Python 创建用户界面之 PyQt5 的使用
之前给大伙介绍了下 tkinter,有朋友希望小帅b对其它的 Python GUI 框架也说道说道,那么今天就来说说 PyQt5 如何创建用户界面. 很多人学习python,不知道从何学起.很多 ...
- CSS基础知识(下)
3.层叠 稍微复杂的样式表中都可能存在两条甚至多条规则同时选择一个元素的情况.CSS通过一种叫作层叠(cascade)的机制来处理这种冲突. 层叠机制的原理是为规则赋予不同的重要程度.最重要的是作者样 ...