最近去面试,有一个面试官问到java中参数传递的问题,感觉自己对于这一块还是理解的不够深。今天我们就一起来学习一下Java中的接口和抽象类。下面是本文的目录大纲:

一 . 什么是按值传递,什么是按引用传递

二 . java中的参数传递是按值传递还是按引用传递

三.总结

若有不正之处,请多多谅解并欢迎批评指正,不甚感激。

一 . 什么是按值传递,什么是按引用传递

按值调用(call by value) : 在参数传递过程中,形参和实参占用了两个完全不同的内存空间。形参所存储的内容是实参存储内容的一份拷贝。

按值传递在基本数据类型数据传递中比较好理解,测试代码如下:

public class test {
public static void main(String[] args) {
int age = 0;
System.out.println("before change age="+age);
change(age);
System.out.println("after change age="+age);
} public static void change(int a){
a=20;
}
}

运行结果:

before change age=0
after change age=0

这个结果相信很多朋友已经猜到:因为在main方法中调用change(age)时,真正传递给change方法的参数只是age的一个副本,所以修改这个副本,并不能修改原来age的值。

按引用调用:在参数传递的过程中,形参和实参完全是同一块内存空间,两者不分彼此。

例如:

main()
{
int a=;
func(&a);
printf("%d\n",a);
}
func(int *b)
{
*b=;
}

咳咳,这貌似是C语言的按引用传递。java的安引用传递写不出来。

二. java中的参数传递是按值传递还是按引用传递

在下结论之前,我们还是看一个例子:

public class PassByValue {
private String name; public String getName() {
return name;
} public void setName(String name) {
this.name = name;
} @Override
public String toString() {
return "PassByValue [name=" + name + "]";
} public static void main(String[] args) {
PassByValue myDear = new PassByValue();
myDear.setName("dontKnow");
String mylove ="dontKnow";
int herAge=0;
System.out.println("myDear name="+myDear.getName());
System.out.println("myLove ="+mylove);
System.out.println(herAge);
stringChange(mylove,myDear,herAge);
System.out.println("============================================================");
System.out.println("myDear name="+myDear.getName())
System.out.println(mylove);
     System.out.println(herAge)
      } public static void stringChange(String a,PassByValue b,int age){
a="gaoshan";//这一句相当于a=new String("gaoshan")
b.setName("gaoshan");
     age=20;
} }

运行结果如下:

myDear name=dontKnow
myLove =dontKnow
0
============================================================
myDear name=gaoshan
myLove =dontKnow
0

我们发现,myDear 中的name 属性通过stringChange()方法改变了,myLove的值并没有改变。

这里有一个疑问:myDear和mylove 都是引用数据类型,为什么myDear的属性值会改变,而mylove 没有改变呢?

其实原因在注释中已经说了:在stringChange方法中,a="gaoshan";这一句等价于a=new String("gaoshan"),实际上a作为数据引用发生了改变,指向了一个新的内存地址,而myDear作为数据引用,并没有发生改变,仍然指向main方法中myDear所指向的对象。

三.总结

在java中,不存在按引用调用,因为在参数传递过程中,不管传递的是基本数据类型的变量,还是对象的引用,其实都是传递的一个副本。

在上面的例子中,myDear 所指向的对象之所以会发生改变,是因为在stringChange方法中,通过myDear 的副本b对myDear 所指向的对象进行操作,改变了对象属性,但是

myDear 本身作为对象引用并没有发生改变。而myLove 没有发生改变是因为在stringChange方法中直接改变了myLove 副本a的值,并没有对myLove 所指向的对象进行修改,所以我们看到 main方法中的myLove所指向的对象并没有发生改变

本文参考

java参数传递(超经典):http://blog.sina.com.cn/s/blog_4b622a8e0100c1bo.html

java中的参数传递是按引用传递还是按值传递的更多相关文章

  1. Java中的参数传递 --Java

    1.基本类型传值,对象类型传地址 按值传递:当将一个参数传递给一个方法时,方法接收的是原始值的一个副本.因此,如果方法修改了该参数,仅改变副本,而原始值保持不变. 按引用传递:当将一个参数传递给一个方 ...

  2. java中的参数传递——值传递、引用传递

    参数是按值而不是按引用传递的说明 Java 应用程序有且仅有的一种参数传递机制,即按值传递. 在 Java 应用程序中永远不会传递对象,而只传递对象引用.因此是按引用传递对象.Java 应用程序按引用 ...

  3. java中的参数传递

    Java中只有传值调用(值传递),没有传址调用(址传递或者引用传递).所以在java方法中改变参数的值是不会改变原变量的值的,但为什么改变引用变量的属性值却可以呢?请看下面的解答. java中的数据类 ...

  4. java中参数传递--值传递,引用传递

    java中的参数传递——值传递.引用传递   参数是按值而不是按引用传递的说明 Java 应用程序有且仅有的一种参数传递机制,即按值传递. 在 Java 应用程序中永远不会传递对象,而只传递对象引用. ...

  5. java中方法的参数传递机制

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

  6. 【Java基础】12、java中方法的参数传递机制

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

  7. 如何理解Java中参数传递只能传值?

    以前学习C#的时候,是完全在工作岗位上学习,一些底层较为深入的道理都不是很清楚.如今学习了Java,对于Java参数传递只能传值,不能传引用(指针)感到很困惑,在C#中不是常常说把某个引用传递到函数中 ...

  8. 关于java中是引用传递还是值传递的问题!!!经常在笔试中遇到,今天终于弄明白了!

    关于JAVA中参数传递问题有两种,一种是按值传递(如果是基本类型),另一种是按引用传递(如果是對象).首先以两个例子开始:1)public class Test2 { public static vo ...

  9. 关于java中是引用传递还是值传递的问题

    关于JAVA中参数传递问题有两种,一种是按值传递(如果是基本类型),另一种是按引用传递(如果是對象).首先以两个例子开始:1)public class Test2 { public static vo ...

随机推荐

  1. nginx负载均衡简单配置

    nginx负载均衡简单配置准备三台虚拟机来做这个实验:192.168.232.132        web服务器192.168.232.133        web服务器192.168.232.134 ...

  2. DES对称加密算法简析

    1 对称加密算法 在了解DES算法前,先加单介绍一下对称加密算法,因为DES属于对称加密算法的一种. 对称加密算法是应用较早的加密算法,技术成熟.在对称加密算法中,数据发信方将明文(原始数据)和加密密 ...

  3. ListView ,recycleView列表带进度条

    实现上图功能有两种思路. 一:普通做法,更新item的数据,不停调用notifydatachange ; 二:各管自家刷新. 一个下载对应一个下载线程.线程持有对应item在Listview中的位置. ...

  4. Spring框架——AOP代理

    我们知道AOP代理指的就是设计模式中的代理模式.一种是静态代理,高效,但是代码量偏大:另一种就是动态代理,动态代理又分为SDK下的动态代理,还有CGLIB的动态代理.Spring AOP说是实现了AO ...

  5. MYSQL无法使用索引的场景

    设计优化–无法使用索引的场景 •通过索引扫描的记录数超过30%,变成全表扫描 •联合索引中,第一个索引列使用范围查询--只能用到部分索引 •联合索引中,第一个查询条件不是最左索引列 •模糊查询条件列最 ...

  6. Python中的选择排序

    选择排序 选择排序(Selection sort)是一种简单直观的排序算法.它的工作原理如下.首先在未排序序列中找到最小(大)元素,存放到排序序列的起始位置,然后,再从剩余未排序元素中继续寻找最小(大 ...

  7. 项目实战7—Mysql实现企业级数据库主从复制架构实战

    Mysql实现企业级数据库主从复制架构实战 环境背景:公司规模已经形成,用户数据已成为公司的核心命脉,一次老王一不小心把数据库文件删除,通过mysqldump备份策略恢复用了两个小时,在这两小时中,公 ...

  8. 《Linux命令行与shell脚本编程大全》第二十六章 一些有意思的脚本

    26.1 发送消息 26.1.1 功能分析 1.确定系统中都有谁 $who 给出的信息包括用户名 用户所在终端 用户登入系统的时间 2.启用消息功能 用户可以禁止别人给我发消息,所以需要先检查一下是否 ...

  9. 51Nod 1007 正整数分组 01背包

    将一堆正整数分为2组,要求2组的和相差最小.例如:1 2 3 4 5,将1 2 4分为1组,3 5分为1组,两组和相差1,是所有方案中相差最少的.Input第1行:一个数N,N为正整数的数量.第2 - ...

  10. Go语言教程5 if switch select

    首先您需要有php或是c的基础. 否则可能看不明白 方法如下 if 表达式{ //需要注意的是  没有括号. 没错. 没有括号 比如  if  1>2 {}else{} } else { } s ...