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的方法传参,最容易混淆的问题!!!
参数传递 参数传递,可以理解当我们要调用一个方法时,我们会把指定的数值,传递给方法中的参数,这样方法中的参数就拥有了这个指定的值,可以使用该值,在方法中运算了.这种传递方式,我们称为参数传递. 在这里 ...
随机推荐
- mkdir 创建目录
短选项 长选项 含义 -m <目录属性> --mode <目录属性> 建立目录时同时设置目录的权限. -p --parents 此选项后,可以是一个路径名称.若路径中的某些目录 ...
- 如何通过chrome的开发者工具查找新浪评论数据在哪个文件
1.打开开发者工具(ctrl+shift+i) 2.打开搜索(Esc) 示例:http://comment5.news.sina.com.cn/page/info?format=js&chan ...
- sqlldr Field in data file exceeds maximum length "
使用sqlldr导数时出现如下错误: " Record 1: Rejected - Error on table PC_PLANNAME, column PLANNAME.Field in ...
- 【分块】【哈希】bzoj3578 GTY的人类基因组计划2
每个房间用一个集合来维护,具体来说,就是给1-n的数每个数一个long long的hash值,往集合S里insert(i),就是S^=HASH[i]:erase(i),也是S^=HASH[i]. 用m ...
- python3 开发面试题(生成列表)6.1
话不多说直接上题: 生成如下列表: [[0, 0, 0, 0, 0], [0, 1, 2, 3, 4], [0, 2, 4, 6, 8], [0, 3, 6, 9, 12]] # 方式一 list1 ...
- CentOS正确关机方法(转)
CentOS正确关机方法 1关机前准备 1.1观察系统使用状态 · 谁在线:who · 联网状态:netstat -a · 后台执行的程序:ps -au ...
- Scala实战高手****第11课:Scala面向接口彻底实战和Spark源码鉴赏
第一点: scala的接口trait中所有方法可以都被实现!! 这种情况一般会是一种工具方法的集合,例如接口 Logging! scala 多种继承用extends ... with .... 在老 ...
- Jetty错误:java.lang.IllegalStateException: Form too large 270468>200000的问题解决
说明: 1.200000单位为byte,并不是2MB,而是200KB,换算参考:https://calc.itzmx.com/ 2.这个是表单提交后长度超过了200KB造成的,除了表单Form,还有U ...
- 使用layer.js注意事项
一.使用时,将layer整个文件夹放置你站点的任何一个目录,layer.js 开发版,layer.min.js 压缩版,引入其中一个即可.css等其它文件无需引入. 二.如果您的js引入是通过合并处理 ...
- 集群Cluster介绍
来源:http://www.ibm.com/developerworks/cn/linux/cluster/lw-clustering.html简单的说,集群(cluster)就是一组计算机,它们作为 ...