Java基础之值传递
一、传递类型
我们从c语言开始学习程序设计语言时就知道,参数的传递类型一般有两种:值传递和引用传递。那么什么是值传递什么是引用传递呢? 值传递:指在调用方法时将实际参数的值拷贝一份传递给方法,这样方法在修改参数的值时就不会影响到实际的值。 引用传递:指将实际参数的引用地址直接传递给方法中,这样在方法中如果通过该地址修改数据会影响到实际地址的值。 值传递和引用传递最大区别在于是否进行了拷贝。显而易见,如果没有进行拷贝则方法中对参数的操作肯定会影响到实际的值;但是进行了拷贝就一定不会影响实际值了吗? 接下来就要说说Java中的传递机制了。
二、Java传递机制
Java中普通数据类型的传递机制是值传递。下面我们通过几段代码进行说明。
package com.ring2.parameter;
public class ValueTransfer {
private static int i = 5;
public static void test(int j) {
j = 10;
System.out.println("j = "+j);
}
public static void main(String[] args) {
ValueTransfer.test(i);
System.out.println("i = " +i);
}
}
下面是运行结果:

从结果上可以看出在对基本数据类型进行操作测试时是没有影响到实际的值的,故这里采用了值传递的机制。下面我们再看看传递引用类型会是什么结果:
package com.ring2.parameter;
public class ReferenceTransfer {
public static void test(Ring2 ring2) {
ring2.setName("ring3");
}
public static void main(String[] args) {
Ring2 ring2 = new Ring2();
System.out.println(ring2.getName());
ReferenceTransfer.test(ring2);
System.out.println(ring2.getName());
}
}
class Ring2 {
private String name = "ring2";
public void setName(String name) {
this.name = name;
}
public String getName() {
return this.name;
}
}
以下是运行结果:

可以看到,这里通过传递的参数改变了实际地址的值。那么Java到底是怎样的传递机制呢?是基本数据类型进行值传递,引用类型进行过引用传递吗?接下来我们再看看下一个例子就知道了:
package com.ring2.parameter;
public class ReferenceTransfer {
public static void test(Ring2 ring2) {
ring2 = new Ring2(); //仅仅多出了这一行
ring2.setName("ring3");
}
public static void main(String[] args) {
Ring2 ring2 = new Ring2();
System.out.println(ring2.getName());
ReferenceTransfer.test(ring2);
System.out.println(ring2.getName());
}
}
class Ring2 {
private String name = "ring2";
public void setName(String name) {
this.name = name;
}
public String getName() {
return this.name;
}
}

这段代码和上一段相比仅仅是加了一行代码,ring2 = new Ring2(); 那么这一行代码能说明什么问题呢? 我们可以这样思考,如果Java采用的是基本类型值传递,引用类型引用传递;那么这时应该采用的是引用传递,引用传递不拷贝值,那么执行 ring2 = new Ring2() 这段代码,会把ring2重新引用到堆中新创建的Ring2类型的对象引用。那么就应该改变name为ring3,而结果却不是这样的,结果显示还是为ring2。 下面我来说说为什么如此: Java中采用的是值传递机制,会将实参的值拷贝一份给方法,而实参类型如果是引用类型同样也会拷贝实参的引用地址到方法中。所以说,Java中其实还是值传递的,只不过对于对象参数,值的内容是对象的引用。
总结:
首先Java中所采用的方法传递机制为:值传递
无论方法的形参中是基本数据类型还是引用类型,都会在调用方法时将实参的值拷贝一份给形参。
而区别在于基本数据类型是将值拷贝一份,在方法体内修改不会影响实参的值;而将引用类型的值是将引用进行拷贝,我们知道引用是指向的堆空间中的对象,通过这个引用我们可以修改对象中的属性如:person.age = 5;则person的年龄就变成了5,但是如果像这样:person = new Person();则是新建一个Persion对象,然后将Person对象的地址赋值给拷贝而来的person引用。同理:如果做过一些笔试题则会看到如果将String、Integer等这样的引用类型在方法体内做了改变如:str = “hello”;实参中的str并不会改变。这是因为这种做法相当于person = new Person()
; 会将“hello”字符串指向形参中的str。没错:这也是一个赋值语句,将右边的“hello"字符串赋值给”复制“来的str引用。所以实参中的str并不会改变。
Java基础之值传递的更多相关文章
- JAVA中只有值传递
今天,我在一本面试书上看到了关于java的一个参数传递的问题: 写道 java中对象作为参数传递给一个方法,到底是值传递,还是引用传递? 我毫无疑问的回答:“引用传递!”,并且还觉得自己对java的这 ...
- 死磕面试系列,Java到底是值传递还是引用传递?
Java到底是值传递还是引用传递? 这虽然是一个老生常谈的问题,但是对于没有深入研究过这块,或者Java基础不牢的同学,还是很难回答得让人满意. 可能很多同学能够很轻松的背出JVM.分布式事务.高并发 ...
- Java 中的值传递和参数传递
Java中没有指针,所以也没有引用传递了,仅仅有值传递不过可以通过对象的方式来实现引用传递 类似java没有多继承 但可以用多次implements 接口实现多继承的功能 值传递:方法调用时,实际参数 ...
- Java中的值传递和引用传递
这几天一直再纠结这个问题,今天看了这篇文章有点思路了,这跟C++里函数参数为引用.指针还是有很大区别. 当一个对象被当作参数传递到一个方法后,此方法可改变这个对象的属性,并可返回变化后的结果,那么这里 ...
- java是通过值传递,也就是通过拷贝传递——通过方法操作不同类型的变量加深理解(勿删)
head first java里写到“java是通过值传递的,也就是通过拷贝传递”,由此得出结论,方法无法改变调用方传入的参数.该怎么理解呢? 看例子: public class Test1 { pu ...
- Java中的值传递
1.先比较下字符串的比较 == 代表全等于 值和地址(存放地址) 全部相等于. equals 值等于== 和 equals的区别 列如下面的 如果name1==name2是等于的 然而name1==n ...
- 为什么说Java中只有值传递
本文转载自公众号 Hollis 对于初学者来说,要想把这个问题回答正确,是比较难的.在第二天整理答案的时候,我发现我竟然无法通过简单的语言把这个事情描述的很容易理解,遗憾的是,我也没有在网上找到哪篇文 ...
- 一道笔试题来理顺Java中的值传递和引用传递
题目如下: private static void change(StringBuffer str11, StringBuffer str12) { str12 = str11; str11 = ...
- java中的值传递和引用传递有什么区别呀?
值传递: (形式参数类型是基本数据类型和String):方法调用时,实际参数把它的值传递给对应的形式参数,形式参数只是用实际参数的值初始化自己的存储单元内容,是两个不同的存储单元,所以方法执行中形式参 ...
随机推荐
- NTSTATUS code 和 Windows 系统错误码 的对应关系
出处:https://github.com/dokan-dev/dokany/blob/master/dokan/ntstatus.i case EPT_S_CANT_CREATE: return E ...
- Docker网络与存储(三)
Docker的网络和存储 1.1 Docker的4种网络模式 host模式,使用--net=host指定. container模式,使用--net=container:NAME_or_ID指定. no ...
- 虚拟化KVM之概述(一)
云计算基本概述 云计算是一种按使用量付费的模式,这种模式提供可用的.便捷的.按需的网络访问,进入可配置的计算资源共享池(资源包括网络,服务器,存储,应用程序,服务),这些资源能够被快速提供,只需投入很 ...
- CtsVerifier-Bluetooth-LE-SEcure-ClientServer-Test测试pass但是无法选择passbutton
[问题描述] CtsVerifier-Bluetooth-LE-SEcure-ClientServer-Test测试pass但是无法选择Pass-Button 工具版本:9.0-r11 其他信息: 上 ...
- 【Linux删除问题】Operation not permitted
问题:删除某文件出现cannot remove 'XXX': Operation not permitted 查看问题: 1. lsattr 查看隐藏属性 [root@oldboy oldboy]# ...
- SDN 是什么
SDN,Software Defined Network,软件定义(的)网络,这些年方兴未艾,愈演愈烈.但是,笔者以为,SDN 也有愈演愈劣的趋势.而且,现在业界关于什么叫 SDN,也是众说纷坛,莫衷 ...
- JVM调优:GC 参数
2019独角兽企业重金招聘Python工程师标准>>> JVM调优:GC 参数 博客分类: java jvm 参考: <Memory Management in the Jav ...
- UVA-2【NOI2014】起床困难综合症
#2. [NOI2014]起床困难综合症 21 世纪,许多人得了一种奇怪的病:起床困难综合症,其临床表现为:起床难,起床后精神不佳.作为一名青春阳光好少年,atm 一直坚持与起床困难综合症作斗争.通过 ...
- MySQL 增删改查(单表)
1.sql 新增语句 表中插入数据 insert into + 表名 values(字段1value1,字段2value1,字段3value1),(字段1value2,字段2value2,字段3val ...
- VMware的安装与部署Linux系统
首先我们需要准备好我们将会用到的东西:VMware12.RHEL7.0 网址我就不放了,大家自行百度哟. 一.安装VMware 我们需要安装VMware ...