java基本数据类型和引⽤数据类型的区别
java valueof⼀、基本数据类型:
byte:Java中最⼩的数据类型,在内存中占8位(bit),即1个字节,取值范围-128~127,默认值0
short:短整型,在内存中占16位,即2个字节,取值范围-32768~32717,默认值0
int:整型,⽤于存储整数,在内在中占32位,即4个字节,取值范围-2147483648~2147483647,默认值0
long:长整型,在内存中占64位,即8个字节-2^63~2^63-1,默认值0L
float:浮点型,在内存中占32位,即4个字节,⽤于存储带⼩数点的数字(与double的区别在于float类型有效⼩数点只有6~7位),默认值0 double:双精度浮点型,⽤于存储带有⼩数点的数字,在内存中占64位,即8个字节,默认值0
char:字符型,⽤于存储单个字符,占16位,即2个字节,取值范围0~65535,默认值为空
boolean:布尔类型,占1个字节,⽤于判断真或假(仅有两个值,即true、false),默认值false
⼆、Java数据类型基本概念:
数据类型在计算机语⾔⾥⾯,是对内存位置的⼀个抽象表达⽅式,可以理解为针对内存的⼀种抽象的表达⽅式。接触每种语⾔的时候,都会存在数据类型的认识,有复杂的、简单的,各种数据类型都需要在学习初期去了解,Java是强类型语⾔,所以Java对于数据类型的规范会相对严格。数据类型是语⾔的抽象原⼦概念,可以说是语⾔中最基本的单元定义,在Java⾥⾯,本质上讲将数据类型分为两种:基本类型和引⽤数据类型。
  基本类型:简单数据类型是不能简化的、内置的数据类型、由编程语⾔本⾝定义,它表⽰了真实的数字、字符和整数。
  引⽤数据类型:Java语⾔本⾝不⽀持C++中的结构(struct)或联合(union)数据类型,它的复合数据类型⼀般都是通过类或接⼝进⾏构造,类提供了捆绑数据和⽅法的⽅式,同时可以针对程序外部进⾏信息隐藏。
三、Java中的数据类型与内存的关系
在Java中,每个存放数据的变量都是有类型的,如:
char ch; float x; int a,b,c;
ch是字符型的,就会分配到2个字节内存。不同类型的变量在内存中分配的字节数不同,同时存储⽅式也是不同的。
所以给变量赋值前需要先确定变量的类型,确定了变量的类型,即确定了数据需分配内存空间的⼤⼩,数据在内存的存储⽅式。
四、Java数据类型在内存中的存储:
1)基本数据类型的存储原理:所有的简单数据类型不存在“引⽤”的概念,基本数据类型都是直接存储在内存中的内存栈上的,数据本⾝的值就是存储在栈空间⾥⾯,⽽Java语⾔⾥⾯⼋种数据类型是这种存储模型;
2)引⽤类型的存储原理:引⽤类型继承于Object类(也是引⽤类型)都是按照Java⾥⾯存储对象的内存模型来进⾏数据存储的,使⽤Java内存堆和内存栈来进⾏这种类型的数据存储,简单地讲,“引⽤”是存储在有序的内存栈上的,⽽对象本⾝的值存储在内存堆上的;
区别:基本数据类型和引⽤类型的区别主要在于基本数据类型是分配在栈上的,⽽引⽤类型是分配在堆上的(需要java中的栈、堆概念),
基本类型和引⽤类型的内存模型本质上是不⼀样的。
例1:我们分析⼀下”==“和equals()的区别。
⾸先,我定以两个String对象
Stringa="abc";
Stringb="abc";
然后
if(a==b){
System.out.println("a==b");
}else{
System.out.println("a!=b");}
程序输出a!=b
原因:a和b的地址是不相同的,a==b⽐较的是两个变量的地址
例2:定义两个基本类型
int a=4;
int b=4;
if(a==b){System.out.println("a==b");}
else
{System.out.println("a!=b");}
输出:a==b
原因:==⽐较的是两个变量的内容
猜想:不论是基本数据类型还是引⽤类型,他们都会先在栈中分配⼀块内存,对于基本类型来说,这块区域包含的是基本类型的内容;⽽对于对象类型来说,这块区域包含的是指向真正内容的指针,真正的内容被⼿动的分配在堆上。
五、Java基本类型取值范围计算
从计算机组成原理的⾓度可以解释:
byte在计算机中是占8个字节的,⽽且byte 是有符号整形,⽤⼆进制表⽰时候最⾼位为符号位 0代表正数 1代表负数。
最⼤值:127      即2的7次⽅减去1;最⼩值:即2的7次前⾯加个负符号:-128 。(包含开始,不包含结尾);
正数在计算机中是以原码形式存在的;
负数在计算机中是以其补码形式存在的,就是负数的绝对值的原码转为⼆进制再按位取反后加1。
下边这个10和-10为例来介绍的:10原码:00001010  它在计算机中的存储就是 0000 1010,-10 按照前⾯说的算除其绝对值为10,转为⼆进制 0000 1010 按位取反 1111 0101 再加1后:1111 0110,此为-10补码,好的,计算机中的1111 0110就是代表-10了。
我们来看 -128  绝对值128的⼆进制表⽰:1000 0000 按位取反 0111 1111 加1后:1000 0000,也就是说 -128在计算机中的表⽰就是 1000 0000 了,再来看⼀下-129 在计算机中的表⽰,绝对值129的范围已经超出了了byte的位数。所以要注意这类问题;
六、java类型介绍
1、概述:
Java中的数据类型分为引⽤数据类型和基本数据类型。
引⽤数据类型分3种:类,接⼝,数组;
基本数据类型⼜分布尔类型和数值类型;
布尔类型:boolean(逻辑型) trure or false默认是false;
数值类型分定点类型和浮点类型;
定点类型分整数类型和字符型;
2、JAVA变量的默认初始化
类型默认初始化值
boolean false
int0
short0
float0.0
double0.0
char\
long0
byte0
object null
3、类型详细讲解:
1)整数类型:byte、short、int、long都是表⽰整数的,只不过他们的取值范围不⼀样。 byte(字节类型)  ⼀个byte 8位,取值范围为-
128~127,占⽤1个字节(-2的7次⽅到2的7次⽅-1)默认是0 short(短整型)  ⼀个short 16位,取值范围为-32768~32767,占⽤2个字节(-2的15次⽅到2的15次⽅-1)默认是0 int(整型)      ⼀个int 32位,
取值范围为(-2147483648~2147483647),占⽤4个字节(-2的31次⽅到2的31次⽅-1)默认是0 long(长整型)  ⼀个long 64位,取值范围为(-9223372036854774808~9223372036854774807),占⽤8个字节(-2的63次⽅到2的63次⽅-1)默认是0L或0l推荐⽤⼤写;
可以看到byte和short的取值范围⽐较⼩,⽽long的取值范围太⼤,占⽤的空间多,基本上int可以满⾜我们的⽇常的计算了,⽽且int也是使⽤的最多的整型类型了。在通常情况下,如果JAVA中出现了⼀个整数数字⽐如35,那么这个数字就是int型的,如果我们希望它是byte型的,可以在数据后加上⼤写的  B:35B,表⽰它是byte型的,同样的35S表⽰short型,35L表⽰long型的,表⽰int我们可以什么都不⽤加,但是如果要表⽰long型的,就⼀定要在数据后⾯加“L”。
1.1)定点常量
定点常量是整型常数,它可⽤⼗进制、⼋进制、⼗六种进制三种⽅式来表⽰。
⼗进制定点常量:如123、-456、0。
⼋进制定点常量:以0前导,形式为d。如0123表⽰⼗进制数83,-011表⽰⼗进制数-9。
⼗六进制定点常量:以0x或0X开头,如0x123表⽰⼗进制数291,-0X12表⽰⼗进制数-18。
1.2)定点变量
定点变量即整型变量,可细分成字节型变量、整型变量、短整型变量和长整型变量四种。
对各种定点变量的开销内存字节数和数值范围作简要说明。
需要注意的是,如果要将⼀定点常量赋值给⼀个定点变量,需要查验常量是否在该变量的表达范围内,如超出范围程序会编译出错。
2)char型(字符型)
Java中⼀个字符(char)表⽰Unicode字符集中的⼀个元素。
Unicode字符由16位组成,因此,有(65535)个不同的字符可⽤,
Unicode字符集包含所有不同语⾔的字符,以及数学、科学、⽂字中的常⽤符号,所以给了我们很⼤的灵活性。字符由单引号括起来的单个字符表达,通常⽤16进制表⽰,
范围从’’到’?’(u告诉编译器你在⽤两个字节[16位]字符信息表⽰⼀个Unicode字符)。
⽤于存放字符的数据类型,占⽤2个字节,采⽤unicode编码,它的前128字节编码与ASCII兼容,字符的存储范围在\~\?,在定义字符型的数据时候要注意加' ',⽐如 '1'表⽰字符'1'⽽不是数值1。
2.1)字符常量
字符常量指⽤单引号括起来的单个字符,如‘a’,‘A’,请特别注意,字符的定界符是单引号,⽽⾮双引号。
除了以上所述形式的字符常量值之外,Java还允许使⽤⼀种特殊形式的字符常量值,
这通常⽤于表⽰难以⽤⼀般字符来表⽰的字符,这种特殊形式的字符是以⼀个“\”开头的字符序列,称为转义字符。
Java中的常⽤转义字符见表
2.2)字符变量
以char定义的变量,如char c='a';
要特别加以说明的是,Java的⽂本编码采⽤Unicode集,Java字符16位⽆符号型数据,⼀个字符变量在内存中占2个字节。
注:char c = ' 1 ',我们试着输出c看看,System.out.println(c);结果就是1,⽽如果我们这样输出呢S
ystem.out.println(c+0);结果却变成了49,这是因为0是int型,进⾏了向上类型转换,结果是个int型。如果我们这样定义c看看,char c = ' \1 ';输出的结果仍然是1,这是因为字
符'1'对应着unicode编码就是\1。
3)浮点类型:分float和double是表⽰浮点型的数据类型,他们之间的区别在于他们的精确度不同。
3.1)浮点常量
即带⼩数点的实型数值,可以由直接带⼩数点的数值和科学计数法两种形式来表⽰:
带⼩数点的数值形式:由数字和⼩数点组成,如0.123、.123、123.、123.0。
科学计数法表⽰形式:由⼀般实数和e±n(E±n)组成,如12.3e3、5E-3,它们分别表⽰12.3乘以10的3次⽅,5乘以10的-3次⽅。需要注意的是,e或E之前必须有数字,且e或E后⾯的指数必须为整数。
3.2)浮点变量
浮点变量有单精度变量和双精度变量之分,不同的精度开销的内存字节数和表达的数值范围均有区别。两种浮点变量占内存字节数和数值范围
浮点常量也有单精度和双精度之分,前⾯列出的常量均是双精度常量,如果要特别说明为单精度常量,可以数据末尾加上f或F作为后缀,如
12.34f。如果要特别指明⼀个浮点常量是双精度常量,数据末尾不需要添加后缀,或者在数据末尾加上d或D作为后缀,如12.34d。
float (单精度浮点型)⼀个float 32位,占⽤4个字节,例3.2F,默认是0.0f,  3.402823e+38 ~1.401298e-45(e+38表⽰是乘以10的38次⽅,同样,e-45表⽰乘以10的负45次⽅)。 double (双精度浮点型)⼀个dobule 64位占⽤8个字节,例3.2,默认是0.0,
1.797693e+308~4.9000000e-324 占⽤8个字节
注:double型⽐float型存储范围更⼤,精度更⾼,所以通常的浮点型的数据在不声明的情况下都是double型的。
如果要表⽰⼀个数据是float型的,可以在数据后⾯加上“F”。浮点型的数据是不能完全精确的,所以有的时候在计算的时候可能会在⼩数点最后⼏位出现浮动,这是正常的。
相关介绍:
在Java基本类型在使⽤字⾯量赋值的时候,有⼏个简单的特性如下:
1】当整数类型的数据使⽤字⾯量赋值的时候,默认值为int类型,就是直接使⽤0或者其他数字的时候,值的类型为int类型,所以当使⽤long a = 0这种赋值⽅式的时候,JVM内部存在数据转换。
2】浮点类型的数据使⽤字⾯量赋值的时候,默认值为double类型,就是当字⾯两出现的时候,JVM会使⽤double类型的数据类型。
3】从JDK 5.0开始,Java⾥⾯出现了⾃动拆箱解箱的操作,基于这点需要做⼀定的说明:
对应原始的数据类型,每种数据类型都存在⼀个引⽤类型的封装类,分别为Boolean、Short、Float、Double、Byte、Int、  Long、Character,这些类型都是内置的封装类,这些封装类(Wrapper)提供了很直观的⽅法,针对封装类需要说明的是,每种封装类都有⼀个xxxValue()的⽅法,通过这种⽅法可以把它引⽤的对象⾥⾯的值转化成为基本变量的值,不仅仅如此,每个封装类都还存在⼀个
valueOf(String)的⽅法直接把字符串对象转换为相应的简单类型。
 在JDK 5.0之前,没有存在⾃动拆解箱的操作,即Auto Box操作,所以在这之前是不能使⽤以下⽅式的赋值代码的:Integer a = 0;//这种赋值⽅式不能够在JDK 1.4以及以下的JDK编译器中通过,但是JDK 5.0出现了⾃动拆解箱的操作,所以在JDK 5.0以上的编译器中,以上的代码是可以通过的
引⽤数据类型:
数组
String:字符串型,⽤于存储⼀串字符
Java变量声明及使⽤:
数据类型变量名 =值、表达式;
例:String name = "柯南";
int a= 50;
注:“=”并不是数学中的“等号”,⽽是⼀个赋值运算符
Java变量命名规则:
1:必须以字母、下划线“_”、或“$”符号开头
2:可以包括数字、区分⼤⼩写
3:不能使⽤Java语⾔的关键字,例如int、class、public等
Java中的六种运算符:
·  算术运算符
·  赋值运算符
·  关系运算符
·  逻辑运算符
·  位运算符
·    三元运算符
算术运算符:
+:加法运算,求操作数的和
-:减法运算,求操作数的差
*:乘法运算,求操作数的乘积
/
:除法运算,求操作数的商
%:求余运算,求操作数相除的余数
++:⾃增,操作数⾃加1
--:⾃减,操作数⾃减1
赋值运算符:
=:将右边的值赋给左边,例:int a = 1;
+=:左右两边的和相加赋给左边,例:int a = 1; a+=2;结果a的值为3
-=:左边减去右边的差赋给左边,例:int a =5;a-=2;结果a的值为3
*=:两边数值相乘的值赋给左边,例:int a = 2;a*=2;结果a的值为4
/=:左边除以右边的值赋给左边,例:int a = 6;a/=2;结果a的值为3
%=:左边除以右边的余数赋给左边,例:int a =7;a%=2;结果a的值为1
关系运算符
>:⼤于,例:int a = 1;int b = 2;System.out.print(a > b);其结果为false <:⼩于,例:int a = 1;int b = 2;System.out.print(a < b);其结果为true
>=:⼤于等于,例:int a = 1;int b = 2;System.out.print(a >= b);其结果为false <=:⼩于等于,例:int a = 1;int b = 2;System.out.print(a <= b);其结果为true ==:等于,例:int a = 1;int b = 2;System.out.print(a == b);其结果为false
!=:不等于,例:int a = 1;int b = 2;System.out.print(a != b);其结果为true
其结果都是boolean类型,即要么是true要么是false
逻辑运算符
&&:与、并且(短路),两个条件同时为真时,结果为真
||:或、或者(短路),两个条件有⼀个为真时,结果即为真
!:⾮,(!+条件)  条件为真时,结果为假
Java中的数据类型转换
1:⾃动数据类型转换(放⼤转换)
满⾜⾃动数据类型转换条件:
1)两种类型要兼容:如数值类型(整型和浮点型)
2)⽬标类型⼤于源类型:例如int型数据可以⾃动转换为double类型
2:强制数据类型转换(缩⼩转换)
在变量前加上括号,在括号中指定要强制转换的类型
例:double a = 40.9;

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。