Java中值传递和引用传递

目录介绍

  • 01.基本类型和引用类型
  • 02.什么是值传递
  • 03.什么是引用传递
  • 04.通过案例分析
  • 05.案例过程分析
  • 06.得出的结论

好消息

  • 博客笔记大汇总【16年3月到至今】,包括Java基础及深入知识点,Android技术博客,Python学习笔记等等,还包括平时开发中遇到的bug汇总,当然也在工作之余收集了大量的面试题,长期更新维护并且修正,持续完善……开源的文件是markdown格式的!同时也开源了生活博客,从12年起,积累共计N篇[近100万字,陆续搬到网上],转载请注明出处,谢谢!
  • 链接地址:https://github.com/yangchong211/YCBlogs
  • 如果觉得好,可以star一下,谢谢!当然也欢迎提出建议,万事起于忽微,量变引起质变!

01.基本类型和引用类型

  • Java中的数据类型分为两种为基本类型和引用类型。
    • 1、基本类型的变量保存原始值,所以变量就是数据本身。
      • 常见的基本类型:byte,short,int,long,char,float,double,Boolean,returnAddress。
    • 2、引用类型的变量保存引用值,所谓的引用值就是对象所在内存空间的“首地址值”,通过对这个引用值来操作对象。
      • 常见的引用类型:类类型,接口类型和数组。
  • 基本类型(primitive types)
    • primitive types 包括boolean类型以及数值类型(numeric types)。numeric types又分为整型(integer types)和浮点型(floating-point type)。整型有5种:byte short int long char(char本质上是一种特殊的int)。浮点类型有float和double。
  • 引用类型(reference types)
    • ①接口 ②类 ③数组

02.什么是值传递

  • 在方法的调用过程中,实参把它的实际值传递给形参,此传递过程就是将实参的值复制一份传递到函数中,这样如果在函数中对该值(形参的值)进行了操作将不会影响实参的值。因为是直接复制,所以这种方式在传递大量数据时,运行效率会特别低下。
  • 比如String类,设计成不可变的,所以每次赋值都是重新创建一个新的对象,因此是值传递!

03.什么是引用传递

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

04.通过案例分析

  • 看下面代码案例
    private void test1(){
        Demo demo = new Demo();
        demo.change(demo.str, demo.ch);
        Log.d("yc---",demo.str);
        Log.d("yc---", Arrays.toString(demo.ch));
        //打印值
        //yc---: hello
        //yc---: [c, b]
    }
    
    public class Demo {
        String str = new String("hello");
        char[] ch = {'a', 'b'};
        public void change(String str, char[] ch) {
            str = "ok";
            ch[0] = 'c';
        }
    }
    

05.案例过程分析

  • 为对象分配空间
    • Java中值传递和引用传递
  • 执行change()方法
    • 执行前实参(黑色)和形参(红色)的指向如下:
    • Java中值传递和引用传递
  • 最后打印
    • 因为String是不可变类且为值传递,而ch[]是引用传递,所以方法中的str = “ok”,相当于重新创建一个对象并没有改变实参str的值,数组是引用传递,直接改变,所以执行完方法后,指向关系如下:
    • Java中值传递和引用传递

06.得出的结论

  • 通过上面的分析我们可以得出以下结论:
    • 基本数据类型传值,对形参的修改不会影响实参;
    • 引用类型传引用,形参和实参指向同一个内存地址(同一个对象),所以对参数的修改会影响到实际的对象。
    • String, Integer, Double等immutable的类型特殊处理,可以理解为传值,最后的操作不会修改实参对象。
  • 如何理解引用类型的按值传递?
    • 引用类型的按值传递,传递的是对象的地址。只是得到元素的地址值,并没有复制元素。比如数组,就是引用传递,假如说是值传递,那么在方法调用赋值中,将实参的值复制一份传递到函数中将会非常影响效率。

其他介绍

01.关于博客汇总链接

02.关于我的博客