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= ...
随机推荐
- 无线网络安全攻防实战进阶(杨哲) PDF|网盘下载内附提取码|
面对当前国内企事业单位及soho无线网络的飞速发展.智能手机等便携式设备的广泛使用.无线网络犯罪案例日益递增的发展现状,<无线网络安全攻防实战进阶>作为<无线网络安全攻防实战> ...
- 比较两个等长的字符串,若相同,则输出Match!,若不同,则输出No Match!
文章目录 问题 代码 运行结果 问题 比较两个等长的字符串,若相同,则输出Match!,若不同,则输出No Match! 代码 data segment str1 db 'ASDFGHJKL';字符串 ...
- Python time sleep()方法
描述 Python time sleep() 函数推迟调用线程的运行,可通过参数secs指秒数,表示进程挂起的时间.高佣联盟 www.cgewang.com 语法 sleep()方法语法: time. ...
- POJ 2443 Set Operation 题解
本文同时发布于 博客园 洛谷博客 题目链接 题目分析 给你n个集合,每个集合里面都有可能会重复的数字 q个询问,每次询问两个数是否会在同一集合内 $n<=1000$ $q<=200000$ ...
- 郭超:阿里云Cassandra背后的故事
大家好,我是阿里云数据库产品事业部的玄陵,真名郭超. 本次的分享大概分三个部分:Cassandra云数据库简介.Cassandra云数据库特性以及Q&A. 我们先了解一下Cassand ...
- 实验07——java输出数字的因数
package cn.tedu.demo; import java.util.Scanner; /** * @author 赵瑞鑫 E-mail:1922250303@qq.com * @versio ...
- Java实现短信验证码
前言 本人使用的是阿里短信服务,一开始尝试了许多不同的第三方短信服务平台,比如秒滴科技.梦网云通讯.当初开始为什么会选择这两个,首先因为,他们注册就送10元钱(#^.^#),但是后来却发现他们都需要认 ...
- PB级大规模Elasticsearch集群运维与调优实践
导语 | 腾讯云Elasticsearch 被广泛应用于日志实时分析.结构化数据分析.全文检索等场景中,本文将以情景植入的方式,向大家介绍与腾讯云客户合作过程中遇到的各种典型问题,以及相应的解决思路与 ...
- 冷饭新炒:理解Snowflake算法的实现原理
前提 Snowflake(雪花)是Twitter开源的高性能ID生成算法(服务). 上图是Snowflake的Github仓库,master分支中的REAEMDE文件中提示:初始版本于2010年发布, ...
- TypeScript 在vue中定义全局类型
全局类型定义 路径 src/types/store.d.ts /** * 定义全局的State在 store.d.ts文件中 */ // 单独的state,导出为单独的module使用 export ...