Java是值传递还是引用传递?顶级理解!

文章详细探讨了Java中的参数传递机制,指出无论是基础数据类型还是引用数据类型,Java都是值传递。对于基础数据类型,参数在函数内部的修改不会影响到原始值。而对于引用数据类型,虽然传递的是对象引用的副本,但修改对象的内容会改变原始对象的状态,这并不违反值传递的原则,因为传递的引用值本身并未改变。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

Java是值传递还是引用传递?值传递!!!


今天在背八股文是遇到了一个问题,Java是值传递还是引用传递?我也以为基本数据类型是值传递,引用数据类型是引用传递。但答案告诉我不是这样的。颠覆了我的三观,打破了我的认知。网上的解释也是模糊不清(强行解释),看的我愈加认为我是对的。直到我有了自己的理解。
在这里插入图片描述

一、前言

开始之前我要告诉你们答案,Java参数的传递方式是值传递。我知道你不愿意接受这个事实,或者有着自己的理解,先别急着生气(心想又是一篇垃圾文章)。
在这里插入图片描述
我知道你很急,但是先不要急。

首先我们要知道什么是值传递和引用传递。

值传递是指在调用函数时将实际参数复制一份传递到函数中,这样在函数中如果对参数进行修改,将不会影响到实际参数。
引用传递指在调用函数时将实际参数的地址传递到函数中,那么在函数中对参数所进行的修改,将影响到实际参数。

以上定义摘自百度百科,先理解定义。

二、基础数据类型验证

public class Main {
    public static void main(String[] args) {
        // 验证基础数据类型
        int a = 1;
        int b = 2;
        basicDataTypes(a,b);
        System.out.println("a = " +a);
        System.out.println("b = " +b);
    }
    // 基础数据类型-> 值传递
    private static void basicDataTypes(int a, int b) {
        a=5;
        b=6;
    }
}

结果
在这里插入图片描述
这里在basicDataTypes函数中修改了a,b的值,但是实参a,b并没有改变。
所以基础数据类型是值传递。

三、引用数据类型(含顶级理解)

上才艺!!!

public class Main {
    public static void main(String[] args) {
    	// 验证引用数据类型
        Person p1 = new Person("zhangsan", 18);
        Person p2 = new Person("lisi", 20);
        referenceType(p1,p2);
        System.out.println(p1);
        System.out.println(p2);
    }
	// 引用数据类型-> 值传递
    private static void referenceType(Person p1, Person p2) {
        p1=new Person("wangwu",30);
        p2.setAge(23);
    }

    public static class Person{
        @Override
        public String toString() {
            return "Person{" +
                    "name='" + name + '\'' +
                    ", age=" + age +
                    '}';
        }

        public String name;
        public Integer age;

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

        public String getName() {
            return name;
        }

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

        public Integer getAge() {
            return age;
        }

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

结果:
在这里插入图片描述
我们可以看到p1内容并没有变,这就已经说明引用类型是值传递,至少可以说明不是引用传递。

有人就会说p2的年龄变了啊,不满足上述值传递定义“在函数中如果对参数进行修改,将不会影响到实际参数。”

解答:
这里所说的 参数的修改 是对 形参的值 的修改,值的修改是否会影响到实参的值,并不是说对形参内容的修改,而去影响实参的内容。
因为Java中 引用对象的值传递 传递的是该对象地址的一个副本,并不是原对象本身。所以对形参对象进行内容上的修改会同时改变原对象。

世界地图矢量数据可以通过多种网站进行下载。以下是一些提供免费下载世界地图矢量数据的网站: 1. Open Street Map (https://www.openstreetmap.org/): 这个网站可以根据输入的经纬度或手动选定范围来导出目标区域的矢量图。导出的数据格式为osm格式,但只支持矩形范围的地图下载。 2. Geofabrik (http://download.geofabrik.de/): Geofabrik提供按洲际和国家快速下载全国范围的地图数据。数据格式支持shape文件格式,包含多个独立图层,如道路、建筑、水域、交通、土地利用分类、自然景观等。数据每天更新一次。 3. bbbike (https://download.bbbike.org/osm/): bbbike提供全球主要的200多个城市的地图数据下载,也可以按照bbox进行下载。该网站还提供全球的数据,数据格式种类齐全,包括geojson、shp等。 4. GADM (https://gadm.org/index.html): GADM提供按国家或全球下载地图数据的服务。该网站提供多种格式的数据下载。 5. L7 AntV (https://l7.antv.antgroup.com/custom/tools/worldmap): L7 AntV是一个提供标准世界地图矢量数据免费下载的网站。支持多种数据格式下载,包括GeoJSON、KML、JSON、TopJSON、CSV和高清SVG格式等。可以下载中国省、市、县的矢量边界和世界各个国家的矢量边界数据。 以上这些网站都提供了世界地图矢量数据的免费下载服务,你可以根据自己的需求选择合适的网站进行下载。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

炎丶

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值