Java基础-面向对象-值传递与引用传递

Java工程师知识树 / Java基础


一:值传递

解释:在方法的调用过程中,实参把它的实际值传递给形参,此传递过程就是将实参的值复制一份传递到函数中,这样如果在函数中对该值(形参的值)进行了操作将不会影响实参的值。因为是直接复制,所以这种方式在传递大量数据时,运行效率会特别低下。

代码示例

package arrayDemo;
public class Demo1 {
        public static void main(String[] args) {
                int b =20;
                change(b);// 实参  实际上的参数
                System.out.println(b);
        }
        public static void change(int a){//形参  形式上的参数
                a=100;
        }
}

结果:20

为什么?看下面分析:

Java基础-面向对象-值传递与引用传递_第1张图片

通俗的讲法就是:形参只是实参创建的一个副本,副本改变了,原本当然不可能跟着改变;

二:引用传递

解释:引用传递弥补了值传递的不足,如果传递的数据量很大,直接复过去的话,会占用大量的内存空间,而引用传递就是将对象的地址值传递过去,函数接收的是原始值的首地址值。在方法的执行过程中,形参和实参的内容相同,指向同一块内存地址,也就是说操作的其实都是源数据,所以方法的执行将会影响到实际对象。

package arrayDemo;
public class Demo1 {
        public static void main(String[] args) {
                int [] a={1,2,3};
                System.out.println(a[0]);
                change(a);
                System.out.println(a[0]);
        }
        public static void change(int[] a ){
                a[0]=100;
        }
}

结果:1 100

为什么?

Java基础-面向对象-值传递与引用传递_第2张图片

由于引用传递,传递的是地址,方法改变的都是同一个地址中的值,

原来a[0]指向0x13地址,值是1,

后来在a[0] 指向的也是0x13地址,将值变成了100

所以,再查询a[0]的值的时候,值自然变成了100

结论:

  1. 基本数据类型传值,对形参的修改不会影响实参;
  2. 引用类型传引用,形参和实参指向同一个内存地址(同一个对象),所以对参数的修改会影响到实际的对象。常见的引用类型:类类型,接口类型和数组
  3. String, Integer, Double等immutable的类型特殊处理,可以理解为值传值,最后的操作不会修改实参对象。

你可能感兴趣的:(Java基础-面向对象-值传递与引用传递)