最近做练习时碰到一个问题,Java到底是怎样传参的,经过查资料与实验,我发现Java传参都是传引用变量的副本值。

1 Java中的引用变量

  1.1 字面值引用变量:即基本数据类型的引用变量 ,如 int b = 1 , b就是字面值引用变量。
  多个字面值引用变量也可以指向同一字面值,其中一个引用修改字面值,不会影响另一个引用字面值。
 

 

  1.2 对象引用变量:即普通java对象的引用变量 ,如 String a = "abc" , Object b = new Object,a、b就是对象引用变量。
  Java 是不能直接操作对象的,只能通过“对象引用的操作”来操作对象。而对象的引用的表示就是对象变量。可以多个对象引用变量指向同一个对象。
  (1)对于普通对象
  其中一个引用修改对象值,也会影响另一个引用的对象值。如下图:
 

  而如果其中一个引用改变指向的值,另一个引用不改变。如下图:

  (2)对于String类或者包装类对象:
  String类和包装类如Interger、Character类对象的值,类似于基本数据类型的值,是存放在栈中的,不可改变的。
  比如String类的源码,其值value和其本省都是final的,一旦赋值就不可改变。

  故引用并不能修改对象值,如果其中一个引用“修改对象值”,它只是修改其指向的对象,另一个引用不改变。

2 实验验证

class Test {
int intInObj;
String strInObj;
Integer integerInObj; public Test(int intInObj, String strInObj, Integer integerInObj){
this.intInObj = intInObj;
this.strInObj = strInObj;
this.integerInObj = integerInObj;
}
} public class SendValue{
public static void main(String[] args) {
// 测试1:传int
int testInt = 1;
SendValue.change(testInt);
System.out.println(testInt); // 测试2:传String
String testString = "1";
SendValue.change(testString);
System.out.println(testString); // 测试3:传Integer
Integer testInteger = 1;
SendValue.change(testInteger);
System.out.println(testInteger); // 测试4:传对象
Test testObject = new Test(1, "1", 1);
SendValue.change(testObject); // 形参修改原对象内的值
System.out.println(testObject.intInObj);
System.out.println(testObject.strInObj);
System.out.println(testObject.integerInObj); // 测试5:传对象
SendValue.changeObject(testObject); // 形参改变指向的对象
System.out.println(testObject.intInObj);
System.out.println(testObject.strInObj);
System.out.println(testObject.integerInObj);
} public static void change(int i) {
i = 10;
} public static void change(String str) {
str = "10";
} public static void change(Integer i) {
i = 10;
} public static void change(Test test) {
test.intInObj = 10;
test.strInObj = "10";
test.integerInObj = 10;
} public static void changeObject(Test test) {
test = new Test(100, "100", 100);
}
}

获得结果如下:

  画图解释测试4和测试5:

  

Java传参都是传引用变量的副本的更多相关文章

  1. vue初始化、数据处理、组件传参、路由传参、全局定义CSS与JS、组件生命周期

    目录 项目初始化 组件数据局部化处理 子组件 父组件 路由逻辑跳转 案例 组件传参 父传子 子组件 父组件 子传父 子组件 父组件 组件的生命周期钩子 路由传参 第一种 配置:router/index ...

  2. SpringCloud:feign对象传参和普通传参及遇到的坑

    对象传参: #使用@RequestBody来指定传参对象 @RequestMapping(value = "/v2/matterCode/genCode", method = Re ...

  3. Apache ab测试工具使用方法(无参、get传参、post传参)(转)

    转自Apache ab测试工具使用方法(无参.get传参.post传参) Ab测试工具是apache自带的测试工具,具有简单易上手的特性,下面我总结一下我的使用方法,首先去官方下载apache程序包, ...

  4. python中函数的参数:必传参数(位置参数)、默认值参数、参数组传参、关键字传参

    1.必传参数也叫做位置参数,因为必填,也必须对应位置 2.默认值参数如上图的word 3.参数组参数:传进去的是0个.或多个value的形式,,,和位置参数有点像,只传value值,但是没有限制个数 ...

  5. String的按值传递,java传参都是传值

    java中对象作为参数传递给一个方法,到底是值传递,还是引用传递? String和int参数传递是按值传递还是引用传递? 一道面试题目,String的传递: public String change( ...

  6. Java传参-基本数据类型和引用数据类型作为参数的区别(值传递)

    java中的方法可以传递参数,参数的传递方法就是值传递. 参数有形参和实参,定义方法时写的参数叫形参,真正调用方法时,传递的参数叫实参. 调用方法时,会把实参传递给形参,方法内部其实是在使用形参. 所 ...

  7. Postman 串行传参和动态传参详解

    Postman是一款功能强大的网页调试与发送网页HTTP请求的Chrome插件 用Postman做接口测试的时候,要把多条用例一起执行,就需要把用例连接起来,一次性执行 目录 串行传参 动态传参 使用 ...

  8. Postman高级应用——串行传参和动态传参详解

    Postman是一款功能强大的网页调试与发送网页HTTP请求的Chrome插件 用Postman做接口测试的时候,要把多条用例一起执行,就需要把用例连接起来,一次性执行 目录 串行传参 动态传参 使用 ...

  9. Apache ab测试工具使用方法(无参、get传参、post传参)

    Ab测试工具是apache自带的测试工具,具有简单易上手的特性,下面我总结一下我的使用方法,首先去官方下载apache程序包,我下的最新版本apache2.4.23,下载地址http://httpd. ...

随机推荐

  1. dll详解

    [转]http://www.cnblogs.com/xuemaxiongfeng/articles/2461632.html 不解为什么要用WINAPI宏定义,查了后发现下面的定义.于是乎需要区别 _ ...

  2. code3027 线段覆盖2

    dp 数据:d[i].a d[i].b d[i].v 分别表示第i条线段的起始点,结束点,价值 先按d[i].b排好序 dp[i]表示前i条线段的最大价值 方程: dp[i]=max{ dp[i-1] ...

  3. [GO]并的爬取捧腹的段子

    package main import ( "fmt" "strconv" "net/http" "regexp" &q ...

  4. Sql优化,面试经验总结

    (1)列优先 如图有表A和表B 对其查询时,会有如下语句: select a.*,b.* from a,b where a.id = b.a_id; 注意from 后边的表名, a.如果多表查询是完全 ...

  5. HDU 1159 Common Subsequence (LCS)

    题意:给定两行字符串,求最长公共子序列. 析:dp[i][j] 表示第一串以 i 个结尾和第二个串以 j 个结尾,最长公共子序列,剩下的就简单了. 代码如下: #pragma comment(link ...

  6. 团体程序设计天梯赛L2-009 抢红包 2017-03-22 19:18 131人阅读 评论(0) 收藏

    L2-009. 抢红包 时间限制 300 ms 内存限制 65536 kB 代码长度限制 8000 B 判题程序 Standard 作者 陈越 没有人没抢过红包吧-- 这里给出N个人之间互相发红包.抢 ...

  7. 【扫盲贴】为什么屏幕分辨率是 640x480

    本文原地址:http://www.easyx.cn/skills/View.aspx?id=172 常见的屏幕分辨率很奇怪,为什么总用一些不零不整的数字?比如以前最常见的分辨率是 640x480,当初 ...

  8. CodeForces 620E New Year Tree(线段树的骚操作第二弹)

    The New Year holidays are over, but Resha doesn't want to throw away the New Year tree. He invited h ...

  9. cxgrid列高度行宽度定义

    行高度定义 TableView->OptionView->dataRowHieght  即可设置行高度 自动调整行宽 1.选中cxgridview,在属性中找OptionsView---& ...

  10. android app启动就闪退怎么办?

    开发过程中,如遇到android app启动就闪退,不要急,直接进入调试模式运行app,就会取得出错的原因. http://blog.sina.com.cn/s/blog_44fa172f0102wg ...