Java原来是值传递?

这篇具有很好参考价值的文章主要介绍了Java原来是值传递?。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

先说结论,Java就是值传递。

01

在Java中,所有的参数都是按值传递的,即方法得到的是所有参数值的一个副本,而不是原始参数。当我们将一个对象的引用作为参数传递给一个方法时,实际上传递的是该对象的引用的副本。

下面是一个例子来说明这一点:

public class Test {

    public static void main(String[] args) {
        int x = 10;
        changeValue(x);
        System.out.println("x = " + x); // 输出结果:x = 10
        
        String str = "hello";
        changeValue(str);
        System.out.println("str = " + str); // 输出结果:str = hello
        
        Person person = new Person("Jack");
        changeValue(person);
        System.out.println("person.name = " + person.getName()); // 输出结果:person.name = Rose
    }
    
    public static void changeValue(int x) {
        x = 5;
    }
    
    public static void changeValue(String str) {
        str = "world";
    }
    
    public static void changeValue(Person person) {
        person.setName("Rose");
    }
}

class Person {
    private String name;

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

    public String getName() {
        return name;
    }

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

在上面的代码中,我们分别定义了三个方法changeValue,并且在main方法中调用了这三个方法。

  • 第一个changeValue方法接收一个int类型的参数,将其修改为5,但是在main方法中输出的结果依然是原来的值10,说明传递的参数是按值传递的。

  • 第二个changeValue方法接收一个String类型的参数,将其修改为world,但是在main方法中输出的结果依然是原来的值hello,说明传递的参数是按值传递的。

  • 第三个changeValue方法接收一个Person类型的参数,将其名称修改为Rose,并且在main方法中输出该对象的名称也为Rose,说明传递的参数是按值传递的。但是由于传递的是该对象的引用的副本,而不是原始参数,因此我们可以通过该引用访问和修改该对象的属性。

02

那为什么很多人都觉得Java是引用传递,比如对引用类型参数的传递?

相信这也是很多人的疑问。

产生这样的错觉,这很可能是因为Java中对象本身是通过引用来传递的。在Java中,当我们声明一个对象并将其赋值给一个变量时,实际上是创建了一个指向该对象的引用。当我们将该变量传递给一个方法时,实际上传递的是该引用,即指向该对象的地址。因此,在方法内部可以通过该引用来修改该对象的状态。

然而,需要注意的是,虽然引用本身是传递的,但是对于对象本身的修改并不会影响到原始的对象,因为传递的只是地址而不是对象本身。如果我们在方法内部将传入的参数重新赋值为一个新的对象,那么这个新对象只会存在于方法内部,并不会影响到原始的对象。

因此,我们可以说Java中是值传递,但是对于引用类型的参数,传递的是引用的值。

好的,让我们来看一个例子。

假设我们有一个Person类,其中包含姓名和年龄两个属性。现在有一个方法叫做changeAge,在该方法中,我们接收一个Person对象和一个整数作为参数,然后将这个整数赋值给Person对象的年龄属性。代码如下:

public class Person {
    private String name;
    private int age;

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

    public int getAge() {
        return age;
    }
}

public class Main {
    public static void main(String[] args) {
        Person p1 = new Person("Tom", 20);
        int newAge = 30;
        changeAge(p1, newAge);
        System.out.println(p1.getAge()); // 输出 20
    }

    public static void changeAge(Person person, int newAge) {
        person = new Person(person.getName(), newAge);
    }
}

在上面的代码中,我们创建了一个Person对象p1,其年龄为20。然后我们调用changeAge方法,并将p1和一个新的年龄值30传递给该方法。在changeAge方法中,我们通过传入的person参数来获取p1对象,并将其重新赋值为一个新的Person对象,其中年龄为传入的newAge参数。

最后,我们打印出p1对象的年龄,预期输出应该是30。但实际输出却是20。这是因为在changeAge方法中,我们只是修改了传入的person引用指向的对象,而并没有修改p1本身的值。当changeAge方法返回时,p1仍然指向原来的Person对象,其年龄还是20。

因此,我们可以看到,在Java中,虽然引用类型的参数传递的是引用的值,但是这不等同于引用传递。对于传入的引用类型参数,在方法内部对其进行修改只会影响到该引用所指向的对象,而不会影响到原始的对象。

03

看到这里,我知道有的小伙伴肯定坐不住了。

谁说不能改age,我这样写就能改!

    public static void changeAge(Person person, int newAge) {
        person.setAge(newAge);
    }

我也不多废话了,直接告诉你结论:

person仍然是值传递,传递的是引用的值(内存地址),所以看起来像引用传递。

就好像你去配了一把钥匙,也能打开门一样,但是哪怕作用一样,你手里的也是配出来的钥匙,而不是原来的钥匙。

总结

对于基本数据类型,肯定是值传递,没什么好说的。

对于引用类型,仍然是值传递,传递的是引用的值(内存地址),所以看起来像引用传递。文章来源地址https://www.toymoban.com/news/detail-462579.html

到了这里,关于Java原来是值传递?的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • java 的参数传递

    首先,我们从一个例子来引出这个问题: 请问,1,2,3,4 处分别输出的应该是什么? 答案是: 看到这里,同学对 1,2,4 的结果肯定是不会有疑问,可能会有一部分同学会对 3 的输出有些疑问,change方法不是对序列进行了倒排,为啥3 处mockList 的序列没变,如果有这个疑问的同学

    2024年02月02日
    浏览(26)
  • Java参数传递方式详解

    Java中参数传递的方式是什么样的呢?是值传递还是引用传递呢? 答案是值传递。 为什么呢? 先来了解一些基础。。。。。 Java中参数传递方式是值传递,且只有值传递,没有引用传递。 JavaGuide Java值传递详解

    2024年02月07日
    浏览(43)
  • 图文详解Java参数传递类型

      大家好,我是爱编程的喵喵。双985硕士毕业,现担任全栈工程师一职,热衷于将数据思维应用到工作与生活中。从事机器学习以及相关的前后端开发工作。曾在阿里云、科大讯飞、CCF等比赛获得多次Top名次。现为CSDN博客专家、人工智能领域优质创作者。喜欢通过博客创作

    2024年02月17日
    浏览(28)
  • 深入浅出Java中参数传递的原理

    今天,想和大家聊聊关于java中的参数传递的原理,参数的传递有两种,值传递和引用传递。 值传递 :是指在调用函数时将实际参数复制一份传递到函数中,这样在函数中如果对参数进行修改,将不会影响到实际参数。 引用传递 :是指在调用函数时将实际参数的地址传递到

    2024年02月01日
    浏览(53)
  • Java获取URL地址中传递的参数

    一、 Java获取URL地址中传递的参数 二、获取请求的URL地址 三、获取请求的IP地址 四:判断字符串是否能够转换成指定格式的日期

    2024年02月16日
    浏览(35)
  • 【Java EE】Spring请求如何传递参数详解

    访问不同的路径,就是发送不同的请求.在发送请求时,可能会带⼀些参数,所以我们在学习Spring的请求时,主要是学习如何传递参数到后端以及后端如何接收. 下面博主会对传递参数进行一个详解,咱们主要是使⽤浏览器和Postman来模拟 当我们运行后,用浏览器进行访问 http://127.0.

    2024年04月12日
    浏览(38)
  • java 通过行为参数化传递代码,来解决不断增长的需求

    2.1, 匿名内部类 2.2 lamble表达式

    2024年02月08日
    浏览(38)
  • Java开发学习(二十五)----使用PostMan完成不同类型参数传递

    学习路线指引(点击解锁) 知识定位 人群定位 🧡 Python实战微信订餐小程序 🧡 进阶级 本课程是python flask+微信小程序的完美结合,从项目搭建到腾讯云部署上线,打造一个全栈订餐系统。 💛Python量化交易实战💛 入门级 手把手带你打造一个易扩展、更安全、效率更高的量

    2023年04月09日
    浏览(38)
  • Java后端和前端传递的请求参数的三种类型

    在 HTTP 请求中,常见的请求参数类型有三种:`application/x-www-form-urlencoded`、`multipart/form-data` 和 `application/json`(通常用于 `raw` 类型)。这三种类型主要指的是请求体中的数据格式,其中包括参数的传递方式和编码。 1. **`application/x-www-form-urlencoded`:**    - 这是默认的编码类型

    2024年02月02日
    浏览(35)
  • java restful application/x-www-form-urlencoded 传递参数

            在发送短信的时候,要使用x-www-form-urlencoded的编码格式进行传递参数。  具体要求: 参数名称 说明 备注 userId 用户名 timespan 时间戳 格式为yyyyMMddHHmmss password 密码 此处用原始密码+时间戳 做MD5加密,32位大写格式   phone 手机号 多个用英文逗号隔开 msgType 编码类型 选

    2024年02月14日
    浏览(33)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包