首页 > 编程语言 >Java---值传递和引用传递(其实只有值传递)

Java---值传递和引用传递(其实只有值传递)

时间:2024-09-07 14:54:28浏览次数:12  
标签:--- Java 对象 传递 person 引用 数组 public


在Java中,所有的参数传递都是值传递(pass-by-value)。这意味着方法在调用时,传递给方法的是参数值的副本,而不是参数的实际引用。不同于一些其他语言(如C++),Java不支持引用传递(pass-by-reference)。但是,在理解Java的值传递和对象的行为时,可能会引起一些混淆,尤其是在涉及对象时。

下面通过详细的解释和示例说明值传递和引用传递在Java中的实际表现。

1. 值传递(基本数据类型)

对于基本数据类型(如intcharfloat等),Java传递的是值的副本,也就是拷贝一份给方法,所以方法内部对参数的修改不会影响原始值。

示例代码:
public class ValueTransfer {
    public static void changeValue(int num) {
        num = 10;  // 修改参数的副本
    }

    public static void main(String[] args) {
        int a = 5;
        changeValue(a);  // 传递的是a的副本
        System.out.println("a的值是: " + a);  // 输出: a的值是 5
    }
}

解释:在这个例子中,changeValue方法对传入的参数num进行了修改,但它并没有影响到main方法中的变量a,因为a的值被复制了一份传给了方法,修改的只是副本。

2. 值传递(引用类型)

对于引用类型(如对象、数组等),Java传递的仍然是值,但这个值是对象的引用(即对象在内存中的地址)。这意味着方法得到的是对象引用的拷贝,这个拷贝仍然指向同一个对象。因此,虽然参数是值传递,但可以通过引用来修改对象的内部状态。

示例代码:
public class ReferenceTransfer {
    public static void changeObjectValue(Person p) {
        p.name = "Alice";  // 修改对象的属性
    }

    public static void main(String[] args) {
        Person person = new Person("Bob");
        changeObjectValue(person);  // 传递对象引用的副本
        System.out.println("person的名字是: " + person.name);  // 输出: person的名字是 Alice
    }
}

class Person {
    String name;

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

解释:在这个例子中,虽然person的引用被传递给了changeObjectValue方法,但该方法可以通过这个引用修改person对象的name属性,最终影响到了main方法中的person对象。

3. 引用重新赋值

需要注意的是,虽然传递的是对象的引用,但如果在方法内部将这个引用重新指向另一个对象,那么这种更改不会影响原始引用。

示例代码:
public class ReferenceReassignment {
    public static void reassignObject(Person p) {
        p = new Person("Charlie");  // 重新分配了一个新对象给p
        p.name = "David";
    }

    public static void main(String[] args) {
        Person person = new Person("Bob");
        reassignObject(person);  // 尝试重新分配对象引用
        System.out.println("person的名字是: " + person.name);  // 输出: person的名字是 Bob
    }
}

解释:在这个例子中,虽然p引用在reassignObject方法中被重新指向了一个新的对象,但这不会影响main方法中的person引用。因为在方法内部重新分配的引用只是局部的,原来的对象引用并没有改变。

4. 数组传递

数组在Java中也是对象,因此数组的传递也遵循引用传递的规则。传递的是数组引用的副本,方法可以修改数组内容。

示例代码:
public class ArrayTransfer {
    public static void changeArray(int[] arr) {
        arr[0] = 99;  // 修改数组的第一个元素
    }

    public static void main(String[] args) {
        int[] numbers = {1, 2, 3};
        changeArray(numbers);  // 传递数组引用的副本
        System.out.println("数组第一个元素是: " + numbers[0]);  // 输出: 数组第一个元素是 99
    }
}

解释:在这个例子中,虽然数组引用被传递给了changeArray方法,但方法可以通过该引用修改数组的内容,这种修改会反映在原始数组中。

总结:

  • 基本数据类型:传递的是值的副本,方法内部对参数的修改不会影响原始值。
  • 引用类型(对象、数组等):传递的是对象引用的副本,方法内部可以通过这个引用修改对象的属性或内容,修改会反映到原始对象上
  • 引用重新赋值:如果在方法内部重新赋值给引用,则不会影响原始引用。

Java中只有值传递。对于引用类型来说,虽然传递的是对象的引用,但它仍然是引用的副本,修改引用本身不会影响外部引用,只是通过引用来操作对象的内部状态。


标签:---,Java,对象,传递,person,引用,数组,public
From: https://blog.51cto.com/u_15305087/11945004

相关文章

  • 基于JAVA的数计学院学生综合素质评价系统设计与实现,LW、源码+部署讲解
    摘   要传统信息的管理大部分依赖于管理人员的手工登记与管理,然而,随着近些年信息技术的迅猛发展,让许多比较老套的信息管理模式进行了更新迭代,个人综合素质信息因为其管理内容繁杂,管理数量繁多导致手工进行处理不能满足广大用户的需求,因此就应运而生出相应的数计学院学生......
  • 【零基础 快速学Java】韩顺平 零基础30天学会Java--- 面向对象编程(中级部分)(2024Jav
    IDEA常用快捷键添加注释和取消注释ctrl+/【第一次是添加注释,第二次是取消注释】导入该行需要的类先配置autoimport,然后使用alt+enter即可快速格式化代码ctrl+alt+L生成构造器等alt+insert[提高开发效率]查看一个类的层级关系ctrl+H[学习继承后,非常有用]......
  • Java网络编程入门
            在现代软件开发中,网络编程是一项不可或缺的技能。Java提供了强大的网络编程支持,使得开发者能够轻松地创建网络应用程序。今天将介绍Java中的网络编程基础,重点讲解Socket和ServerSocket类的使用。什么是Socket?        Socket是网络通信的基本组件,它为......
  • AI跟踪报道第55期-新加坡内哥谈技术-本周AI新闻: GPT NEXT (x100倍)即将在2024推出
      每周跟踪AI热点新闻动向和震撼发展想要探索生成式人工智能的前沿进展吗?订阅我们的简报,深入解析最新的技术突破、实际应用案例和未来的趋势。与全球数同行一同,从行业内部的深度分析和实用指南中受益。不要错过这个机会,成为AI领域的领跑者。点击订阅,与未来同行!订阅:https://......
  • 活动系统开发之采用设计模式与非设计模式的区别-设计模式
    1、父类Base.php<?php/***初始化控制器*User:Administrator*Date:2022/9/26*Time:18:00*/declare(strict_types=1);namespaceapp\controller;useapp\model\common\Token;useapp\BaseController;useapp\BaseError;useOpenSSL\Encrypt;usea......
  • 【Java 学习】:抽象类&接口
    ✨                         人逢喜事精神爽,月到中秋分外明    ......
  • [Python之代码爬虫] -爬取披头士乐队历年专辑封面-网易云音乐
    一、前言前文说过我的设计师小伙伴的设计需求,他想做一个披头士乐队历年专辑的瀑布图。通过搜索,发现网易云音乐上有比较全的历年专辑信息加配图,图片质量还可以,虽然有大有小。我的例子怎么都是爬取图片?(谁让你总是跟设计师小伙伴一起玩耍。。。)看来图片对于设计师来说还是有着......
  • 【Java 基础】:三大特征之多态
    ✨                         杏花疏影里,吹笛到天明    ......
  • 04-burp对http网站抓包&漏洞利用及信息收集
    1、安装burp并实现抓取HTTP站点的数据包(HTTPS站点暂时不要求)首先用docker开启dvwa容器,创建出一个http的站点(dvwa)dockerrun-d-p8080:80sagikazarmark/dvwa然后在网络设置中,将配置访问互联网的代理服务器中的选项改为手动配置代理(以Firefox为例),其中HTTP代理的IP地址和......
  • 数学知识-学科知识
    数的认识自然数整数小数分数百分数数的运算加法减法乘法除法四则混合运算量与计量长度单位(米、厘米等)面积单位(平方米、平方厘米等)体积单位(立方米、立方厘米等)质量单位(千克、克等)时间单位(小时、分钟、秒等)几何初步平面图形(三角形、四边形、圆......