结论:java是值传递。

1.值传递?引用传递?

先来看看百度百科的定义:

值传递:值传递是指在调用函数时将实际参数复制一份传递到函数中,这样在函数中如果对参数进行修改,将不会影响到实际参数。

引用传递:引用传递是指在调用函数时将实际参数的地址传递到函数中,那么在函数中对参数所进行的修改,将影响到实际参数。

java有两种数据类型,一种是基本类型,例如int;另一种是引用数据类型,如String。

基本数据类型存储的都是实际的值,而引用类型的变量存储的是对象的引用(即对象在内存中的地址)。值和引用存储在stack(栈)中,对象存储在heap(堆)中。下图n1代表一个基本数据类型,n2代表一个引用数据类型。

java对象是引用传递 java是引用传递还是值传递_引用类型

l两种类型区别的原因

  • 栈的优势是,存取速度比堆要快,仅次于直接位于 CPU 中的寄存器。但缺点是,栈中的数据大小与生存周期必须是确定的。
  • 堆的优势是可以动态地分配内存大小,生存周期也不必事先告诉编译器,Java 的垃圾回收器会自动收走那些不再使用的数据。但由于要在运行时动态分配内存,存取速度较慢。

2.基本数据类型的参数传递

基本数据类型的值直接存储在栈中,当作为参数传递时,会将原始值(实参)复制一份新的出来,给形参用。形参将会在被调用方法结束时从栈中清除。

在如下的代码中

public class PrimitiveTypeDemo {
    public static void main(String[] args) {
        int age = 18;
        modify(age);
        System.out.println(age);		//输出结果为18
    }

    private static void modify(int age1) {
        age1 = 30;
    }
}
  1. main中的age为基本类型,它的值会直接存储在栈中。
  2. 调用 modify() 方法的时候,将为实参 age 创建一个副本(也就是形参 age1),它的值也为 18,不过是在栈中的其他位置。
  3. 对形参 age1 的任何修改都只会影响它自身而不会影响实参age。

java对象是引用传递 java是引用传递还是值传递_java对象是引用传递_02

3. 引用类型的参数传递

在分析引用类型时,首先要分清楚Write demo = new Write();中的demo是对象还是对象的引用。上述语句可以写成两行代码:

Write write;
write = new Write();

如果write是对象,那么就不需要new关键字创建对象了,所以在“=”操作符之前,write只是一个变量。new Write()是一个对象,它存在于堆中。”=“将对象的引用赋给了write,此时write应该叫对象引用,它存储于栈中,保存了对象在堆中的地址。

每当引用类型作为参数传递时,都会创建一个对象引用(实参)的副本(形参),该形参保存的地址和实参一样。

如下代码:

public class ReferenceTypeDemo {
    public static void main(String[] args) {
        Writer a = new Writer(18);
        Writer b = new Writer(18);
        modify(a, b);

        System.out.println(a.getAge());		//输出30
        System.out.println(b.getAge());		//输出18
    }

    private static void modify(Writer a1, Writer b1) {
        a1.setAge(30);

        b1 = new Writer(18);
        b1.setAge(30);
    }
}
  1. 在调用modify()方法之前,实参a、b所指向对象是不同的。
  2. 在调用 modify() 方法时,实参 a 和 b 都在栈中创建了一个新的副本 a1 和 b1,但指向的对象是一致的(a 和 a1指向对象 a,b 和 b1指向对象 b)。

java对象是引用传递 java是引用传递还是值传递_基本数据类型_03

  1. modify() 方法中,修改了形参 a1 的 age 为 30,意味着对象 a 的 age 从 18 变成了 30,而实参 a 指向的也是对象 a,所以 a 的 age 也变成了 30;形参 b1 指向了一个新的对象,随后 b1 的 age 被修改为 30。

java对象是引用传递 java是引用传递还是值传递_基本数据类型_04

修改 a1 的 age,意味着同时修改了 a 的 age,因为它们指向的对象是一个;修改 b1 的 age,对 b 却没有影响,因为它们指向的对象是两个。

所以综上可以判断,java是值传递。