Java是值传递还是引用传递

本文详细探讨了Java中形参和实参的概念,以及值传递和引用传递的区别。通过实例代码展示了基本类型和引用类型参数在函数调用中的行为,证明了Java中参数传递实际上是值传递,对于引用类型则是传递对象引用的副本。总结强调了Java中实参到方法的传递方式是值传递,无论是基本类型还是引用类型。
摘要由CSDN通过智能技术生成

前言

许久未曾写文了,今天决定水一篇

——南方

证明

形参/实参

  • 形参:用于定义函数/方法,接收实参,不需要有确定的值
  • 实参:用于传递给函数/方法的参数,必须有确定的值
public static void main(String[] args) {
        String a = "b";
        //这里的a就是实参
        print(a);
    }

    //这里的s参数就是形参
    public static void print(String s){
        System.out.println(s);
    }


值传递/引用传递

  • 值传递 :方法接收的是实参值的拷贝,会创建副本
  • 引用传递 :方法接收的直接是实参所引用的对象在堆中的地址,不会创建副本

证明过程

使用基本类型参数
    public static void main(String[] args) {
        String a = "a";
        String b = "b";
        print(a, b);
        System.out.println("a:" + a); //a:a
        System.out.println("b:" + b); //b:b
    }

    public static void print(String c, String d) {
        String e = c;
        c = d;
        d = e;
        System.out.println("c:" + c); //c:b
        System.out.println("d:" + d); //d:a
    }

上述代码很简单,结果呢,很明确,经过print()方法的执行,丝毫未影响到 a,b本身的值,因为c,d的值只是从a,b那里复制过来的,原来的还是原来的,复制品的修改不影响原品的数据

使用引用类型
public class Dog {
    String name;

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

    String getName() {
        return this.name;
    }

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

    String getObjectAddress() {
        return super.toString();
    }
}


public static void main(String[] args) {
	Dog dog = new Dog("A");
	System.out.println(dog.getObjectAddress()); //Dog@15db9742
	func(dog);
	System.out.println(dog.getObjectAddress()); //Dog@15db9742
	System.out.println(dog.getName()); // B
}
private static void func(Dog dog) {
	System.out.println(dog.getObjectAddress());//Dog@15db9742
	dog.setName("B");
	System.out.println(dog.getObjectAddress());//Dog@15db9742
}

此时就会有很多人疑惑了,为啥在这里值发生了改变,其实原因很简单,它们是引用的同一个对象

再次证明
public class Dog {
    String name;

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

    String getName() {
        return this.name;
    }

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

    String getObjectAddress() {
        return super.toString();
    }
}


public static void main(String[] args) {
        Dog dog = new Dog("A");
        System.out.println(dog.getObjectAddress()); // Dog@15db9742
        func(dog);
        System.out.println(dog.getObjectAddress()); // Dog@15db9742
        System.out.println(dog.getName()); // A
    }
    private static void func(Dog dog) {
        System.out.println(dog.getObjectAddress()); // Dog@15db9742
        dog = new Dog("B");
        System.out.println(dog.getObjectAddress()); // Dog@6d06d69c
        System.out.println(dog.getName()); // B
    }

在上面⽅法中将指针引⽤了其它对象,那么此时⽅法⾥和⽅法外的两个指针指向了不同的对象,在⼀个 指针改变其所指向对象的内容对另⼀个指针所指向的对象没有影响

总结

Java 中将实参传递给方法的方式是:值传递

  • 如果参数是基本类型的话,传递的就是基本类型的字面量值的拷贝
  • 如果参数是引用类型,传递的就是实参所引用的对象在堆中地址值的拷贝
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值