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是值传递还是引用传递的问题的更多相关文章

  1. Java中引用类型变量,对象,值类型,值传递,引用传递 区别与定义

    一.Java中什么叫做引用类型变量?引用:就是按内存地址查询       比如:String s = new String();这个其实是在栈内存里分配一块内存空间为s,在堆内存里new了一个Stri ...

  2. java中值传递和引用传递

    最近工作中使用到了值传递和引用传递,但是有点懵,现在看了下面的文章后清晰多了.一下是文章(网摘) 1:按值传递是什么 指的是在方法调用时,传递的参数是按值的拷贝传递.示例如下: public clas ...

  3. Java中的值传递和引用传递

    这几天一直再纠结这个问题,今天看了这篇文章有点思路了,这跟C++里函数参数为引用.指针还是有很大区别. 当一个对象被当作参数传递到一个方法后,此方法可改变这个对象的属性,并可返回变化后的结果,那么这里 ...

  4. java的值传递和引用传递

    昨天博主在对于值传递和引用传递这里栽了一个大坑啊,导致一下午时间都浪费在这里,我们先说下值传递和引用传递java官方解释: 值传递:(形式参数类型是基本数据类型):方法调用时,实际参数把它的值传递给对 ...

  5. java中方法的参数传递机制(值传递还是引用传递)

    看到一个java面试题: 问:当一个对象被当作参数传递到一个方法后,此方法可改变这个对象的属性,并可返回变化后的结果,那么这里到底是值传递还是引用传递?  答:是值传递.Java 编程语言只有值传递参 ...

  6. java 对象传递 是 值传递 还是 引用传递?

    这个问题说实话我感觉没有太大的意义. 按第一印象和c++的一些思想去理解的话对象传递是引用传递,因为传递过去的对象的值能被改变. 但是又有很多人,不知道从哪里扣出来一句,java中只有值传递,没有引用 ...

  7. java参数传递时到底是值传递还是引用传递

    java参数传递时到底是值传递还是引用传递(baidu搜集) 问”,很多人的BLOG里都引用这些面试题,最近因为工作内容比较枯燥,也来看看这些试题以调节一下口味,其中有一道题让我很费解. 原题是:当一 ...

  8. Java面向对象-方法的值传递和引用传递

    Java面向对象-方法的值传递和引用传递 0 发布时间:『 2016-08-21 14:21』  博客类别:Java核心基础  阅读(197) 评论(0) Java面向对象-方法的值传递和引用传递 方 ...

  9. Does Java pass by reference or pass by value?(Java是值传递还是引用传递) - 总结

    这个话题一直是Java程序员的一个热议话题,争论不断,但是不论是你百度搜也好还是去看官方的文档中所标明的也好,得到的都只有一个结论:Java只有值传递. 在这里就不贴代码细致解释了,让我们来看看一些论 ...

  10. Java值传递和引用传递

    Java总是在讨论是传递还是引用传递,Java没有像C语言那样拥有指针,在看到引用传递和值传递很多的解释之后,更相信引用传递和值传递归根到底都是值传递,只不过引用传递的时候看上去很高大上,其实是把变量 ...

随机推荐

  1. npm start时报错 npm ERR!Windows_NT 6.1.7601

    练习webpack 时 输入 npm start就报这样的错.百度了一圈,都没有找到答案.于是,我开始看错误信息......................................../手动黑 ...

  2. ava Maven项目之Nexus私服搭建和版本管理应用

    目录: Nexus介绍 环境.软件准备 Nexus服务搭建 Java Maven项目版本管理应用 FAQ 1.Nexus介绍 Nexus是一个强大的Maven仓库管理器,它极大地简化了自己内部仓库的维 ...

  3. [Swift]数学库函数math.h | math.h -- mathematical library function

    常用数学函数 1. 三角函数 double sin (double);//正弦 double cos (double);//余弦 double tan (double);//正切 2 .反三角函数 d ...

  4. (转)使用VS实现XML2CS

    转自 StackOverFlow Method 1 XSD tool Suppose that you have your XML file in this location C:\path\to\x ...

  5. String 源码浅析————终结篇

    写在前面 说说这几天看源码的感受吧,其实 jdk 中的源码设计是最值得进阶学习的地方.我们在对 api 较为熟悉之后,完全可以去尝试阅读一些 jdk 源码,打开 jdk 源码后,如果你英文能力稍微过得 ...

  6. centos启动错误:Inodes that were part of a corrupted orphan linked list found.

    centos启动时,提示错误: /dev/mapper/VolGroup-lv_root contains a file system with errors,check forced. /dev/m ...

  7. mysql 查询小技巧

    数据字段中存放的是id集,形如  1,2,15,35   也可类推json格式 查询时不用拆分了, 用上 instr.concat搜索和连接字符串 查询fids中包含15的 select * from ...

  8. linux下线程的分离和结合属性

    在任何一个时间点上,线程是可结合的(joinable),或者是分离的(detached).一个可结合的线程能够被其他线程收回其资源和杀死:在被其他线程回收之前,它的存储器资源(如栈)是不释放的.相反, ...

  9. go 语言学习 1

    Go语言命名 Go语言关键字 1.Go语言有25个关键字: 2.关键字用途: var :用于变量的声明const :用于常量的声明type :用于声明类型func :用于声明函数和方法package ...

  10. AI简单平移追踪算法

    1.比较坐标追踪法 追踪者会不停地比较自身和目标的x坐标和y坐标,每x和y上一个单位的移动为一个周期,该算法虽然简单好用,但实用性差且不智能化,如果追踪者数量增加,路线会显得单调,由于都是先走个对角线 ...