BlazeMaple BlazeMaple
首页
  • 基础知识

    • Java的基本数据类型
    • Java中的常用类String
    • Java中的异常
    • Java中的注解
    • Java中的反射机制
    • Java中的泛型
    • Java为什么是值传递
  • 集合框架

    • Java集合核心知识总结
    • HashMap的7种遍历方式
    • 源码分析
  • Java新特性

    • Java8新特性
  • IO流

    • Java基础IO总结
    • Java IO中的设计模式
    • Java IO模型
    • IO多路复用详解
  • 并发编程

    • 并发编程基础总结
  • JVM

    • JVM基础总结
  • MySQL

    • MySQL核心知识小结
    • MySQL 45讲
  • Redis

    • Redis核心入门知识简记
  • Spring
  • SpringCloud Alibaba
  • 开发工具

    • Git详解
    • Maven详解
    • Docker详解
    • Linux常用命令
  • 在线工具

    • json (opens new window)
    • base64编解码 (opens new window)
    • 时间戳转换 (opens new window)
    • unicode转换 (opens new window)
    • 正则表达式 (opens new window)
    • md5加密 (opens new window)
    • 二维码 (opens new window)
    • 文本比对 (opens new window)
  • 学习资源

    • 计算机经典电子书PDF
    • hot120
GitHub (opens new window)
首页
  • 基础知识

    • Java的基本数据类型
    • Java中的常用类String
    • Java中的异常
    • Java中的注解
    • Java中的反射机制
    • Java中的泛型
    • Java为什么是值传递
  • 集合框架

    • Java集合核心知识总结
    • HashMap的7种遍历方式
    • 源码分析
  • Java新特性

    • Java8新特性
  • IO流

    • Java基础IO总结
    • Java IO中的设计模式
    • Java IO模型
    • IO多路复用详解
  • 并发编程

    • 并发编程基础总结
  • JVM

    • JVM基础总结
  • MySQL

    • MySQL核心知识小结
    • MySQL 45讲
  • Redis

    • Redis核心入门知识简记
  • Spring
  • SpringCloud Alibaba
  • 开发工具

    • Git详解
    • Maven详解
    • Docker详解
    • Linux常用命令
  • 在线工具

    • json (opens new window)
    • base64编解码 (opens new window)
    • 时间戳转换 (opens new window)
    • unicode转换 (opens new window)
    • 正则表达式 (opens new window)
    • md5加密 (opens new window)
    • 二维码 (opens new window)
    • 文本比对 (opens new window)
  • 学习资源

    • 计算机经典电子书PDF
    • hot120
GitHub (opens new window)
  • 基础知识

    • Java的基本数据类型
    • 聊一聊Java中的常用类String
    • 聊一聊Java中的异常
    • 聊一聊Java中的注解
    • 聊一聊Java中的反射机制
    • 聊一聊Java中的泛型
    • 聊一聊Java为什么是值传递
    • 集合框架

      • Java集合核心知识总结
      • HashMap 的 7 种遍历方式
      • 源码分析

        • ArrayList源码分析
        • LinkedList源码分析
        • HashMap源码分析
        • ConcurrentHashMap源码分析
        • CopyOnWriteArrayList 源码分析
        • LinkedHashMap 源码分析
        • ArrayBlockingQueue 源码分析
        • PriorityQueue 源码分析
        • DelayQueue 源码分析
    • Java新特性

      • Java8新特性
    • Java基础
    • 基础知识
    BlazeMaple
    2023-11-24
    目录

    聊一聊Java为什么是值传递

    # 什么是形参,什么是实参

    形参:即每个方法的参数,如下代码value就是一个形参

    public static int f(int value) {
    }
    
    1
    2

    实参:调用方法时传的参数,如下代码就是括号内部就是实参

    f(1)
    
    1

    # 值传递与引用传递

    值传递:说白了形参会将实参的值拷贝一份作为自己的值来使用,自己无论怎么改变都不会影响到实参的值

    引用传递:简单来说就是将实参所指向的变量的地址传给形参,这样形参操作的就是实参所指向的变量的值,一旦形参改变那个值,实参看到的值也是有变化的

    # 基本类型值传递

    public static void main(String[] args) {
        int num1 = 10;
        int num2 = 20;
        swap(num1, num2);
        System.out.println("num1 = " + num1);
        System.out.println("num2 = " + num2);
    }
    
    public static void swap(int a, int b) {
        int temp = a;
        a = b;
        b = temp;
        System.out.println("a = " + a);
        System.out.println("b = " + b);
    }
    
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15

    输出结果

    a = 20
    b = 10
    num1 = 10
    num2 = 20
    
    1
    2
    3
    4

    #

    # 引用类型值传递

    例1

    以下代码所示,将引用类型传给形参后发现实参的值被改变了,但这并不是引用类型传递。java引用类型的值传递的机制是对于基本类型直接拷贝值,而对于引用类型是拷贝引用类型变量的地址,而引用传递是拷贝引用类型所指向的空间的值,

    public static void main(String[] args) {
        int[] arr = { 1, 2, 3, 4, 5 };
        System.out.println(arr[0]);
        change(arr);
        System.out.println(arr[0]);
    }
    
    public static void change(int[] array) {
        // 将数组的第一个元素变为0
        array[0] = 0;
    }
    
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11

    输出结果

    1
    0
    
    1
    2

    例2

    以下代码可以看到person引用类型作为实参传入后,对象xiaozhang和xiaoli的名字没有被交换,这就说明了java对引用类型做的也是值传递,传递的引用类型的地址值。

    @Data
    public class Person {
        private String name;
        public static void main(String[] args) {
            Person xiaoZhang = new Person("小张");
            Person xiaoLi = new Person("小李");
            swap(xiaoZhang, xiaoLi);
            System.out.println("xiaoZhang:" + xiaoZhang.getName());
            System.out.println("xiaoLi:" + xiaoLi.getName());
        }
    
        public static void swap(Person person1, Person person2) {
            Person temp = person1;
            person1 = person2;
            person2 = temp;
            System.out.println("person1:" + person1.getName());
            System.out.println("person2:" + person2.getName());
        }
    
    }
    
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20

    输出结果

    person1:小李
    person2:小张
    xiaoZhang:小张
    xiaoLi:小李
    
    1
    2
    3
    4
    帮助我们改善此页面! (opens new window)
    上次更新: 2024/08/13, 09:07:12
    聊一聊Java中的泛型
    Java集合核心知识总结

    ← 聊一聊Java中的泛型 Java集合核心知识总结→

    最近更新
    01
    SpringCloud Alibaba实战
    08-22
    02
    SpringCloud Alibaba核心知识
    08-22
    03
    两数之和
    08-08
    更多文章>
    Theme by Vdoing | Copyright © 2023-2024 BlazeMaple
    • 跟随系统
    • 浅色模式
    • 深色模式
    • 阅读模式