关于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语言那样拥有指针,在看到引用传递和值传递很多的解释之后,更相信引用传递和值传递归根到底都是值传递,只不过引用传递的时候看上去很高大上,其实是把变量 ...
随机推荐
- 【Oracle 12c】最新CUUG OCP-071考试题库(53题)
53.(12-14) choose the best answer: Examine the command to create the BOOKS table. SQL>CREATE TABL ...
- java实际项目中interface和abstract interface 区别
参考:https://zhidao.baidu.com/question/424485344260391052.html 这2种有什么区别,根据实际项目经验 帮我解答下 谢谢啊~~~~~~~~~问题补 ...
- express 直接返回HTML文件
一般情况下用的是模板引擎,如jade: res.render('detail',{ // 使用render() #http://www.expressjs.com.cn/4x/api.html#res ...
- [科普] 借助 everything 扩展教你屏蔽网址或转发网址
教你屏蔽网址或转发网址 万恶之源 为什么写这篇文章,俺觉得大家应该是有这个需(bai)求(du)的.只是不知道如何操作... 一.屏蔽网址 1.借助系统自带防火墙 (不推荐) Linux 下有 ipt ...
- LINUX中软RAID的实现方案
转自linux就该这么学 应用场景 Raid大家都知道是冗余磁盘的意思(Redundant Arrays of Independent Disks,RAID),可以按业务系统的需要提供高可用性和冗余性 ...
- 8102 年的现代 Web 开发最佳实践(笑)
简评:8102 年了,现在 web 开发的最佳实践是什么,让本文来告诉你.原文只提到一部分,可以查看 reddit 上对此文的评论查看补充的最佳实践 https://old.reddit.com/r/ ...
- Python3之urllib模块
简介 urllib是python的一个获取url(Uniform Resource Locators,统一资源定位符),可以用来抓取远程的数据. 常用方法 (1)urlopen urllib.requ ...
- webpack+vue中安装使用vue-layer弹窗插件
1.安装vue-layer插件 npm install vue-layer --save-dev 2.打包入口文件main.js中引入vue.vue-layer.并且将vue-layer添加到vue原 ...
- 最新版IntelliJ IDEA2019.1破解教程(2019.04.08更新)
[原文链接]:https://www.tecchen.xyz/idea-crack.html 我的个人博客:https://www.tecchen.xyz,博文同步发布到博客园. 由于精力有限,对文章 ...
- Python and Bluetooth
环境 Windows7-64bit + Python2.7.15-64bit + Pybluez 安装pybluez时会报错,处理方法~ 1.安装VCForPython27.msi,这是为了提供vis ...