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):方法调用时,实际参数把它的值传递给对应的形式参数,形式参数只是用实际参数的值初始化自己的存储单元内容,是两个不同的存储单元,所以方法执行中形式参 ...
随机推荐
- php表格--大数据处理
参考来源1:https://blog.csdn.net/tim_phper/article/details/77581071 参考来源2:https://blog.csdn.net/qq_376822 ...
- 作业九——DFA最小化,语法分析初步
- myod实验(选做)
myod实验 实验任务 1 复习c文件处理内容 2 编写myod.c 用myod XXX实现Linux下od -tx -tc XXX的功能 main与其他分开,制作静态库和动态库 编写Makefile ...
- Tomcat系列教材 (一)- 教程
Tomcat系列教材 (一)- 教程 Tomcat是常见的免费的web服务器. Tomcat 这个名字的来历,Tomcat是一种野外的猫科动物,不依赖人类,独立生活. Tomcat的作者,取这个名字的 ...
- 汉字编码对照表(gb2312/Big5/GB2312)
一.汉字编码的种类 1.GB2312又称国标码,由国家标准总局发布,1981年5月1日实施,通行于大陆.新加坡等地也使用此编码.它是一个简化字的编码规范,当然也包括其他的符号.字母.日文假名等,共74 ...
- 深入认识CSS的块级元素
2019独角兽企业重金招聘Python工程师标准>>> 块级元素: 显示在一块内,会自动换行,元素会从上到下垂直排列,各自占一行.每个块级元素默认占一行高度,一行内添加一个块级元素后 ...
- LNMP企业应用部署全过程(基于DEDE后台)
系统环境说明: os:centos 5.6 nginx:nginx-1.0.11 php:php-5.3.9 mysql:mysql-5.5.20 文档导读: 一 准备工作 二 基础软件包安装 三 安 ...
- 解决Visual Studio (VS) 插件下载缓慢
1.关闭IPV6协议 因为如果都支持IPV6协议,会自动使用IPV6下载扩展. 因为IPV6还没有建立完善,所以可能会比较慢. 百度经验:怎样关闭IPV6协议 2.给IPV6添加DNS 百度: 240 ...
- 别了,JavaScript;你好,Blazor
Web开发与JavaScript开发向来是同义词.直到WebAssembly的横空出世,WebAssembly (Wasm)是一种在浏览器中可以执行的二进制指令. WebAssembly 的 官方工具 ...
- Mysql 远程连接错误排查
1. 测试本地与远程服务器端口能否连通 telnet 远程IP 端口号 telnet 192.168.1.1 3306 2.如果是在aliyun或者aws云服务器上自建数据库 2.1 在安全组里开 ...