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

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

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

二 . java中的参数传递是按值传递仍是按引用传递面试

三.总结ide

 

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

 

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

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

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

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;
    }
}

运行结果:code

before change age=0
after change age=0htm

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

 

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

例如:

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

 

咳咳,这貌似是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

相关文章
相关标签/搜索