我分了三种类型的参数进行测试

一、基本类型

    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方法传参,测试在方法内部改变参数内容是否会影响到原值的更多相关文章

  1. Java 常用类库一,main方法传参String[] args;获取输入Scanner ;hasNext();hasNextInt()

    1. main方法传参 package com.zmd.common_class_libraries; /** 给mian方法传参测试 */ public class MainArgsTest { p ...

  2. 再谈Java方法传参那些事

    把一个变量带进一个方法,该方法执行结束后,它的值有时会改变,有时不会改变.一开始会觉得--“好神奇呀”.当我们了解java内存分析的知识后,一切都是那么简单明了了--“哦,这么回事呀”.但是今天的上机 ...

  3. java的方法传参,最容易混淆的问题!!!

    参数传递 参数传递,可以理解当我们要调用一个方法时,我们会把指定的数值,传递给方法中的参数,这样方法中的参数就拥有了这个指定的值,可以使用该值,在方法中运算了.这种传递方式,我们称为参数传递. 在这里 ...

  4. 关于Java函数传参以及参数在函数内部改变的问题——JAVA值传递与引用最浅显的说明!

    看了很多关于阐述JAVA传参到底是值传递还是引用的问题,有些说得很肤浅让人感觉似懂非懂的感觉,但是好像又能解决一些问题,然后就止步了.还有一些则是,讲得很深奥,看着好像很有道理的样子,但是其实还是没怎 ...

  5. 对象引用 方法传参 值传递 引用传递 易错点 MD

    Markdown版本笔记 我的GitHub首页 我的博客 我的微信 我的邮箱 MyAndroidBlogs baiqiantao baiqiantao bqt20094 baiqiantao@sina ...

  6. python -- unittest测试用例函数无法传参的处理方法(ddt)

    1.超继承 重写测试用例类的init方法,如下所示. import requests import unittest class XiaoheiCases(unittest.TestCase): de ...

  7. MyBatis dao层 方法传参

    MyBatis dao层 方法传参有三种方法. 1. 以下标的方法获取参数. <update id="insertSuccessKilled">       INSER ...

  8. EasyUI queryParams属性 在请求远程数据同时给action方法传参

    http://www.cnblogs.com/iack/p/3530500.html?utm_source=tuicool EasyUI queryParams属性 在请求远程数据同时给action方 ...

  9. javascript 字符串方法传参

    javascript 字符串方法传参由于嵌套的单引号,双引号过多.有点混乱.. 正确方法如下: '   <td align="left"><input type= ...

随机推荐

  1. PHP 命名空间(namespace)定义

    PHP 命名空间(namespace) PHP 命名空间(namespace)是在PHP 5.3中加入的,如果你学过C#和Java,那命名空间就不算什么新事物. 不过在PHP当中还是有着相当重要的意义 ...

  2. Python os.lchown() 方法

    概述 os.lchown() 方法用于更改文件所有者,类似 chown,但是不追踪链接.高佣联盟 www.cgewang.com 只支持在 Unix 下使用. 语法 lchown()方法语法格式如下: ...

  3. Python time strftime()方法

    描述 Python time strftime() 函数接收以时间元组,并返回以可读字符串表示的当地时间,格式由参数format决定.高佣联盟 www.cgewang.com 语法 strftime( ...

  4. 5.10 省选模拟赛 拍卖 博弈 dp

    LINK:拍卖 比赛的时候 前面时间浪费的有点多 写这道题的时候 没剩多少时间了. 随便设了一个状态 就开始做了. 果然需要认真的思考.其实 从我的状态的状态转移中可以看出所有的结论. 这里 就不再赘 ...

  5. 数据库允许空值(null),往往是悲剧的开始

    原文: 58沈剑   架构师之路   https://mp.weixin.qq.com/s/XRSPITgWWK-2Ee-cSIqw1w 数据库字段允许空值,会遇到一些问题,此处包含的一些知识点,和大 ...

  6. 授人以渔:stm32资料查询技巧

    摘要:本章以stm32f103作为案例向大家讲解arm公司和st公司的关系以及我们在对stm32开发时需要如何正确的查找手册. ARM公司和ST公司的关系 这里要从一块芯片的生产说起,比如我们要生成一 ...

  7. 区间DP 学习笔记

    前言:本人是个DP蒟蒻,一直以来都特别害怕DP,终于鼓起勇气做了几道DP题,发现也没想象中的那么难?(又要被DP大神吊打了呜呜呜. ----------------------- 首先,区间DP是什么 ...

  8. 【PA2014】Bohater 题解(贪心)

    前言:一道经典贪心题. -------------------------- 题目链接 题目大意:你有$z$滴血,要打$n$只怪.打第$i$只怪扣$d_i$滴血,回$a_i$滴血.问是否存在一种能够通 ...

  9. 【HDU5869】 Different GCD Subarray Query 题解 (线段树维护区间GCD)

    题目大意:求区间$[L,R]$中所有子区间产生的最大公因数的个数. ------------------------- 对于$gcd$,我们知道$gcd(a,b,c)=gcd(gcd(a,b),c)$ ...

  10. three.js 着色器材质之glsl内置函数

    郭先生发现在开始学习three.js着色器材质时,我们经常会无从下手,辛苦写下的着色器,也会因莫名的报错而手足无措.原因是着色器材质它涉及到另一种语言–GLSL,只有懂了这个语言,我们才能更好的写出着 ...