Loading [MathJax]/jax/output/CommonHTML/config.js
前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >Java 参数传递是值传递还是引用传递?

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

作者头像
萬物並作吾以觀復
发布于 2019-05-10 10:42:14
发布于 2019-05-10 10:42:14
3.2K00
代码可运行
举报
文章被收录于专栏:指尖下的Android指尖下的Android
运行总次数:0
代码可运行

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

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
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
代码运行次数:0
运行
AI代码解释
复制
10
15
10

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

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
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
代码运行次数:0
运行
AI代码解释
复制
地址为 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 删除。

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

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
如何理解 Java的值传递和引用传递
HaC haC = new HaC(); 和 changeName(HaC haC)参数里面的两个haC 地址都是一样的,指向同一个对象。
曾高飞
2025/06/16
890
多图证明,Java到底是值传递还是引用传递?
开篇先来曝答案,在 Java 语言中,本质只有值传递,而无引用传递,解释和证明详见正文。
Bug开发工程师
2021/01/28
6580
多图证明,Java到底是值传递还是引用传递?
Java到底是引用传递还是值传递?
首先回顾一下在程序设计语言中有关将参数传递给方法(或函数)的一些专业术语。 按值调用(call by value)表示方法接收的是调用者提供的值,而按引用调用(call by reference)表示方法接收的是调用者提供的变量地址。一个方法可以修改传递引用所对应的变量值,而不能修改传递值调用所对应的变量值。它用来描述各种程序设计语言(不只是 Java)中方法参数传递方式。
黑洞代码
2021/01/14
8400
Java到底是引用传递还是值传递?
这一次,让你彻底理解Java的值传递和引用传递!
学过Java基础的人都知道:值传递和引用传递是初次接触Java时的一个难点,有时候记得了语法却记不得怎么实际运用,有时候会的了运用却解释不出原理,而且坊间讨论的话题又是充满争议:有的论坛帖子说Java只有值传递,有的博客说两者皆有;这让人有点摸不着头脑,下面我们就这个话题做一些探讨,对书籍、对论坛博客的说法,做一次考证,以得出信得过的答案。
Java团长
2019/06/26
9550
这一次,让你彻底理解Java的值传递和引用传递!
说说Java到底是值传递还是引用传递
首先,我们必须要搞清楚,到底什么是值传递,什么是引用传递,否则,讨论 Java 到底是值传递还是引用传递就显得毫无意义。
沉默王二
2020/04/23
4840
说说Java到底是值传递还是引用传递
面试再问值传递与引用传递,把这篇文章砸给他!
java的值传递和引用传递在面试中一般都会都被涉及到,今天我们就来聊聊这个问题,首先我们必须认识到这个问题一般是相对函数而言的,也就是java中的方法参数,那么我们先来回顾一下在程序设计语言中有关参数传递给方法(或函数)的两个专业术语:
Java技术栈
2018/12/07
4230
【IT领域新生必看】深入浅出Java:值传递与引用传递的神奇区别
在Java编程中,方法调用时参数的传递方式是一个重要概念。理解值传递和引用传递的区别,对于编写高效、正确的代码至关重要。对于初学者来说,这两个概念可能会有些混淆,但它们在实际应用中非常重要。本篇文章将详细介绍值传递与引用传递的定义、用法及其区别,帮助你全面理解这些关键概念。
E绵绵
2024/07/08
2690
值传递OR引用传递?大部人都答错了!
Java 是值传递还是引用传递?这是 Java 中比较基础的一道常见面试题,但对于这道问题的大部分答案都是错的,大部人会这样回答这个问题:
磊哥
2024/09/04
2290
为什么Java只有值传递
值传递: 调用函数时,将实参复制一份传给函数,函数中修改参数时不会影响实参 引用传递:调用函数时,将实参的地址传给函数,函数中修改参数会影响实参。 判断是值传递还是引用传递的标准,和传递参数的类型是没有关系的。
Qwe7
2022/04/01
5070
Java值传递与引用传递
Java面试题: 当一个对象被当作参数传递到一个方法后,此方法可改变这个对象的属性,并可返回变化后的结果,那么这里到底是值传递还是引用传递?   答案基本上是:值传递 说明:得出这种结论的前提必须是
阳光岛主
2019/02/19
1.2K0
面向对象基础部分之【类与对象】❣️
❤️一名热爱Java的大一学生,希望与各位大佬共同学习进步❤️ 🧑个人主页:@周小末天天开心 各位大佬的点赞👍 收藏⭐ 关注✅,是本人学习的最大动力 感谢!         首先我们要了解一下本篇面向对象基础部分都会讲到什么。         我们本篇文章主要会围绕类与对象、方法、构造器和this关键字来讲解,虽然内容很多,但只要小伙伴们用心去学,用心去理解,解决这章内容就完全不是问题啦🙃。 目录 📕类与对象 引入 类与对象的区别和联系 对象在内存中的存在形式(必须搞清楚)  成员方法/属性
周小末天天开心
2022/10/26
2380
面向对象基础部分之【类与对象】❣️
Java的JVM介绍以及java的值传递和引用传递
面试的时候碰到的了一个java基础问题,竟然给问蒙了,回来之后感觉针对这个问题总结一下
包子388321
2020/06/16
1.1K0
Java真的只有值传递?
值传递(pass by value)是指在调用函数时将实际参数复制一份传递到函数中,这样在函数中如果对参数进行修改,将不会影响到实际参数。
一觉睡到小时候
2019/07/02
7270
Java真的只有值传递?
java — 值传递和引用传递
  在 Java 应用程序中永远不会传递对象,而只传递对象引用。因此是按引用传递对象。Java 应用程序按引用传递对象这一事实并不意味着 Java 应用程序按引用传递参数。参数可以是对象引用,而 Java 应用程序是按值传递对象引用的。   Java 应用程序中的变量可以为以下两种类型之一:引用类型或基本类型。当作为参数传递给一个方法时,处理这两种类型的方式是相同的。两种类型都是按值传递的;没有一种按引用传递。  java实际上只有值传递,没有真正意义上的引用传递。 按值传递意味着当将一个参数传递给一
Mister24
2018/05/14
1.6K0
面试题系列第7篇:Java方法到底是值传递还是引用传递?
这个问题一直在技术讨论区争论不休。对于初级人员来说很具有迷惑性,即便对于很多高级开发来说,也搞不清楚。本篇文章就带大家探究一下底层的原理,最终化繁为简,让大家通过一两句话就明白到底是值传递还是引用传递。
程序新视界
2020/09/08
1.1K1
java是值传递还是引用传递
曾经纠结了很久java的参数传递方式是什么样的,后面粗略的了解了一鳞半爪以后有了大概的印象:“传参数就是值传递,传对象就是引用传递”,后面进一步查找了相关资料和文章以后,发现这么理解是不正确的。
程序猿川子
2024/08/05
1880
java是值传递还是引用传递
java中值传递和引用传递
public static void main(String[] args) {int a=1;change(a);System.out.println("交换a后的值:" a);}
chenchenchen
2019/11/05
8990
java怎么区分值传递和引用传递
java中值传递和引用传递一直饱受争议难以区分,下面我通过几个例子来区分一下什么时间是值传递,什么时间是引用传递
用户5166556
2019/04/16
7420
java是值传递还是引用传递 知乎_按值调用和按引用调用
最近整理面试题,整理到值传递、引用传递,到网上搜了一圈,争议很大。带着一脸蒙圈,线上线下查了好多资料。最终有所收获,所以分享给大家,希望能对你有所帮助。 首先说下我的感受,这个题目出的很好,但是在 Java 中这个题目是有问题的(在下面我会解释)。并且,有很多结论是 Java 中只有 值传递。我认为这样说不够严谨。当然如果针对 Java 语言本身来讲,Java 中只有 值传递,没有引用传递,是正确的。但是如果针对 值传递,引用传递的定义来说,Java 中还是有引用传递的。下面来分析:
全栈程序员站长
2022/11/03
1.1K0
为什么Java中只有值传递【详解】
这里,我们可以清晰地看出x的值在函数执行前后没有发生改变,函数对形参的任何操作,不影响实参;
訾博ZiBo
2025/01/06
1370
为什么Java中只有值传递【详解】
相关推荐
如何理解 Java的值传递和引用传递
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
本文部分代码块支持一键运行,欢迎体验
本文部分代码块支持一键运行,欢迎体验