美文网首页Android开发Android技术知识Android开发
Java 参数传递是值传递还是引用传递?

Java 参数传递是值传递还是引用传递?

作者: markRao | 来源:发表于2019-04-27 13:32 被阅读14次

首先把结论表明,Java 的参数传递是值传递,因为有部分细节让人引起误解以为是引用传递,故我们写两个例子来举例探讨。

public class ExampleUnitTest {
    @Test
    public void addition_isCorrect() {
        assertEquals(4, 2 + 2);
        int a = 10;
        System.out.print(a+"\n");
        add(a);
        System.out.print(a+"\n");
    }

    private void add(int b) {
        b = 15;
        System.out.print(b+"\n");
    }
}

控制台输出为

10
15
10

int 属于基本数据类型,我们都知道基本数据类型存储于栈,而它的地址就是值本身,这个例子中我们把 a 的值复制一份传递给 add 方法中,形参 b 被赋值 15,当 add 方法执行完最后一行代码,整个方法栈被回收。

public class ExampleUnitTest {
    @Test
    public void addition_isCorrect() {
        assertEquals(4, 2 + 2);
        Student a = new Student(10, "小明");
        System.out.print("地址为 " + a + "\n age " + a.age + "\n name" + a.name);
        change(a);
        System.out.print("\n地址为 " + a + "\n age " + a.age + "\n name" + a.name);
    }

    private void change(Student b) {
        b.age = 1000;
        b.name = "灭霸";
        Student c = new Student(12, "小黑");
        b = c;
        System.out.print("\n地址为 " + b + "\n age " + b.age + "\n name" + b.name);
    }

    private static class Student {
        private int age;
        private String name;

        public Student(int age, String name) {
            this.age = age;
            this.name = name;
        }

        public int getAge() {
            return age;
        }

        public void setAge(int age) {
            this.age = age;
        }

        public String getName() {
            return name;
        }

        public void setName(String name) {
            this.name = name;
        }
    }
}

控制台输出为

地址为 demo.rzj.com.androiddemo.ExampleUnitTest$Student@1a93a7ca
 age 10
 name小明
地址为 demo.rzj.com.androiddemo.ExampleUnitTest$Student@3d82c5f3
 age 12
 name小黑
地址为 demo.rzj.com.androiddemo.ExampleUnitTest$Student@1a93a7ca
 age 1000
 name灭霸

相信大部分同学对于Java 是值传递最大的疑问就是为什么这个例子中的 Student 实例对象 a 传递到 change 方法中 age 、name 参数被改变了会影响到外面的对象,大家先看一下控制台的输出,当我们对形参 b = c 时,它的内存地址确实是改变了,但是并没有影响到外面的 a 对象的内存地址,这就充分说明了值传递,只不过值得一提的是,这个值传递是复制了一份对象,但是里面的参数所引用的地址指向是一样的,重点理解的是引用数据类型传递的确实是值,但是对象内部的参数指向的是一样的数据。

相关文章

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

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

  • 聊聊Java内部类

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

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

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

  • Java值传递

    “在Java里面参数传递都是按值传递”这句话的意思是:按值传递是传递的值的拷贝,按引用传递其实传递的是引用的地址值...

  • Java 参数的传递

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

  • Java 参数传递是值传递还是引用传递?

    首先把结论表明,Java 的参数传递是值传递,因为有部分细节让人引起误解以为是引用传递,故我们写两个例子来举例探讨...

  • java参数传递是值传递还是引用传递

    首先用三句话来总结,后面再做解释: 1.对象就是传引用,对对象的改变直接是改变的应用指向的对象。方法内对对象的改变...

  • java参数传递是值传递还是引用传递?

    当一个对象被当作参数传递到一个方法后,在此方法内可以改变这个对象的属性,那么这里到底是值传递还是引用传递?答:ja...

  • Go语言学习笔记(三)

    指针 Go的指针不能运算 参数传递 Go的参数传递是值传递(值传递:开辟新的空间,拷贝传递参数的值,引用传递:引用...

  • C语言 函数传参的理解

    C语言有点东西 不像JAVA 不需要复杂考虑参数传递问题 java就两种参数传递方式 值传递AND引用传递...

网友评论

    本文标题:Java 参数传递是值传递还是引用传递?

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