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值类型和引用类型的区别的更多相关文章

  1. JAVA初学(1):值类型和引用类型的区别

    JAVA值类型和引用类型的区别(转)                                                          [定义] 引用类型表示你操作的数据是同一个,也就 ...

  2. C#类和接口、虚方法和抽象方法及值类型和引用类型的区别

    1.C#类和接口的区别接口是负责功能的定义,项目中通过接口来规范类,操作类以及抽象类的概念!而类是负责功能的具体实现!在类中也有抽象类的定义,抽象类与接口的区别在于:抽象类是一个不完全的类,类里面有抽 ...

  3. C#入门篇6-7:字符串操作 看看字符串的特殊之处 值类型与引用类型的区别

    //看看字符串的特殊之处值类型与引用类型的区别 public static void CompareString(string stra, string strb, int i) { #region ...

  4. C# 值类型和引用类型的区别

    C#  值类型和引用类型的区别 1. 值类型的数据存储在内存的栈中:引用类型的数据存储在内存的堆中,而内存单元中只存放堆中对象的地址. 2. 值类型存取速度快,引用类型存取速度慢. 3. 值类型表示实 ...

  5. JavaScript中值类型和引用类型的区别

    JavaScript的数据类型分为两类:原始类型和对象类型.其中,原始类型包括:数字.字符串和布尔值.此外,JavaScript中还有两个特殊的原始值:null和undefined,它们既不是数字也不 ...

  6. js中的值类型和引用类型的区别

    1.JavaScript中的变量类型有哪些? (1)值类型(基本类型):字符串(String).数值(Number).布尔值(Boolean).Undefined.Null  (这5种基本数据类型是按 ...

  7. C#中关于值类型和引用类型的区别

    小声哔哔 一直以来对于值类型与引用类型之间的区别都不是特别清晰,直到踩了坑.... 正好最新闲暇,便想着梳理梳理这一两年来遇到的奇葩问题和解决方案,顺便就把它给拎出来记一下,免得以后再摔跤 值类型与引 ...

  8. java中值类型和引用类型的区别

    [定义] 引用类型表示你操作的数据是同一个,也就是说当你传一个参数给另一个方法时,你在另一个方法中改变这个变量的值,那么调用这个方法是传入的变量的值也将改变. 值类型表示复制一个当前变量传给方法,当你 ...

  9. 学习记录 java 值类型和引用类型的知识

    1. Java中值类型和引用类型的不同? [定义] 引用类型表示你操作的数据是同一个,也就是说当你传一个参数给另一个方法时,你在另一个方法中改变这个变量的值, 那么调用这个方法是传入的变量的值也将改变 ...

随机推荐

  1. Android 开发 Camera类的拍照与录像

    前言 在开发Android应用的时候,如果需要调用摄像头拍照或者录像,除了通过Intent调用系统现有相机应用进行拍照录像之外,还可以通过直接调用Camera硬件去去获取摄像头进行拍照录像的操作.本篇 ...

  2. jmeter+ant+jekins的持续集成自动化搭建-基于虚拟机的linux系统

    准备软件: 1.ant压缩包,2.jmeter压缩包,3.jenkins的war包压缩包,4.tomcat压缩包,5.build.xml文件,6.jmeter生成的***.jmx格式文件. 基本原理: ...

  3. Must practice programming questions in all languages

    To master any programming languages, you need to definitely solve/practice the below-listed problems ...

  4. VUE框架的初识

    VUE框架的初识 初步了解Vue.js框架(渐进式前端框架) Vue.js是一种轻量级的前端MVVM框架.同时吸收了React(组件化)和Angular(灵活指令页面操作)的优点.是一套构建用户界面的 ...

  5. Chrome添加Axure RP插件

    之前一直用 Firefox 浏览器浏览原型文件,一直用不惯,而且用 Firefox 的唯一目的就是看原型.其他都是用 Chrome 浏览器,来回切换,各种麻烦,然后下定决心解决 Chrome 浏览器无 ...

  6. AWS 实战

    AWS (Amazon Web Service) 要使用亚马逊的免费云服务 AWS,必须先注册账号,然后绑定信用卡. 创建 AMI(Amazon Machine Image) 选择 EC2 服务 EC ...

  7. ArcGIS 图层旋转工具-arcgis案例实习教程

    ArcGIS 图层旋转工具-arcgis案例实习教程 联系方式:谢老师,135-4855-4328,xiexiaokui#qq.com 目的:对输入图层执行坐标旋转 使用方法:输入图层,旋转中心,旋转 ...

  8. SQL游标在递归是的时候提示 "游标" 名称已经存在的问题

    游标的语法: DECLARE cursor_name CURSOR [ LOCAL | GLOBAL ] [ FORWARD_ONLY | SCROLL ] [ STATIC | KEYSET | D ...

  9. css预处理器:Sass LASS Stylus

    语法 Sass h1 { color: #0982C1; } h1 color: #0982c1 LESS h1 { color: #0982C1; } Stylus /* style.styl */ ...

  10. idea中经常用到的快捷键

    Ctrl+Alt+L   格式化代码 (但是在jsp或js中不给力,不如eclipse好用) Ctrl+G        搜索行数 Ctrl+F12     搜索方法,变量等... Ctrl+F8   ...