java 方法传参方式: 按值调用
程序设计语言中将参数传递给方法的几种方式:
- 按名调用(call by name): Algol 语言采用此方式, 已成为历史;
- 按值调用(call by value): 方法接收到的是调用者提供的 变量值;
- 按引用调用(call by reference): 方法接受到的是调用者低筒的 变量地址;
C++ 支持 按值调用 和 按引用调用:
void func(int arg); // 按值调用;
void func(int& arg); // 按引用调用;
而 java 只支持 按值调用, 也就是说方法得到的是所有参数值的一个拷贝, 在方法内对参数值进行修改是不会影响原值的.
然而方法参数有两种类型:
- 基本数据类型: 数字, 布尔值;
- 对象引用.
当方法参数是 对象引用 时, 在方法很容易的调用其 setXXX
方法修改该对象属性值, 在退出方法后该修改仍然有效, 但这仍旧只是 按值调用.
因为参数是 对象引用, 在该方法内仍旧执行原对象(类似 C++ 的指针), 调用它的 setXXX
方法当然能修改对象属性了. 但也仅限于修改对象属性(状态), 而不能通过 new
等方式对原对象进行修改.
如果还有疑问, 就请看看这个例子:
class MyObject {
private String name;
MyObject(String name) {
this.name = name;
}
}
static void swap(MyObject first, MyObject second) {
MyObject temp = first;
first = second;
second = first;
}
static void testSwap() {
MyObject a = new MyObject("a");
MyObject b = new MyObject("b");
swap(a, b);
}
请问在执行 swap()
函数后, 对象 a 和 对象 b 的 name
是否变化?
答案是没有变化. 在 testSwap()
方法中, first
和 second
完成交换并分别指向对方. 但是, 在进入方法时, 它们拿到的是对象引用的拷贝(位置), 类似于:
- 进入
swap()
方法前,a
知道在内存地址为 100 的地方存储了一个MyObject
对象, 'b' 知道在内存地址为 200 的地方存储了另一个MyObject
对象; - 进入
swap()
方法时,a
将它的对象引用复制一份给first
, 也就是说first
知道内存地址为 100 的地方有一个MyObject
对象.second
同理; - 在退出
swap()
方法时,first
与second
交换值, 也就是说first
知道内存地址为 200 的地方有一个MyObject
对象, 它已经跟内存地址为 100 的MyObject
对象没有任何关系了.second
同理; - 在退出
swap()
方法后,first
与second
被销毁,a
仍旧是知道内存地址为 100 的地方有一个MyObject
对象...
其实, 这就是 C/C++ 的指针.
顺便说一句, 通过 C++ 的 按引用调用 可以很方便实现 swap() 函数. 当然, 用指针也是支持滴, 只不过稍微复杂点(这里只给出声明, 有兴趣的同学自己去写实现吧):
MyObject* a = new MyObject("a");
MyObject* b = new MyObject("b");
void swap(MyObject& first, MyObject& second); // C++ 引用
void swap(MyObject **first, MyObject **second); // C/C++ 指针版 swap
综上, java 中的方法参数:
- 不能修改一个基本数据类型的参数(即数值型或布尔型);
- 可以改变一个对象参数的状态;
- 不能让对象参数引用一个新的对象.
java 方法传参方式: 按值调用的更多相关文章
- 再谈Java方法传参那些事
把一个变量带进一个方法,该方法执行结束后,它的值有时会改变,有时不会改变.一开始会觉得--“好神奇呀”.当我们了解java内存分析的知识后,一切都是那么简单明了了--“哦,这么回事呀”.但是今天的上机 ...
- java 线程传参 方式
第一类:主动向线程传参 public class ThreadTest extends Thread { public ThreadTest() { } /** * 第一种通过构造方法来传递参数 ...
- Java Mybatis 传参方式
一.单个参数: public List<XXBean> getXXBeanList(String xxCode); <select id="getXXXBeanList&q ...
- Java方法传参,测试在方法内部改变参数内容是否会影响到原值
我分了三种类型的参数进行测试 一.基本类型 public static void main(String[] args) { System.out.println("验证基本类型int作为参 ...
- Java方法传参的问题
1.基本数据类型(byte,short,int,long,float,double,boolean,char)的值传递,不改变其值 2.引用数据类型的值传递,改变其值 3.String类型虽然是引用数 ...
- 浅谈对java中传参问题的理解
之前用的c/c++比较多,在c/c++中对于传参类型,无外乎就是传值.传引用.传指针这几种.但在java中,由于没有指针类型,其传参的方式也发生了相应的变化.在网上找了找,按我之前的理解,java中传 ...
- java 传参方式--值传递还是引用传递
java 传参方式--值传递还是引用传递 参数是按值而不是按引用传递的说明 Java 应用程序有且仅有的一种参数传递机制,即按值传递.写它是为了揭穿普遍存在的一种神话,即认为 Java 应用程序按引用 ...
- Java 常用类库一,main方法传参String[] args;获取输入Scanner ;hasNext();hasNextInt()
1. main方法传参 package com.zmd.common_class_libraries; /** 给mian方法传参测试 */ public class MainArgsTest { p ...
- java的方法传参,最容易混淆的问题!!!
参数传递 参数传递,可以理解当我们要调用一个方法时,我们会把指定的数值,传递给方法中的参数,这样方法中的参数就拥有了这个指定的值,可以使用该值,在方法中运算了.这种传递方式,我们称为参数传递. 在这里 ...
随机推荐
- rtsp 学习
1.1. RTSP协议简介 一种应用层协议,可基于tcp或udp协议. Real Time Streaming Protocol或者RTSP(实时流媒体协议),是由Real network 和 N ...
- 使用 mybatis和oracle 数据库出现的问题
mybatis 官网教程 http://www.mybatis.org/mybatis-3/zh/dynamic-sql.html 出现 Could not set parameters for ma ...
- linux+win7双系统重装win7修复grub的办法
本人是debian+win7的双系统, 下面介绍下重装win7的整个过程以及遇到的一些小问题,在查阅相关博客和朋友的帮助下成功修复, 记录下以便以后有不时之需, 也希望能帮助到遇到同样问题的朋友! 首 ...
- 使用graphql和apollo client构建react web应用
graphql是一种用于 API 的查询语言(摘自官网). 我们为什么要用graphql? 相信大家在开发web应用的时候常常会遇到以下这些问题:后端更新了接口却没有通知前端,从而导致各种报错:后端修 ...
- radio和label关联问题,点击label改变颜色
$(function () { $("#fangan :radio[name='price']").bind('click', function (event) { //$(thi ...
- 「转」基于Jmeter和Jenkins搭建性能测试框架
搭建这个性能测试框架是希望能够让每个人(开发人员.测试人员)都能快速的进行性能测试,而不需要关注性能测试环境搭建过程.因为,往往配置一个性能环境可能需要很长的时间. 1.性能测试流程 该性能测试框架工 ...
- 2018 ACM-ICPC 南京网络赛
Problem A Problem B Problem C Problem D Problem E Problem F Problem G Problem H Problem I Problem J ...
- 微信小程序开发教程(二)创建第一个微信小程序
在安装完“微信Web开发者工具”之后,通过开发者的微信扫码进入后,如图. 点击“添加项目”,填入之前获得的AppID(无AppID可忽略),输入项目名称“Hello WXapplet”,选定本地文件夹 ...
- [Contest20180415]看无可看
题意:有一个数列$f$,对$\forall i\geq2,f_i=2f_{i-1}+3f_{i-2}$,给定$f_0,f_1$,再给定一个集合$S=\{a_{1\cdots n}\}$和$k$,求$\ ...
- 【2-SAT】URAL - 2089 - Experienced coach
题意:给出n对点a,b 要求从没对点中选出一个,且最终选出的点n个数不能存在相同的.输入数据满足每种数最多出现3次,最少出现1次 思路:第i对点的编号2*i, 2*i+1, 因为每个数最多出现3 ...