关于JAVA是值传递还是引用传递的问题
1.概念
值传递:方法调用时,实际传入的是它的副本,在方法中对值的修改,不影响调用者的值。
引用传递:方法调用时,实际传入的是参数的实际内存地址,调用者和调用方法所操作的参数都指向同一内存地址,所以方法中操作会影响调用者。
2.问题
① 值传递传入的值,是它的副本是什么意思?
public static void main(String[] args) {
int a = 0;
testValue(a);
System.out.println(a);
}
public void testValue(int a) {
a = 8;
}
打印结果: 0
此处调用方法后,a的值依然没有变化。
②当传入的值是一个对象时,也不会发生变化么?
package com.test;
public class TestDemo {
public static void main(String[] args) {
TestDemo2 testDemo2 = new TestDemo2();
System.out.println("调用前:" + testDemo2.hashCode());
testValue(testDemo2);
System.out.println("调用后:" + testDemo2.hashCode());
}
public static void testValue(TestDemo2 testDemo) {
testDemo = new TestDemo2();
}
}
class TestDemo2 {
int age = 1;
}
打印结果:
调用前:366712642
调用后:366712642
这里可以看到testDemo2 的值依然没有变化,调用前后所指向的内存地址值是一样的。对传入地址值的改变并不会影响原来的参数。
③既然是值传递,为什么参数是引用类型的时候,方法内对对象进行操作会影响原来对象,这真的是值传递么?
package com.test;
public class TestDemo {
public static void main(String[] args) {
TestDemo2 testDemo2 = new TestDemo2();
System.out.println("调用前:" + testDemo2.age);
testValue(testDemo2);
System.out.println("调用后:" + testDemo2.age);
}
public static void testValue(TestDemo2 testDemo) {
testDemo.age = 9;
}
}
class TestDemo2 {
int age = 1;
}
打印结果
调用前:1
调用后:9
对于这种情况的解释是,传入的参数是testDemo2 对象地址值的一个拷贝,但是形参和实参的值都是一样的,都指向同一个对象,所以对象内容的改变会影响到实参。
综上所述:JAVA的参数传递确实是值传递,不管是基本参数类型还是引用类型,形参值的改变都不会影响实参的值。如果是引用类型,形参值所对应的对象内部值的改变
会影响到实参。
如有疑问或写的不恰当的地方欢迎在评论区指出!!
关于JAVA是值传递还是引用传递的问题的更多相关文章
- Java中引用类型变量,对象,值类型,值传递,引用传递 区别与定义
一.Java中什么叫做引用类型变量?引用:就是按内存地址查询 比如:String s = new String();这个其实是在栈内存里分配一块内存空间为s,在堆内存里new了一个Stri ...
- java中值传递和引用传递
最近工作中使用到了值传递和引用传递,但是有点懵,现在看了下面的文章后清晰多了.一下是文章(网摘) 1:按值传递是什么 指的是在方法调用时,传递的参数是按值的拷贝传递.示例如下: public clas ...
- Java中的值传递和引用传递
这几天一直再纠结这个问题,今天看了这篇文章有点思路了,这跟C++里函数参数为引用.指针还是有很大区别. 当一个对象被当作参数传递到一个方法后,此方法可改变这个对象的属性,并可返回变化后的结果,那么这里 ...
- java的值传递和引用传递
昨天博主在对于值传递和引用传递这里栽了一个大坑啊,导致一下午时间都浪费在这里,我们先说下值传递和引用传递java官方解释: 值传递:(形式参数类型是基本数据类型):方法调用时,实际参数把它的值传递给对 ...
- java中方法的参数传递机制(值传递还是引用传递)
看到一个java面试题: 问:当一个对象被当作参数传递到一个方法后,此方法可改变这个对象的属性,并可返回变化后的结果,那么这里到底是值传递还是引用传递? 答:是值传递.Java 编程语言只有值传递参 ...
- java 对象传递 是 值传递 还是 引用传递?
这个问题说实话我感觉没有太大的意义. 按第一印象和c++的一些思想去理解的话对象传递是引用传递,因为传递过去的对象的值能被改变. 但是又有很多人,不知道从哪里扣出来一句,java中只有值传递,没有引用 ...
- java参数传递时到底是值传递还是引用传递
java参数传递时到底是值传递还是引用传递(baidu搜集) 问”,很多人的BLOG里都引用这些面试题,最近因为工作内容比较枯燥,也来看看这些试题以调节一下口味,其中有一道题让我很费解. 原题是:当一 ...
- Java面向对象-方法的值传递和引用传递
Java面向对象-方法的值传递和引用传递 0 发布时间:『 2016-08-21 14:21』 博客类别:Java核心基础 阅读(197) 评论(0) Java面向对象-方法的值传递和引用传递 方 ...
- Does Java pass by reference or pass by value?(Java是值传递还是引用传递) - 总结
这个话题一直是Java程序员的一个热议话题,争论不断,但是不论是你百度搜也好还是去看官方的文档中所标明的也好,得到的都只有一个结论:Java只有值传递. 在这里就不贴代码细致解释了,让我们来看看一些论 ...
- Java值传递和引用传递
Java总是在讨论是传递还是引用传递,Java没有像C语言那样拥有指针,在看到引用传递和值传递很多的解释之后,更相信引用传递和值传递归根到底都是值传递,只不过引用传递的时候看上去很高大上,其实是把变量 ...
随机推荐
- Struts2、SpringMVC、Servlet(Jsp)性能对比 测试
Struts2.SpringMVC.Servlet(Jsp)性能对比 测试 . Servlet的性能应该是最好的,可以做为参考基准,其它测试都要向它看齐,参照它. 做为一个程序员,对于各个框架的性能要 ...
- Swift 函数提前返回
简评:函数提前返回主要的好处是:将每个错误处理进行分离,审查代码时不需要考虑多种复杂异常,我们可以吧注意力集中在也业务逻辑中,调试代码时可以直接在异常中打断点. 提前返回 首先来看一下需要改进的代码示 ...
- select子句排列顺序与聚集函数
selcet 要返回的列或表达式 from 从中检索数据的表 where 行级过滤 group by 分组说明 having 组级过滤 order by 输出排列顺序 ASC正序排 ...
- Es6 类class的关键 super、static、constructor、new.target
ES6引入了Class(类)这个概念,作为对象的模板,通过class关键字,可以定义类.基本上,ES6的class可以看作只是一个语法糖,它的绝大部分功能,ES5都可以做到,新的class写法只是让对 ...
- LCS and LIS
LCS #include<bits/stdc++.h> using namespace std; typedef long long ll; int n,m; char s[1005],t ...
- Linux启动与关闭WIndows服务记录
启动: mono-service -l:/var/run/Myservice-lock.pid MyService.exe (这个-l参数一定要加上) 控制服务: 暂停: kill -USR1 `ca ...
- net与树莓派的情缘(二)
虽然我们可以很方便的通过ssh譬如putty或者vnc连接操控树莓派,但是毕竟树莓派资源没那么高,在上面编程,调试要吃力的多.所以还是想在pc上编程上传到树莓派或者最好,文件共享,可以直接读写共同的文 ...
- DB2 Check Pending Script
转载 http://www.zinox.com/archives/144 Thanks to Max Petrenko of DB2 Toronto Lab for sharing a very us ...
- 【MPI】执行mpiexec出错
运行mpiexec提示mpiexec_mic: cannot connect to local mpd (/tmp/mpd2.console_jzhang); possible causes: 1. ...
- PHP 对字符串 进行填充
1.str_pad — 使用另一个字符串填充字符串为指定长度 . 我觉得str_pad可以满足普通的数字,字符串的简单填充. string str_pad ( string $input , int ...