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

【Java】Java中是值传递还是引用传递的?

时间:2024-03-26 10:30:32浏览次数:33  
标签:Java 函数 s2 中是 传递 age swap Student s1

对于Java的初学者来说值传递和引用传递是一个容易混淆的概念,很多时候调用方法传入参数运行方法后的结果与自己享的不一致。那么Java到底是如何传参的呢?

简介

  1. 值传递

    • 在值传递中,函数接收到的是参数的值的副本,而不是参数本身。
    • 当你向函数传递一个参数时,函数会创建一个新的变量,并将传递给函数的值复制到这个新变量中。
    • 这意味着在函数内部对参数的修改不会影响到函数外部的原始值。
    • 值传递常见于基本数据类型(如整数、浮点数、布尔值等)的传递。
  2. 引用传递

    • 在引用传递中,函数接收到的是参数的引用(地址)而不是参数的值的副本。
    • 这意味着在函数内部对参数的修改会影响到函数外部的原始值。
    • 引用传递常见于复杂数据类型(如数组、对象、类实例等)的传递。
    • 多数情况下,引用传递可以节省内存空间,并且可以避免复制大量数据。

代码展示

有了基本的概念之后请看下面一段代码

public static void main(String[] args) {
        int a = 10;
        int b = 20;
        swap(a,b);
        System.out.println("main函数中a="+a);
        System.out.println("main函数中b="+b);
    }
    public static void swap(int a,int b){
        int c = a;
        a = b;
        b = c;
        System.out.println("swap函数中a="+a);
        System.out.println("swap函数中b="+b);
    }

你是否认为在main方法中输出的a是20,b是10?请看输出结果。

很可惜,答案是原数值并没有交换,那么这是为什么呢? 

原理分析

在Java当中一个一个方法的调用都是一个入栈的过程,main方法首先入栈,当调用了swap方法的时候swap方法入栈,此时主函数传给swap函数的a和b都会被在swap方法中拷贝出一个副本出来,副本的值的交换不影响主函数中a和b的值。

 基本类型的int我们明白了之后我们看下面的一个例子。

class Student{
    public String name;
    public int age;
    public Student(){}
    public Student(String name,int age){
        this.name = name;
        this.age = age;
    }
}
 public static void main(String[] args) {
       Student s1 = new Student("张三",18);
       Student s2 = new Student("李四",20);
       swap(s1,s2);
       System.out.println(s1.name+"的年龄是"+s1.age);
       System.out.println(s2.name+"的年龄是"+s2.age);
    }
    public static void swap(Student s1,Student s2){
        int age = s1.age;
        s1.age = s2.age;
        s2.age = age;
    }

请看结果。

结果是否与你想的一样?你可能会想,不是副本进行交换不影响主函数当中变量的值吗?为什么打印的年龄是交换的了,是不是博主拿出一个瞎打印的结果来骗你了?不不不,请看我的分析。

 

 在Java当中我们new出来的对象是保存在堆区的,每一个对象有自己的地址,当我们在main方法中定义出s1和s2的时候,s1和s2会指向堆区当中他们new出来的对象,之后我们在调用swap方法,s1和s2的副本同样的指向到了堆区当中的s1和s2对象,那么在这个时候我们进行age的交换的时候就会影响到堆区当中的对象从而影响主方法中的对象。如果我们执行下边的代码。你觉得会改变年龄的结果吗?

 public static void swap(Student s1,Student s2){
       Student s = s1;
       s1 = s2;
       s2 = s;
    }

答案是不会的,因为我们打印的是main方法中的s1和s2对象,swap方法中虽然执行了交换操作,但也仅仅是把swap方法中的s1指向了堆区当中的s2,把swap方法中的s2指向了堆区中的s1,没有对堆区对象做出影响。

结论

在Java中是按照值传递的方式,只不过参数是不同的类型可能会出现不同的结果。

希望我的解答能够为您提供帮助,喜欢的话希望给博主一个关注

标签:Java,函数,s2,中是,传递,age,swap,Student,s1
From: https://blog.csdn.net/qq_61024956/article/details/137036443

相关文章

  • Java中128陷阱源码剖析(一看就懂)
    文章目录128陷阱例子解析问题一问题二问题三128陷阱例子现在有这样的程序,相同的值判断相等,不同的值大小下,得出的结果却不同。publicclassMain{publicstaticvoidmain(String[]args){Integera=123;Integerb=123;int......
  • How to get the client IP address with Javascript only
    LearnhowtogettheclientIPaddress(localandprivate)usingonlyjavascript.​​Javascriptisunabletoget(norstoressomewhere)theclientIP,howeverjavascriptisabletocreateHttprequests,andserversidelanguagesareabletoretrievetheu......
  • Java中的流和IO操作及底层实现原理
    Java中的流和IO操作是Java编程中非常基础和重要的概念,它们主要用于处理数据的输入和输出。下面我会详细解释这两个概念。流(Stream)在Java中,流是一组有顺序的,有起点和终点的字节集合,是对数据传输的总称或抽象。即数据在两设备间的传输称为流,流的本质是数据传输,根据数据传输......
  • 「Java开发指南」如何从WSDL搭建一个Spring服务?
    本教程的重点是如何从现有的WSDL构建Web服务,实现的WSDL是来自ApacheCXF文档的HelloWorldWSDL协议 的简化版本。在本教程中,您将学习如何:导入WSDL协议部署并运行web服务注意:自定义Spring代码生成需要MyEclipseSpring或Bling授权。MyEclipsev2023.1.2离线版下载MyEclipse......
  • Java面试必问题18:线程安全的集合类和有序的集合类
         精华篇:  极致精简解释有序的集合类包括:TreeMap-基于红黑树实现的有序Map。LinkedHashMap-基于哈希表和双向链表实现的有序Map。TreeSet-基于红黑树实现的有序Set。LinkedHashSet-基于哈希表和双向链表实现的有序Set。示例:有序Map:TreeMap有序Li......
  • java毕业设计房产销售管理小程序[附源码]
    本系统(程序+源码)带文档lw万字以上  文末可领取本课题的JAVA源码参考系统程序文件列表系统的选题背景和意义选题背景:在当今数字化时代,房产销售行业正经历着前所未有的变革。随着信息技术的飞速发展,传统的房产销售模式已经无法满足市场的需求。购房者越来越倾向于通过网络......
  • 如何使用 JavaScript 导入和导出 Excel
    前言在现代的Web应用开发中,与Excel文件的导入和导出成为了一项常见而重要的任务。无论是数据交换、报告生成还是数据分析,与Excel文件的交互都扮演着至关重要的角色。本文小编将为大家介绍如何在熟悉的电子表格UI中轻松导入Excel文件,并以编程方式修改表格或允许用户进行编辑,最......
  • Java服务器开发的日志:日志的作用和使用方法;日志文件的定期归档、清理和滚动策略;ELK(又
    Java服务器开发的日志Java服务器开发,为什么要使用日志?应该怎样使用日志?在Java服务器开发中使用日志是非常关键的一个实践,原因如下:本文所说的“日志”,主要是指程序运行时生成的技术日志;它在Java服务器开发中的作用和使用方法如下:故障诊断:技术日志主要用于记录程序运......
  • JAVA中CAS原理
    在Java中,CAS(Compare-and-Swap)是一种无锁算法,通过JNI(JavaNativeInterface)调用本地方法来利用处理器提供的原子指令实现。它可以保证在多线程环境下的原子性和可见性,而无需使用传统的锁机制。以下是一个简单的Java示例,通过java.util.concurrent.atomic包下的AtomicInteger类来......
  • 【附源码】java毕业设计生活旅行分享网站的设计与实现
    本系统(程序+源码)带文档lw万字以上 文末可领取本课题的JAVA源码参考系统程序文件列表系统的选题背景和意义选题背景:随着经济的发展和生活水平的提高,旅行已经成为现代人休闲放松的一种重要方式。人们不仅希望在旅行中体验不同的文化、风光和生活,还愿意通过互联网与他人分......