美文网首页
java中函数是值传递还是引用传递

java中函数是值传递还是引用传递

作者: HungerDeng | 来源:发表于2018-10-10 17:41 被阅读0次

1. 参数为基础数据类型时

    public static void main(String[] args) {
        int a=5;
        changeA(a);
        System.out.println("after changeB a: "+a);
        System.out.println("----------------------");

        Integer b=new Integer(5);
        changeB(b);
        System.out.println("after changeB b: "+b);
    }

    static void changeA(int a){
        a=100;
        System.out.println("in changeA a: "+a);
    }

    static void changeB(Integer b){
        b=100;
        System.out.println("in changeB b: "+b);
    }

//log
in changeA a: 100
after changeB a: 5
----------------------
in changeB b: 100
after changeB b: 5

函数参数相当于函数内部局部变量,当参数为基础数据类型时,为内部局部变量赋值,所以内外变量本质上并不是同一个变量,只是数值相同。

2. 参数为对象类型时

/**
 * 功能:验证Java中函数是值传递还是引用传递
 */
public class ParameterPassingText {

    static class Cat {

        public String name;
        public Cat(String name) {
            this.name = name;
        }

        @Override
        public String toString() {
            return super.toString() + name;
        }
    }

    public static void main(String[] args) {
        Cat cat = new Cat("白猫");
        System.out.println("before change0: "+cat.toString());
        change0(cat);
        System.out.println("after change0: "+cat.toString());

        System.out.println("======================================================================");

        cat = new Cat("白猫");
        System.out.println("before change1: "+cat.toString());
        change1(cat);
        System.out.println("after change1: "+cat.toString());
    }

    private static void change0(Cat cat) {
        cat.name = "黑猫";
        System.out.println("on change0: "+cat.toString());
    }
    
    private static void change1(Cat cat) {
        cat=new Cat("黑猫");
        System.out.println("on change1: "+cat.toString());
    }
}

打印的Log如下:

before change0: base_knowledge.ParameterPassingText$Cat@7ea987ac白猫
on change0: base_knowledge.ParameterPassingText$Cat@7ea987ac黑猫
after change0: base_knowledge.ParameterPassingText$Cat@7ea987ac黑猫
======================================================================
before change1: base_knowledge.ParameterPassingText$Cat@12a3a380白猫
on change1: base_knowledge.ParameterPassingText$Cat@29453f44黑猫
after change1: base_knowledge.ParameterPassingText$Cat@12a3a380白猫

其实,函数的参数相当于函数内部的局部变量

2.1 change0分析

change0分析
外部引用cat指向地址为7ea987ac的对象。当把外部cat作为参数传入change0时,外部cat指向的地址会被赋值给函数的局部引用cat,所以内外两个cat指向同一地址,即同一对象。change0内改变内部cat的属性本质上也是改变地址为7ea987ac的Cat对象的属性,所以会影响外部cat的属性。

2.2 change1分析

change1分析

把外部cat作为参数传入change1时,主要分成两个步骤:

  1. 外部cat指向的地址会被赋值给函数的局部引用cat
  2. 局部引用cat重新赋值,指向地址为29453f44的另一个Cat对象

所以,在change1内部局部引用cat指向的对象和外部cat并不指向同一对象

综上所述,可以总结为:

  1. 函数的参数相当于函数内部的局部变量
  2. 引用参数传递时,会先把 外部引用指向的地址 赋值给 函数内部的局部变量指向的地址,即外部传值给这个参数实际上就是改变这个参数所指向的内存地址

相关文章

  • [译] Java 值传递 VS 引用传递

    Java是值传递还是引用传递一直都有争论,我们最终下个结论,Java是值传递而不是引用传递。如果Java是引用传递...

  • JAVA是按值传递还是按引用传递

    java中对象作为参数传递给一个方法,到底是值传递,还是引用传递? String和int参数传递是按值传递还是引用...

  • java中函数是值传递还是引用传递

    1. 参数为基础数据类型时 函数参数相当于函数内部局部变量,当参数为基础数据类型时,为内部局部变量赋值,所以内外变...

  • Java的引用

    参考链接: Java到底是值传递还是引用传递 Java的四种引用方式 Java中的强引用、软引用、弱引用和虚引用 ...

  • Java 与值传递

    问: 什么是值传递?什么是引用传递?为什么说 Java 中只有值传递? 一、值传递与引用传递 实参与形参: 实际参...

  • Python初学者笔记(八):函数参数的值传递和引用传递

    函数参数的值传递和引用传递 像我们最熟悉的 C 语言,再写函数参数的同时需要规定函数参数到底是值传递还是引用传递。...

  • Java 参数的传递

    Java 的参数是值传递,不是引用传递 Java 中只有值传递,方法按值调用(call by value)。也就是...

  • 聊聊Java内部类

    一.磨叽磨叽Java值传递与引用传递 “在Java里面参数传递都是按值传递”即:按值传递是传递的值的拷贝,按引用传...

  • 快速区别值传递和引用传递

    复习Java知识的时候又看到值传递和引用传递的区别,然后就查询一下,结果都是Java到底是值传递还是引用传递之争,...

  • java的String值传递还是引用传递

    java值传递还是引用传递 一般可以这样认为基础类型是值传递,而对象封装是引用传递 对于test。传入对象,以后都...

网友评论

      本文标题:java中函数是值传递还是引用传递

      本文链接:https://www.haomeiwen.com/subject/utddvftx.html