首页 > 编程语言 >【Java】引用传递?值传递?

【Java】引用传递?值传递?

时间:2023-05-22 13:55:47浏览次数:352  
标签:Java String 传递 Person static 引用 name

引用传递和值传递,从上学那会儿就开始强调的概念,不管你是计算机相关专业还是自学Java,一定听过这么一句话:

方法调用参数如果是对象,那就是引用传递,如果是基本数据类型,就是值传递。

比如:function(Object o)就是引用传递,function(int i)就是值传递。这两个概念似乎很好理解,我们只需要记住对象和基本数据类型的区别就行了。但是,真的是这样吗?

有一段代码如下:

    public static void main(String[] args) {
        int i = 0;
        System.out.println(i);
        change(i);
        System.out.println(i);
    }

    private static void change(int i) {
        i = 1;
    }

输出结果比较好猜测,也应该都能答对:

0
0

下一个问题,如果将int改成String呢?

    public static void main(String[] args) {
        String s = "0";
        System.out.println(s);
        change(s);
        System.out.println(s);
    }

    private static void change(String s) {
        s = "1";
    }

输出的结果如下:

0
0

嗯?有疑问了吧?不是引用传递吗?我在方法里命名修改了s的值,为什么输出还是”0“呢?难度String作为Object有什么特殊性?

别急,继续看下一段代码:

    public static void main(String[] args) {
        Person p = new Person("0");
        System.out.println(p);
        change(p);
        System.out.println(p);
    }

    private static void change(Person p) {
        p = new Person("1");
    }

    static class Person{
        String name;

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

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

结果会输出什么?

Person{name='0'}
Person{name='0'}

看来String和其他Object没什么不同,可是这样的结果好像不太符合我们对引用传递的认知啊。其实我感觉这两个概念没有必要区分,实质是一回事,都是将栈中引用复制了一份传递到方法中,无论在方法中如何对引用操作,都是操作的副本,只是对于基本数据类型来说,值存储在栈中,引用存储的就是值,而对象来说,引用中存储的是对象在堆中的内存地址,参数传递时生成的副本仍然指向了原来引用指向的对象,所以如果直接操作该对象是有效的。简单画个图方便理解:

 如果对p的操作不是将该引用指向一个新的值,而是对p指向的对象进行操作,就能看到所谓引用传递的效果了例如:

    public static void main(String[] args) {
        Person p = new Person("0");
        System.out.println(p);
        change(p);
        System.out.println(p);
    }

    private static void change(Person p) {
        p.name = "1";
    }

    static class Person{
        String name;

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

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

此时,执行结果为:

Person{name='0'}
Person{name='1'}

总结:

Java进行方法调用时参数传递是将栈中的引用复制了一份到该方法的工作区,如果引用指向了一个堆中的对象,那么副本也指向这个对象。

标签:Java,String,传递,Person,static,引用,name
From: https://www.cnblogs.com/maerpao/p/17405694.html

相关文章

  • 【iOS开发】UIWebView调用JS点击事件(stringByEvaluatingJavaScriptFromString)
    一、场景描述产品需求是移动端app要调用h5页面,然后监听h5代码中的某个方法,最终执行h5中的具体代码。二、具体代码.m文件@interfaceViewController()<UIWebViewDelegate>@property(nonatomic,strong)UIWebView*webView;@end@implementationViewController-(void)viewDid......
  • Java入门9(HashSet,File文件类)
    HashSetjdk1.7之前,使用数组加链表的方式实现jdk1.8之后,在链表长度大于8并且数组长度超过32的情况下,会转成红黑树结构HashSet的本质是一个HashMap,它所有的value都是一致的,传入的参数作为key,因此HashSet中不允许重复数据存储的时候,键值对位于的数组位置,之和key的HashCode值有关......
  • java通用xls导出设计
    背景在后端日常开发中总会有各种各样的导出需求,实现这个需求必须要解决的两个问题:1、表头不能直接使用字段名,需要显示为中文,甚至还需要考虑国际化2、值需要翻译,比如性别、状态之类的字段现状现在主流写的比较好的方法是定义一个对象,对象上用自定义的注解+easytrans我的解决......
  • Java使用HttpClient以multipart/form-data向接口上传文件
    前言对接某公司的接口,涉及到资质上传等业务。需要对接他们的上传附件接口。JDK1.8httpclient4.x封装httpclient方法publicstaticStringpostFileMultiPart(Stringurl,Map<String,ContentBody>reqParam)throwsIOException{ CloseableHttpClienthttpclient=HttpCl......
  • 基于springBoot框架JAVA语言汽车销售管理系统功能实现
    运行环境idea(推荐)、jdk1.8、mysql5.X(不能为8驱动不匹配)、maven项目技术springboot+vue项目描述本项目基于springboot以及Vue开发。针对汽车销售提供客户信息、车辆信息、订单信息、销售人员管理、财务报表等功能,提供经理和销售两种角色进行管理。1.安装好node环境2.......
  • 基于JAVA语言实现的养老信息管理系统
    项目描述本系统的主要功能有:账号管理:管理员账号,用户账号健康管理:健康档案,病例档案,药品管理生活管理:每月餐饮,外出报备入住管理:入住登记,寝室分配安全管理:事故记录,访客记录收费标准:入住费用,护理费用运行环境idea+mysql5.7+jdk1.8+maven3项目技术SpringBoot,MySql,ajax,MyBatis......
  • 探索Spring:Java开发的优秀框架
    简介:Spring是Java开发领域中最受欢迎和广泛应用的开源框架之一。它提供了一个全面的编程和配置模型,用于构建现代化的企业级应用程序。本博客将深入探讨Spring框架的重要特性和优势,并解释为什么Spring成为Java开发人员的首选框架。正文:介绍Spring框架Spring是一个轻量级、灵活且功......
  • JavaScript在策划网站中的应用
    JavaScript在策划网站中有许多应用,以下是其中的一些:1. 表单验证:JavaScript可以用来验证用户提交的表单数据,例如验证邮箱格式、密码强度等,比如某某策划网站就是用的这样的代码。2. 动态效果:JavaScript可以用来实现网页上的动画效果和交互特效,例如轮播图、下拉菜单等。3. Ajax请......
  • Java缓存行对齐
    来源:  https://blog.csdn.net/mofeizhi/article/details/106816026  ......
  • Linux 安装配置Java
    1、下载文件Javajdk-8u371-linux-x64.tar.gz 2、上传并解压文件#tar-zxvfjdk-8u371-linux-x64.tar.gz 3、配置环境变量#JavaexportJAVA_HOME=/usr/local/jdk1.8.0_371exportPATH=$JAVA_HOME/bin:$PATHexportCLASSPATH=.:$JAVA_HOME/lib/dt.jar:$JAVA_HOME/l......