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

时间:2022-05-23 01:05:51

  最近去面试,有一个面试官问到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

随机推荐

  1. Retina视网膜屏中CSS3边框图片像素虚边的问题

    虽然CSS3新增了这个功能,但是在W3school里面并没有给出具体详细的解释,还好网上不乏大神给你我们很全面的解释其中的原理-css3:border-image边框图像详解 边框图片的原理是四个角不 ...

  2. Webpack 傻瓜式指南(一)

    modules with dependencies   webpack   module bundler   static  assetss   .js .js .png Webpack傻瓜式指南 n ...

  3. Java EE基础之JSP(三)

         原来准备简单点,用一篇文章介绍完JSP的,没想到细节很多.这是第三篇也是最后一篇,这三篇文章介绍了基本的JSP知识,很多名词概念和用法,一定要在实践项目中使用之后才会有更加亲切的体会.第三篇 ...

  4. git日常使用经验积累

    1 git merge origin/develop 将远程分支合并到本地,一般先执行合并,解决冲突,然后再git commit合入新建的分支,推送到远程分支里面,最后码云上找pl pull requ ...

  5. icpc南宁站赛后总结

    11月24号,我们经过26个小时的火车来到了广西南宁,一场漫长的过程. 24号晚到达南宁,做地铁到达学校,找到住的地方,南宁的天真是让人无奈. 25号,上午去广西大学体育馆报道,然后回去好好整理了一下 ...

  6. Highcharts 使用

    官网:https://www.hcharts.cn/ api:https://api.hcharts.cn/highcharts 效果 html代码 <div id="containe ...

  7. Jasperreport5&period;6&period;9-----2

    Jasperreport5.6.0生成PDF   上一篇讲的是jasperreport5.6.0生成pdf,运行后可以生成pdf,可是和我们的需求有点差距,我们是要求生成后,可以直接打开或保存,这就需 ...

  8. SDN2017 第四次作业

    1.阅读 了解SDN控制器的发展 http://www.sdnlab.com/13306.html http://www.docin.com/p-1536626509.html 了解ryu控制器 ht ...

  9. CocoaPods 遇到 A host target is a &quot&semi;parent&quot&semi; target which embeds a &quot&semi;child&quot&semi; target 问题解决

    正在开发的项目中,集成RN,在使用cocoapods 时候,pod install 遇到如下问题: [!] Unable to find host target(s) for ****Extensio ...

  10. Elasticsearch之集群脑裂

    https://www.cnblogs.com/zlslch/p/6477312.html