java 值类型和引用类型
来源:互联网 发布:知乎页面显示不正常 编辑:程序博客网 时间:2024/05/22 04:46
java这两种数据类型分别有哪些?
java 中的数据类型分为两大类:值类型(基本数据类型)和引用类型(复合数据类型)
一,值类型分为 1,整数类型(byte,short,int,long) 2,浮点类型(float,double) 3,布尔类型(boolean) 4,字符类型(char)
二,引用值类型 除了值类型外就是引用值类型了,引用值类型有1,类类型(class) 2,数组 3,接口类型(interface)
值类型和引用类型的区别
1 值传递和引用传递
基本数据类型的赋值是值传递,当值类型变量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会被自动清楚。
阅读全文
1 0
- java 值类型和引用类型
- java 值类型和引用类型
- C#值类型和引用类型 vs Java值类型和引用类型
- 值类型和引用类型
- 值类型和引用类型
- 值类型和引用类型
- 值类型和引用类型
- 引用类型和值类型
- 值类型和引用类型
- 值类型和引用类型
- 值类型和引用类型
- 值类型和引用类型
- 值类型和引用类型
- 值类型和引用类型
- 引用类型和值类型
- 值类型和引用类型
- 值类型和引用类型
- 值类型和引用类型
- 制作安装U盘
- Linux环境安装imagemagick
- 【异常解决】jxl.write.biff.JxlWriteException: Attempt to modify a referenced format
- 百度地图小区边界(轮廓)处理
- 编译安装环境部署Nextcloud私有云
- java 值类型和引用类型
- 感知机
- 通过Stringbuffer实现io流读一行,行中位置的内容修改
- 输入一个数组,用二分法查找Java实现
- maven mybatis反向工程插件
- 八大排序算法-Python
- 单点登录之cas4.2.7服务端数据库配置(读数据库验证用户并对密码进行加密)
- SVN服务器搭建--Subversio与TortoiseSVN的配置安装
- druid学习-安装