方法的实参和形参

值传递


"值传递"(Pass by Value)是指在调用方法时,将参数的值复制并传递给方法中的形参。这意味着方法接收的是原始数据的一个副本,而不是原始数据本身。以下是值传递的一些关键特点:

  1. 数据复制:当调用方法时,参数的值被复制到新内存区域(方法的栈空间)的形参中。

  2. 独立性:方法内的形参和方法外的实参在内存中是独立的。方法对形参的修改不会影响到实参。

  3. 基本数据类型:对于Java等语言中的原始数据类型(如int, double, char等),总是通过值传递。

  4. 不可变性:由于基本类型的不可变性,方法内对参数值的修改实际上并不改变原始数据。

  5. 内存效率:对于大型对象或数组,值传递可能意味着复制大量数据,这可能不是最内存效率的方式。

  6. 对象引用:对于对象引用类型,值传递的是引用的副本,而不是对象本身。这意味着两个引用指向同一个对象,但副本引用和原始引用是独立的,改变副本引用不会影响原始引用。

  7. 副作用:值传递不保证方法内部对参数的修改对外部可见,除非参数本身是一个对象,并且方法修改了对象的内部状态。

示例:

复制代码
public class PassByValueExample {
    public static void main(String[] args) {
        int a = 10;
        modifyValue(a);
        System.out.println("Outside method: " + a); // 输出不会改变,仍然是 10
    }

    public static void modifyValue(int value) {
        value = 20; // 仅修改了传入的副本,不影响原始变量
    }
}

示例解释:

  • main 方法中,我们有一个原始数据类型 int a,其值为 10。
  • 调用 modifyValue 方法,并传递 a 作为参数。
  • modifyValue 方法内,我们尝试修改参数 value 的值为 20。但这只是修改了 value 的副本,原始变量 a 的值不会改变。
  • 打印 a 的值,输出结果仍然是 10,表明方法内的修改没有影响外部的 a

值传递是大多数编程语言在参数传递时采用的机制,它有助于保护原始数据不被方法内部的修改影响。然而,对于对象引用,需要理解传递的是引用的副本,而不是实际的对象本身。

引用转递


引用传递(Pass by Reference)是指在调用方法时,传递的是对象的引用(或地址),而不是对象本身的拷贝。这意味着方法接收的是原始对象的引用,因此方法内部对对象所做的任何修改都会影响到原始对象。

引用传递的特点:

  1. 传递引用:方法接收的是对象引用的副本,但这个副本指向的是同一个对象。
  2. 共享对象:方法内对对象的修改会反映到原始对象上,因为它们共享同一个对象。
  3. 修改可见:方法内部对对象属性的修改在方法外部是可见的。
  4. 对象不变:对象本身不会被复制,只有引用被传递,因此节省内存。
  5. 基本数据类型:对于基本数据类型(如 int, double 等),大多数语言(包括Java)实际上是通过值传递。
  6. 对象类型:对于对象类型,传递的是引用的副本,但两个引用指向同一个对象。

示例:

复制代码
public class PassByReferenceExample {
    public static void main(String[] args) {
        Person person = new Person("Alice", 30);
        modifyPerson(person);
        System.out.println("Outside method: " + person.getName() + ", " + person.getAge());
    }

    public static void modifyPerson(Person p) {
        p.setName("Bob"); // 修改对象的属性
        p.setAge(40); // 修改对象的属性
    }

    static class Person {
        private String name;
        private int age;

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

        public String getName() {
            return name;
        }

        public void setName(String name) {
            this.name = name;
        }

        public int getAge() {
            return age;
        }

        public void setAge(int age) {
            this.age = age;
        }
    }
}

示例解释:

  • main 方法中,创建了一个 Person 对象 person
  • 调用 modifyPerson 方法,并传递 person 作为参数。
  • modifyPerson 方法内,修改了传入对象 pnameage 属性。
  • 这些修改会影响原始对象 person,因为 p 是对原始对象引用的副本。
  • 打印 person 的信息,输出结果将反映方法内的修改:"Outside method: Bob, 40"。

注意:

  • 在Java中,所有的参数传递都是通过值传递,包括对象的引用。因此,有时人们可能会混淆“引用传递”和“值传递”的概念。
  • 当你传递一个对象的引用时,你实际上是传递了这个引用的副本,但这个副本指向同一个对象。因此,任何通过这个副本引用对对象所做的修改都会反映到原始对象上。
posted @   墨澜  阅读(24)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· Blazor Hybrid适配到HarmonyOS系统
· Obsidian + DeepSeek:免费 AI 助力你的知识管理,让你的笔记飞起来!
· 解决跨域问题的这6种方案,真香!
· 分享4款.NET开源、免费、实用的商城系统
· 一套基于 Material Design 规范实现的 Blazor 和 Razor 通用组件库
点击右上角即可分享
微信分享提示