最近做练习时碰到一个问题,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. swift新建类和子类方法的重写与重载

    1.首先什么是重写与重载? 一.重写(override) override是重写(覆盖)了一个方法,以实现不同的功能.一般是用于子类在继承父类时,重写(重新实现)父类中的方法. 重写(覆盖)的规则: ...

  2. PHP微信授权登录信息

    文件1:index.php //换成自己的接口信息 $appid = 'XXXXX'; header('location:https://open.weixin.qq.com/connect/oaut ...

  3. 微信第三方登录测试时报Scope参数错误或没有Scope权限解决方法

    一 报错信息: 二 出现原因分析: 出现这种错误网上查出现有的原因是: 1. 订阅号没有相关的权限 2. 账号没有认证,没有相关的权限 那么这里遇到问题两种都不是.开发账号是 服务号,而且也是认证号. ...

  4. 假设字符串类似这样的aba和aab,abc和bca就相等,现在随便给你二组字符串,请编程比较他们看是否相等

    public static boolean stringSame(String str1,String str2){ if(str1.length() != str2.length()){//先判断长 ...

  5. Getting Started with Node.js on Heroku

    NodeJS应用托管平台 https://devcenter.heroku.com/articles/getting-started-with-nodejs#dyno-sleeping-and-sca ...

  6. 【小梅哥SOPC学习笔记】NIOS II工程目录改变时project无法编译问题

    解决NIOS II工程移动在磁盘上位置后project无法编译问题 说明:本文档于2017年3月4日由小梅哥更新部分内容,主要是增加了讲解以Quartus II13.0为代表的经典版本和以15.1为代 ...

  7. CentOS 7.2安装gitlab-ce

    国内网络原因,gitlab-ce安装包可以在清华大学开源网站镜像站下载:https://mirrors.tuna.tsinghua.edu.cn/gitlab-ce/ [root@gitlab ~]# ...

  8. DELPHI XE5-8 弹出列表框供选择

    点击章节练习: var tmplm:Tlistboxitem; begin dm.FDQTMP.SQL.Clear; dm.FDQTMP.SQL.Add('select GSESSON from TS ...

  9. [python] [转]如何自动生成和安装requirements.txt依赖

    [转]如何自动生成和安装requirements.txt依赖 在查看别人的Python项目时,经常会看到一个requirements.txt文件,里面记录了当前程序的所有依赖包及其精确版本号.这个文件 ...

  10. 零成本实现WEB性能测试(二)JMeter基础知识

    特点: 支持多种服务类型进行测试,包括: Web-Http,HTTPS SOAP Database via JDBC LDAP JMS Mail-POP3 & IMAP 支持录制回放方式获取脚 ...