码迷,mamicode.com
首页 > 编程语言 > 详细

JAVA值类型和引用类型的区别

时间:2018-08-04 13:40:18      阅读:115      评论:0      收藏:0      [点我收藏+]

标签:void   布尔   inter   自动清理   new t   栈空间   机制   引用传递   bsp   

java这两种数据类型分别有哪些?

java 中的数据类型分为两大类:值类型(基本数据类型)和引用类型(复合数据类型) 
一:值类型:

  整数类型(byte,short,int,long)     浮点类型(float,double)   布尔类型(boolean)      字符类型(char) 

二:引用值类型:

       除了值类型外就是引用值类型了,引用值类型有   类类型(class)     数组      接口类型(interface)

值类型和引用类型的区别

值传递和引用传递 
基本数据类型的赋值是值传递,当值类型变量a赋值给值类型变量b之后,再去改变a的值那么b不会随着a的改变而改变。

int a=1;
int b=a;
a=2;
System.out.println("a:"+a+"b:"+b);

引用值类型的赋值是引用传递,传递的是对象的引用地址。当引用值类型变量a赋值给引用值类型变量b之后,再去改变a的值那么b会随着a的改变而改变。

public class Test(){
    int num;
    public Test(int num){
        this.num=num;
    }
    public void steNum(int num){
        this.num=num;
    }
    public static void main(String args[]){
        Test ta= new Test(1);
        Test tb= new Test();
        tb=ta;
        ta.setNum(2);
        System.out.println("ta:"+ta.num+"tb:"+tb.num);
    }
}

2 内存分配 
之所以会出现以上的现象是因为,值类型数据和引用类型数据在在Java中的内存分配不一样。 
值类型数据是直接存储在栈中,Java JVM直接在栈中给数据开辟了一块空间,直接存储数据的值。

int a=1;  //JVM为变量a在栈中开辟了一块空间(假设为A),栈中存储的是 1;
int b=a;  //JVM为变量b在栈中开辟另了一块空间(假设为B),栈中存储的也是 1; 
a=2;      //为变量a重新赋值,栈空间A中存储的值改为2,栈空间B中存储的值不变为1

引用类型数据并不是直接存储在栈中,Java JVM会在堆中给数据分配内存空间,堆存储数据。栈存储的是指向对应堆的地址。可以说是栈中的地址引用了堆中的数据。

Test ta= new Test(1);
/* JVM为ta变量在堆中开辟一块空间(假设为K),那么堆空间K存储的是 1;
JVM为ta变量在栈中开辟一块空间(假设为A),那么栈空间A存储的是指向堆空间的地址(假设为1000)
*/
Test tb= new Test(0);
/* JVM为tb变量在堆中开辟一块空间(假设为J),那么堆空间J存储的是 0;
JVM为ta变量在栈中开辟一块空间(假设为B),那么栈空间B存储的是指向堆空间的地址(假设为2000)*/
tb=ta;
/*栈空间B中存储的地址从2000改为1000(从指向J改为指向K)  现在ta 和 tb 都引用堆空间K*/
ta.setNum(2);
/*堆空间K中存储的值改为2 所以ta.num和tb.num 都是2 */

垃圾回收机制

当堆空间存储的对象没有被栈空间中存储的地址所指向时(引用时),该对象会被自动清理掉。如前面提到的堆空间J中本来存储着 0

Test tb= new Test(0);

但是

tb=ta;

   不再有地址指向堆空间J中本来存储的0,0会被自动清楚。

JAVA值类型和引用类型的区别

标签:void   布尔   inter   自动清理   new t   栈空间   机制   引用传递   bsp   

原文地址:https://www.cnblogs.com/ygxh/p/9418332.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!