前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >Java 参数传递是值传递还是引用传递?

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

作者头像
萬物並作吾以觀復
发布2019-05-10 18:42:14
2.8K0
发布2019-05-10 18:42:14
举报
文章被收录于专栏:指尖下的Android指尖下的Android

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

代码语言:javascript
复制
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");
    }
}

控制台输出为

代码语言:javascript
复制
10
15
10

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

代码语言:javascript
复制
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;
        }
    }
}

控制台输出为

代码语言:javascript
复制
地址为 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 对象的内存地址,这就充分说明了值传递,只不过值得一提的是,这个值传递是复制了一份对象,但是里面的参数所引用的地址指向是一样的,重点理解的是引用数据类型传递的确实是值,但是对象内部的参数指向的是一样的数据。

本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。
原始发表:2019.04.27 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档