值类型和引用类型
定义:
引用类型表是你操作的数据就是同一个 ,也就是说当你传一个参数给另一个方法时,你在另一个方法中改变这个变量的值,那么调用这个方法时传入的变量的值也将改变。
值类型表示复制一个当前变量传给方法,当你在这个方法中改变这个变量时,最初声明的值不会变。
通俗的说法:值类型就是现金,要用直接用;引用类型就是存折,要用还得先去银行取现。
值类型:也就是基本数据类型
基本数据类型常被称为四类八种。
四类:1,整型、2,浮点型、3,字符型、4,逻辑型。
八种:1,整型有三种:byte , short,int ,long
2,浮点型有二种:float,double
3,字符型有一种:char
4,逻辑型有一种:boolean
除了四类八种基本类型外,所有的类型都称为引用类型。
值传递和引用传递
值传递:基本数据类型赋值都属于值传递,值传递传递的是实实在在的变量值
引用传递:传递的是对象的引用地址,也就是它本身(自己最通俗的理解)。
引用传递:传的是地址,就是将实参的地址传给形参,形参改变了 ,实参当然也就变了,因为他们指向了相同的地址。
引用,和我们理解的指针差不多,但它又不需要我们具体去操作 。
内存分配
一个具有值类型(value type)的数据存放在栈内的一个变量中, 即是在栈中分配内存空间,直接存储所包含的值,其值就代表数据本身。值类型的数据具有较快的存取速度。
一个具有引用类型(reference type)的数据并不驻留在栈中,而是存储于堆中。即是在堆中分配内存空间,不直接存储所包含的值 ,而是指向所要存储的值,其代表的是所指向的地址。当访问一个具有引用类型的数据时 ,需要到栈中检查变量的内容,改变两引用堆中的一个实际数据。引用类型的数据比值类型的数据具有更大的存储规模和较低的访问速度。
Java中的垃圾回收机制
当一个堆内存中的对象没有被栈内存中表示地址的值“引用”时,这个对象就被称为垃圾对象,它无法被使用但却占据着内存中的区域,好比这样:
String s = new String("person");
S = new String ("man");
S本来指向堆内存中值person的对象的,但是s突然讨厌person了 ,它指向了堆内存中的man对象,person就像一个孤儿一样被s遗弃了 ,但是person比孤儿还要惨,因为没有什么能找到它 ,除了位高权重的“垃圾回收器”,不过被当官的找到往往没什么好事,尤其是这个“垃圾回收器”,它会毫不留情的把垃圾清理走,并无情的销毁,以便释放内存。
装箱和拆箱
装箱和拆箱就是值类型和引用类型的转化的过程。
将一个值类型转换成引用类型的称为装箱。
讲一个引用类型的转换成值类型的称为拆箱。
值类型变量装箱成为一个引用类型的变量时,首先会在托管上为新的引用类型变量分配内存空间,然后将值类型变量拷贝到托管堆上新分配的对象内存中,最后返回新分配的对象内存地址。
装箱操作是可逆的,所有就有了拆箱的操作,拆箱操作获取指向对象中包含值类型部分的指针,然后由程序员手动将其对应的值拷贝给值类型变量。