Java中的值传递和引用传递

数据类型

首先了解一下Java中的数据类型
数据类型:

  • 基本类型
  • 对象类型

对应的,变量类型:

  • 基本类型
    包括byte,short,int,long,char,float,double,boolean...
  • 引用类型
    包括 类、接口和数组

基本类型和引用类型的区别

  • 存值
    基本类型的变量保存原始值,即它代表的值就是数值本身
    引用类型的变量保存引用值,指向内存空间的地址,对象本身存放在这个地址的位置
  • 空间分配
    基本类型是在声明时就分配空间
    引用类型在声明时只分配引用空间,不分配数据空间
    "引用"也是占用空间的,一个空Object对象的引用大小大概是4byte

值传递和引用传递

进入主题

概念

值传递:方法调用时,实参把它的值直接传递给形参,函数接收到的是原始值的copy,此时内存中存在两个相等的基本类型,即实参和形参,后面方法都是对这个形参的修改,不影响实参
引用传递:方法调用时,实参把它的引用传给形参,函数接收到的是原始值的内存地址,此时实参和形参指向同一片内存地址,对形参的修改会影响到实参

举一个栗子:

class MyObj{
    public int b=99;
}
 public static void main(String[] args) { 
        ReferencePkValue2 t = new ReferencePkValue2(); 
        int a=99; 
        t.test1(a);//这里传递的参数a就是按值传递 
        System.out.println(a); //此处是对实参的输出 99
         
        MyObj obj=new MyObj(); 
        t.test2(obj);//这里传递的参数obj就是引用传递
        System.out.println(obj.b); //此处是对实参的输出 100 
    } 
     
    public void test1(int a){ 
        a++;
        System.out.println(a);  //此处是对形参的输出 100 
        } 
     
    public void test2(MyObj obj){ 
        obj.b=100;
        System.out.println(obj.b); //此处是对形参的输出 100 
        }

输出:
100;
99;
100;
100;
由结果可见,只有在值传递时实参没有受到影响

这里要特殊考虑String,以及IntegerDouble等几个基本类型包装类,它们都是immutable类型,
因为没有提供自身修改的函数,每次操作都是新生成一个对象,所以要特殊对待,可以认为是和基本数据类型相似,传值操作

再看一个栗子:

public static void main(String[] args){
        ReferencePkValue1 pk=new ReferencePkValue1();
        //String类似基本类型,值传递,不会改变实际参数的值
        String test1="Hello";
        pk.change(test1);
        System.out.println(test1); //输出为 Hello
         
        //StringBuffer和StringBuilder等是引用传递
        StringBuffer test2=new StringBuffer("Hello");
        pk.change(test2);
         
        System.out.println(test2.toString()); //输出为 Helloworld
    }
     
    public void change(String str){
        str=str+"world";
    }
     
    public void change(StringBuffer str){
        str.append("world");
    }

总结

  • 基本数据类型传值,对形参的修改不会影响实参
  • 引用类型传引用,形参和实参指向同一个内存地址(同一个对象),所以对参数的修改会影响到实际的对象
  • String, Integer, Doubleimmutable的类型特殊处理,可以理解为传值,最后的操作不会修改实参对象
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • 引言 学习过C语言的同学都很清楚在c中调用方法的参数有值传递和引用传递两种方式。关于值传递和引用传递网上有许多的博...
    宁愿呢阅读 5,235评论 0 4
  • 方法调用是编程语言中非常重要的一个特性,在方法调用时,通常需要传递一些参数来完成特定功能。 我们首先观察一个简单的...
    小人物灌篮阅读 3,576评论 0 0
  • 今天复习Java基础,发现有一个概念好像有点模糊了,就是值传递,Think in Java中说Java只有值传递。...
    莫那一鲁道阅读 3,793评论 0 4
  • 当一个对象被当作参数传递到一个方法后,此方法可改变这个对象的属性,并可返回变化后的结果,那么这里到底是值传递还是引...
    峰峰小阅读 2,839评论 0 1
  • 似乎从大学将要离开学校之时,工作这件事就成了新的难题。我们脱离了一群人向一个目标奋斗的氛围,转而分散各地,各...
    行一jxy阅读 1,396评论 0 0

友情链接更多精彩内容