一、数据类型的概述
根据不同的数据种类,有不同的大小存储空间,所以在声明变量是时,需要使用某些特定的记号(即关键字),标记当前种类应当分配多大的存储空间。
1.分类
1)基本数据类型
变量中存储的就是数据;特点:简单、较小
2)引用数据类型
变量中存储的不是数据,而是地址(通过地址找到数据);特点:复杂,较大
例如:bean中封装了(size,age,name,adr),它的存储地址时0x10000,那么变量中存储的就是0x10000,通过0x10000找到bean中封装的数据,从而取出某个数据。
2.基本数据类型
1)整数(整数默认是int)
整数 | 字节 |
---|---|
byte | 1个字节 |
short | 2个字节 |
int | 4个字节(有符号/无符号) |
lang | 8个字节 |
//要在后面加一个L,表示长整型,不然超出范围了
lang l=30000000000L;//整数默认是int
System.out.println(l);
2)小数(小数默认是double)
小数 | 字节 |
---|---|
float | 4个字节 |
double | 8个字节 |
//要在后面添加个F,默认为double类型
float f = 3.14F;//小数默认是double
System.out.println(f);
3)字符
字符 | 字节 |
---|---|
char | 2个字节 |
4)布尔
布尔 | 字节 |
---|---|
boolean | 暂定 |
二、 类型转换
boolean类型与其他基本类型不能进行类型的转换(既不能进行自动类型的提升,也不能强制类型转换), 否则,将编译出错。
1)byte型不能自动类型提升到char,char和short之间也不会发生自动类型提升(因为负数的问题)
2)当对小于int的数据类型(byte, char, short)进行运算时,首先会把这些类型的变量值强制转为int类型进行计算,最后会得到int类型的值。因此,如果把2个short类型的值相加,最后得到的结果是int类型,如果需要得到short类型的结果,就必须显示地运算结果转为short类型。
1 //编译出错
2 short s1 = 1;s1 = s1+1;
3 //编译通过
4 //short s1 = 1;s1 = (short)(s1+1)
5 short s1 = 1;s1 += 1;
1.自动类型转换
格式:范围大的数据类型 变量 = 范围小的数据
eg:double d = 1000;
自动类型转换,数据值的数学意义上的大小是不变的。
2.强制转换
格式:范围小的数据类型 变量 = (范围小的数据类型)范围大的数据
eg:int i = (int)6.718 //直接取整:6
强制类型转换,数据值的数学意义上的大小会被改变。
三、不同数据类型的运算
1.整型与字符类型
public class DateType {
public static void main(String[] args) {
System.out.println(1+'1');
}
}
//控制台输出:50,那说明‘1’就表示49,在ascii码表里里面可以查到字符1对应的10进制ascii值为49,”0“表示在后面拼接一个字符0,这样就很容易知道结果了。
2.字符串类型与其他类型
public class DateType {
public static void main(String[] args) {
System.out.println("1"+1+1);
}
}
public class DateType {
public static void main(String[] args) {
System.out.println("1"+1+'1');
}
}
//控制台输出结果都是:111
四、总结
不同的数据类型运算,从左往右计算,如果是整形,正常的10进制计算,遇到字符转成10进制的ascii码值计算,有字符就直接拼接字符,遇到字符的,后面都是字符,就没必要转化。
引用一段例子(原路径搞丢了):
System.out.println(1.1 + 1);// 2.1
System.out.println(1 + 1.1);// 2.1
System.out.println(1 + 0.3);// 1.3
System.out.println(0.3 + 0.03);// 0.32999999999999996
System.out.println(1 + 0.3 + 0.33);// 1.6300000000000001
System.out.println(0.3 + 0.3);// 0.6
System.out.println(1 / 0.5 + 2);// 4.0
System.out.println(“9” + 1 / 0.5);// 92.0
System.out.println(“9” + 1 / 0.5 + 5);// 92.05
System.out.println(1 / 0.5 + 5 + “9”);// 7.09
System.out.println(1 / 0.3);// 3.3333333333333335
System.out.println(3 * 0.3);// 0.8999999999999999
System.out.println(3 * 0.4);// 1.2000000000000002
System.out.println(0.3 * 0.3);// 0.09
不难发现:
基本类型(除了boolean外)可以自动转换的,自动转换的形式为:byte——》short——》char——》 int——》long——》float——》double,其中byte,short,char在运算时是自动转换为int型的,而int与long运算时自动转换为long型。从上可知,float与double运算时是自动转换为double再进行计算的,int与float运算时先转换为float再运算。也就是说,表述范围小的可以自动转换为表述范围大的,(表述范围不是指类型的大小)其次,如果你要得到某一类型的数值时,也可以通过强制转换来实现
五、另外
0)数据转换的类型有两种,第一种是显式转换(强转),第二种是隐式转换(自动转换)。
1)从低级(低范围表述)向高级(高范围表述)类型的数据转换,系统会自动执行,这种类型为隐式转换。
2)精度由高到低:byte,short,int,long,flaot,double(不包括字符类型和逻辑类型)。
3)低精度类型的数据向高精度类型的数据转换的时候,永远不会溢出,并且总是成功的。反之,必须使用显示转换,且必然会有信息丢失,有可能失败。
4)执行显式转换的时候,可能会导致精度损失,只要是boolean类型以外的数据类型都可以显式转换的方式达到。