什么是primitive主数据类型呢

        primitive就是int,double,boolean这些数据类型,它们不是对象,只是内存里的几个字节空间而已。注意int是primitive,而Integer不是!Integer是一个类。java调用方法的时候参数是"pass by value"的,如果你有一个方法int myMethod(int i),调用者手里的i是10,调用myMethod(10),这时候,myMethod得到的是10的一个拷贝。如果myMethod把i改变了,如i++;i变成11了,调用者手里的i并不跟着变,只能等myMethod return i以后才能看到结果。
        如果是int myMethod(Integer i)呢? 这里的i是Integer类的一个实例(一个对象),myMethod得到的不再是i的一个拷贝,而是i的地址的一个拷贝。这时,如果myMethod改变了i,调用者手里的i也跟着变了,因为两者的i都是相同的地址,指向同一个Integer对象。
        由此看来,有人说java里primitive是“pass by value”而对象是“pass by reference“是不对的,java永远是pass by value,就是java只会传拷贝,只不过传primitive的时候拷贝的是参数值,传非primitive的时候拷贝的是对象的地址。如果你学过C++,可以比较一下myMethod(Integer i)和C++里的myMethod(int& i)看有什么不同。注意int[]是按“非primitive”传的,就是说传的是数组的地址。显然,java这种设计是出于效率的考虑。如果把整个对象拷贝一次或把整个数组拷贝一次多浪费,还是说,“哎,那个对象的地址在这儿,要玩自己去玩吧”省事。而primitive呢,还是传拷贝比较省事。就几个字节嘛,有的还不如一个地址长呢。何况这几个字节是在栈(stack)里传的,而给了地址还要按地址到堆(heap)里去找。这两者各有各的用处,有的时候我们非要传地址不可(哪些时候? 你自己想想,想不出再来问),所以才发明了Integer、Boolean、Double这些类,还在里面加上了和字符串互相转换的功能,很好。

        但显然,能用primitive的时候不用非primitive。


在Java的方法调用中,方法中的参数是以传值的形式进行的,不管它是什么数据类型。如果是基本数据类型,则就是传入该值的一个拷贝;如果是类类型,则传入的是引用的一个拷贝。归根结底还是传的值。出处

  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值