一.数据类型,顾名思义,就是数据的类型,java为什么要区分数据类型呢?其实定义数据类型的过程便是在内存条上开辟内存的过程,而它的类型便是决定了这个空间里存什么数据。
数据类型的分类有以下种类:
接下来一一介绍以下几大类
1.整型
byte,short,int,long这四个都是整型的数据类型,同为整型,为什么要将其分为这么多类别呢?这个其实很好理解,计算机的内存都是有限的,如果存储一个很小的数据却用一个很大的空间的类型,岂不是太奢侈了?
我们从表中可以看到int和float的空间大小其实是一样的,那是否意味着int和float就是同样的数据类型呢?其实不然,在内存条上开辟内存的时候,不同的数据类型除了开辟的存储空间不同以外,将数据存入内存的存储方式也不同。
整型的赋值方式有以下几种类别,我们用一小段程序来演示:
/**
*整型赋值方式
*十进制
*二进制:0b+
*八进制:0+
*十六进制:0x+或0X+
*/
public class HelloWorld{
public static void main(String [] args){
int money=88;//十进制
System.out.println(money);
System.out.println("#######");
money=0b100100101;//二进制
System.out.println(money);
System.out.println("#######");
money=0237;//八进制
System.out.println(money);
System.out.println("#######");
money=0x12e;//十六进制
System.out.println(money);
System.out.println("#######");
}
}
2.小数
可以表示小数的类型有float和double两种,两者的差别也是存储空间大小不同。
小数有两种形式,一种是十进制表示法,一种是科学计数法
还有一点需要注意的就是给float和double类型的变量赋值是不一样的,我们看一下下面的程序:
public class Float_Double{
public static void main(String [] args){
float cost;
cost=3.5;
System.out.println(cost);
}
}
编译运行后会发现程序有问题,问题就出在给float类型变量赋值时,3.5是默认的double类型的值,而想要给float类型变量赋值,需要在3.5后面加上f,因为double的精度是高于float的,所以给float赋double类型的值可能会导致精度缺失。
3.字符型
字符型只有char这一种数据类型,它有三种赋值方式,我们来看以下程序:
public class Char{
public static void main(String [] args){
char a,b,c;
a='A';
b=65;
c='\u0041';
System.out.println(a);
System.out.println(b);
System.out.println(c);
}
}
4.布尔型
即boolean类型,它的特点是只有true和false两个值,以下程序演示了boolean类型:
public class Boolean{
public static void main(String [] args){
boolean a=true;
boolean b=false;
System.out.println(a);
System.out.println(b);
}
}
二,数据类型的转换
- 自动类型转换:用于小范围的类型赋值给大范围的类型,且反之不可
- 强制类型转换:在转换的数据前加(强制转换成的类型)。强制转换虽然好用,但同时它存在着两个问题,一是精度溢出,二是精度缺失。以下程序包含了这两个问题:
public class Transform{ public static void main(String [] args){ float a; int b; a=(int)88.8; b=(byte)256; System.out.println(a); System.out.println("######"); System.out.println(b); } }
第一个问题,精度缺失:a的值在强制类型转换后将88.8的小数位舍弃导致了精度缺失;
第二个问题,精度溢出:b的值256的二进制为100000000,而将其转换为byte类型后,只保留了后8位,导致精度溢出,b值为0;