zoukankan      html  css  js  c++  java
  • java的传参究竟是按值传递的还是按引用传递的

    这里来弄清楚Java的传参究竟是按值传递的还是按引用传递的。

    形参和实参

    传参的概念里,有形参和实参的区分。形参是定义方法名和方法体的时候使用的参数,目的是用来接收调用该方法的时候传入的参数;实参是调用有参方法的时候传入的参数,方法名后面的括号中的参数就是实参。理解起来可能有点抽象,简单理解就是,形参是定义方法的参数,实参是调用方法时实际传入的参数,区别在于【定义】和【调用】。

    简单举个例子,我定义了一个打印名字的方法,传入一个name的参数,这个参数就是形参。

    public void printName(String name) {
        System.out.println(name);
    }

    然后我去调用这个方法,传入了一个值为【杨冠标】的参数,这个参数就是形参。

    String name = "杨冠标";
    
    this.printName(name); // "杨冠标"

    从名称上也可以看出,形参就是形式上的参数(键),实参就是实际传入的参数(值)。

    什么是按值传递

    按值传递(Pass by Value),是指在调用方法时将实参复制一份传递到方法中,这样当方法对形参进行修改时不会影响到实参,因为修改的不是同一块内存地址。

    什么是按引用传递

    按引用传递(Pass by Reference),是指在调用方法时将实参的地址(引用)传递到方法中,那么在方法中对形参所进行的修改将影响到实参,因为修改的是同一块内存地址。

    Java中传参的按值传递

    在Java中,数据类型可以被分为两种,一种是基本类型,一种是引用类型。其中,基本类型就是按值传递的。也就是说,当形参是基本类型的时候,实参是复制出来的一份,会在栈内存中开辟一块新的内存空间。

    我们还是举一个简单的例子,定义一个修改年龄的方法,传入一个age的形参。

    public void changeAge(int age) {
        age = age + 1;
        System.out.println(age);
    }

    然后我们来调用一下这个方法,传入一个值为【20】的实参。

    int age = 20;

    this.changeAge(age); // 21
    System.out.println(age); // 20

    通过打印的结果可以看出,在changeAge(int age)方法中,传入的实参和操作的形参是相互独立而不影响的。

    Java中传参的按引用传递

    在Java中,引用类型就是按引用传递的。也就是说,当形参是引用类型的时候,实参是堆内存中对象的引用,不会在开辟一块新的内存空间。

    我们先定义一个User的对象。

    public class User {
        private name;
        private age;
    
        // 相对应的getter和setter
    }

    然后定义一个修改User对象的方法。

    public void changeUser(User user) {
        user.setName("黄淇");
        System.out.println(user.name);
    }

    最后我们实例化一个User对象,并调用修改User对象的方法来看看结果。

    User user = new User();
    user.setName("杨冠标");
    
    this.changeUser(user); // "黄淇"
    
    System.out.println(user.getName()); // "黄淇"

    通过打印的结果可以看出,在changeUser(User user)方法中,传入的实参和操作的形参是相互影响的。

    总结

    综合以上,我们可以得到一个结论:在Java中的传参既存在按值传递,也存在按引用传递。其中,基本类型的传参是按值传递的,传递的是值的拷贝,会在栈内存中开辟新的内存空间;引用类型(除了基本类型都是引用类型)的传参是按引用传递的,传递的是堆内存中对象的引用,操作的结果会直接反映到该对象中。

    "我走了很远的路,才来到你的面前。"

  • 相关阅读:
    mininet和ryu控制器的连接
    Linux服务器(Ubuntu14.04)添加远程连接VNC Server
    KVM的前世今生
    Ubuntu下搭建ryu环境
    Ubuntu下搭建Mininet环境
    手机蓝牙
    常见的js算法面试题收集,es6实现
    前端笔试题面试题记录(上)
    关于js中onclick字符串传参问题(html="")
    Angular $scope和$rootScope事件机制之$emit、$broadcast和$on
  • 原文地址:https://www.cnblogs.com/yanggb/p/12038579.html
Copyright © 2011-2022 走看看