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):方法调用时,实际参数把它的值传递给对应的形式参数,形式参数只是用实际参数的值初始化自己的存储单元内容,是两个不同的存储单元,所以方法执行中形式参 ...
随机推荐
- 4、flink自定义source、sink
一.Source 代码地址:https://gitee.com/nltxwz_xxd/abc_bigdata 1.1.flink内置数据源 1.基于文件 env.readTextFile(" ...
- MAC地址欺骗(原理及实验)
MAC地址欺骗 MAC地址欺骗(或MAC地址盗用)通常用于突破基于MAC地址的局域网访问控制,例如在交换机上限定只转发源MAC地址修改为某个存在于访问列表中的MAC地址即可突破该访问限制,而且这种修改 ...
- Linux安全实验缓冲区溢出
缓冲区溢出实验: 缓冲区溢出是指程序试图向缓冲区写入超出预分配固定长度数据的情况.这一漏洞可以被恶意用户利用来改变程序的流控制,甚至执行代码的任意片段.这一漏洞的出现是由于数据缓冲器和返回地址的暂时关 ...
- 任意文件下载(pikachu)
任意文件下载漏洞 很多网站都会提供文件下载功能,即用户可以通过点击下载链接,下载到链接所对应的文件. 但是,如果文件下载功能设计不当,则可能导致攻击者可以通过构造文件路径,从而获取到后台服务器上的其他 ...
- Spring5参考指南:Bean的创建
文章目录 Spring容器中的Bean Bean的命名 Bean的实例化 Spring容器中的Bean Bean在Spring中就是一个业务组件,我们通过创建各种Bean来完成最终的业务逻辑功能. 在 ...
- 【JAVA基础】07 面向对象2
1. 代码块的概述和分类 面试的时候会问,开发不用或者很少用 代码块概述 在Java中,使用 {} 括起来的代码被称为代码块. 代码块分类 根据其位置和声明的不同,可以分为局部代码块,构造代码块,静态 ...
- android开发之自定义View 详解 资料整理 小冰原创整理,原创作品。
2019独角兽企业重金招聘Python工程师标准>>> /** * 作者:David Zheng on 2015/11/7 15:38 * * 网站:http://www.93sec ...
- 蚂蚁金服合作的RISE实验室到底有多牛?
近日,蚂蚁金服与美国加州伯克利大学近期新成立的RISE实验室达成合作意向.RISE实验室的前身是著名伯克利AMP实验室,主导研发了当今大数据计算领域最前沿的开源系统:Apache Spark.Apac ...
- #Week7 Neural Networks : Learning
一.Cost Function and Backpropagation 神经网络的损失函数: \[J(\Theta) = - \frac{1}{m} \sum_{i=1}^m \sum_{k=1}^K ...
- C语言编程入门题目--No.8
题目:输出9*9口诀. 1.程序分析:分行与列考虑,共9行9列,i控制行,j控制列. 2.程序源代码: #include "stdio.h" main() { int i,j,re ...