java的传参究竟是按值传递的还是按引用传递的
这里来弄清楚Java的传参究竟是按值传递的还是按引用传递的。
形参和实参
传参的概念里,有形参和实参的区分。形参是定义方法名和方法体的时候使用的参数,目的是用来接收调用该方法的时候传入的参数;实参是调用有参方法的时候传入的参数,方法名后面的括号中的参数就是实参。理解起来可能有点抽象,简单理解就是,形参是定义方法的参数,实参是调用方法时实际传入的参数,区别在于【定义】和【调用】。
简单举个例子,我定义了一个打印名字的方法,传入一个name的参数,这个参数就是形参。
public void printName(String name) {
System.out.println(name);
}
然后我去调用这个方法,传入了一个值为【杨冠标】的参数,这个参数就是形参。
String name = "杨冠标"; this.printName(name); // "杨冠标"
从名称上也可以看出,形参就是形式上的参数(键),实参就是实际传入的参数(值)。
什么是按值传递
按值传递(Pass by Value),是指在调用方法时将实参复制一份传递到方法中,这样当方法对形参进行修改时不会影响到实参,因为修改的不是同一块内存地址。
什么是按引用传递
按引用传递(Pass by Reference),是指在调用方法时将实参的地址(引用)传递到方法中,那么在方法中对形参所进行的修改将影响到实参,因为修改的是同一块内存地址。
Java中传参的按值传递
在Java中,数据类型可以被分为两种,一种是基本类型,一种是引用类型。其中,基本类型就是按值传递的。也就是说,当形参是基本类型的时候,实参是复制出来的一份,会在栈内存中开辟一块新的内存空间。
我们还是举一个简单的例子,定义一个修改年龄的方法,传入一个age的形参。
public void changeAge(int age) {
age = age + 1;
System.out.println(age);
}
然后我们来调用一下这个方法,传入一个值为【20】的实参。
int age = 20; this.changeAge(age); //
System.out.println(age); //
通过打印的结果可以看出,在changeAge(int age)方法中,传入的实参和操作的形参是相互独立而不影响的。
Java中传参的按引用传递
在Java中,引用类型就是按引用传递的。也就是说,当形参是引用类型的时候,实参是堆内存中对象的引用,不会在开辟一块新的内存空间。
我们先定义一个User的对象。
public class User {
private name;
private age;
// 相对应的getter和setter
}
然后定义一个修改User对象的方法。
public void changeUser(User user) {
user.setName("黄淇");
System.out.println(user.name);
}
最后我们实例化一个User对象,并调用修改User对象的方法来看看结果。
User user = new User();
user.setName("杨冠标"); this.changeUser(user); // "黄淇" System.out.println(user.getName()); // "黄淇"
通过打印的结果可以看出,在changeUser(User user)方法中,传入的实参和操作的形参是相互影响的。
总结
综合以上,我们可以得到一个结论:在Java中的传参既存在按值传递,也存在按引用传递。其中,基本类型的传参是按值传递的,传递的是值的拷贝,会在栈内存中开辟新的内存空间;引用类型(除了基本类型都是引用类型)的传参是按引用传递的,传递的是堆内存中对象的引用,操作的结果会直接反映到该对象中。
"我走了很远的路,才来到你的面前。"
java的传参究竟是按值传递的还是按引用传递的的更多相关文章
- Java方法的参数是按值传递的.【转】
在Java中,所有的方法参数,都是"按值传递". 有那么一种说法,Java中基本类型是按值传递,对象是按引用传递.这个说法其实是不确切的,确切的说法是 Java中基本类型将值作为参 ...
- Java中只有按值传递,没有按引用传递!
今天,我在一本面试书上看到了关于java的一个参数传递的问题: 写道 java中对象作为参数传递给一个方法,到底是值传递,还是引用传递? 我毫无疑问的回答:“引用传递!”,并且还觉得自己对java ...
- 【转】Java中只有按值传递,没有按引用传递!
原文链接:http://guhanjie.iteye.com/blog/1683637 今天,我在一本面试书上看到了关于java的一个参数传递的问题: 写道 java中对象作为参数传递给一个方法,到底 ...
- Java的参数传递是「按值传递」还是「按引用传递」?
JAVA传递的只有值,.传递的都是栈里的的值,只是有些栈里面的是值.有的是内存地址.(原文传递的都是栈里的的值有误,局部变量在栈中,成员变量在堆中,类变量(静态变量和常量)在方法区中,可以看做本文的变 ...
- Java中只有按值传递,没有按引用传递!(两种参数情况下都是值传递)
今天,我在一本面试书上看到了关于java的一个参数传递的问题: 写道 java中对象作为参数传递给一个方法,到底是值传递,还是引用传递? 我毫无疑问的回答:“引用传递!”,并且还觉得自己对java的这 ...
- edtftpj让Java上传FTP文件支持断点续传
在用Java实现FTP上传文件功能时,特别是上传大文件的时候,可以需要这样的功能:程序在上传的过程中意外终止了,文件传了一大半,想从断掉了地方继续传:或者想做类似迅雷下载类似的功能,文件太大,今天传一 ...
- 关于Java函数传参以及参数在函数内部改变的问题——JAVA值传递与引用最浅显的说明!
看了很多关于阐述JAVA传参到底是值传递还是引用的问题,有些说得很肤浅让人感觉似懂非懂的感觉,但是好像又能解决一些问题,然后就止步了.还有一些则是,讲得很深奥,看着好像很有道理的样子,但是其实还是没怎 ...
- 浅谈对java中传参问题的理解
之前用的c/c++比较多,在c/c++中对于传参类型,无外乎就是传值.传引用.传指针这几种.但在java中,由于没有指针类型,其传参的方式也发生了相应的变化.在网上找了找,按我之前的理解,java中传 ...
- Java上传文件FTP服务器代码
1. 在实际的应用重,通常是通过程序来进行文件的上传. 2. 实现java上传文件到ftp服务器中 新建maven项目 添加依赖 <dependency> <groupId>c ...
随机推荐
- 关于Eratosthenes筛子算法筛选小于n的素数的理解
今天在学习Java核心技术第九章集合框架中的BitSet时,遇到了这个算法.Eratosthenes筛子算法时一个查找素数的方法,这并不是查找素数的最好方法,但是测试编译程序性能的一种流行的基准. 一 ...
- 微信小程序api封装(promise)
顺带这是我平时公司切换改变网络环境 直接上代码,我相信就可以懂了, //app.js function fetchApi(url, type, params, method) { return new ...
- PHP经典面试题:如何保证缓存与数据库的双写一致性?
只要用缓存,就可能会涉及到缓存与数据库双存储双写,你只要是双写,就一定会有数据一致性的问题,那么你如何解决一致性问题? 面试题剖析 一般来说,如果允许缓存可以稍微的跟数据库偶尔有不一致的情况,也就是说 ...
- flume安装和介绍
一.安装1.flume-ng-1.5.0-cdh5.3.6.tar.gz 下载链接:https://pan.baidu.com/s/1AWPGP2qnY6_VpYr_iSnJ3w 密码:tiog2.对 ...
- SpringBoot Application深入学习
本节主要介绍SpringBoot Application类相关源码的深入学习. 主要包括: SpringBoot应用自定义启动配置 SpringBoot应用生命周期,以及在生命周期各个阶段自定义配置. ...
- 从零开始入门 | Kubernetes 中的服务发现与负载均衡
作者 | 阿里巴巴技术专家 溪恒 一.需求来源 为什么需要服务发现 在 K8s 集群里面会通过 pod 去部署应用,与传统的应用部署不同,传统应用部署在给定的机器上面去部署,我们知道怎么去调用别的机 ...
- Android性能优化总结
合理的管理内存 节制地使用Service,尽量使用IntentService 避免在Bitmap上浪费内存,压缩图片处理 谨慎使用抽象编程 尽量避免会用依赖注入框架 使用ProGuard简化代码,好处 ...
- Redis为什么是单线程、及高并发快的3大原因详解
Redis的高并发和快速原因 1.redis是基于内存的,内存的读写速度非常快: 2.redis是单线程的,省去了很多上下文切换线程的时间: 3.redis使用多路复用技术,可以处理并发的连接.非阻塞 ...
- 2019-9-25:渗透测试,基础学习,medusa爆破学习
Medusa(美杜莎)暴力破解使用 该文章仅供学习,利用方法来自网络文章,仅供参考 一.简介 medusa(美杜莎)是一个速度快,支持大规模并行,模块化,爆破登陆,可以同时对多个主机,用户或是密码执行 ...
- day 38 高级选择器
1.高级选择器 一.高级选择器 1-后代选择器 ***** 儿子.孙子.重孙子 1. .father .wu{ color: red; } 选择父类中特定的子类 2. .father p{ #后代中间 ...