Java中主要有八种基本类型:byte、short、int、long、float、double、boolean、char。
1 数值型1)整数类型:byte,short,int,longint i = 10; // 整数常量默认是 int 类型long l = 10L; // long 类型常量需在整数后添加 l 或 Llong l1 = i; // 小转大,自动类型转换short l2= (short) i; // 大转小,强制类型转换2)小数类型:float,doubledouble pi = 3.14; // 浮点数常量默认是 double 类型float pi = 3.14F; // float 类型常量需在浮点数后添加 f 或 F 后缀float pi = 3.14; // 错误: 不兼容的类型: 从 double 转换到 float 可能会有损失3.14 == 3.14F; // false3.14 == 3.14D; // truefloat a = 1.0f - 0.9f;float b = 0.9f - 0.8f;a == b; // false注意:1 浮点数采用“尾数+阶码”的编码方式,所以 float, double 都不能表示精确的浮点数,需用 BigDecimal 类型。
2 涉及到类型转换的问题需要特别注意。
补充(进制): 二进制:以 0B 或 0b 开头,如 0B011 八进制:以 0 开头,如 011 十六进制:以 0X 或 0x 开头,如 0xFFint a = 0B011; // 二进制:011 值为 3int b = 011; // 八进制:011 值为 1*8^0+1*8^1=9int c = 0xFF; // 十六进制:FF(二进制即1111 1111)值为2552 字符型(char)可能会有人把字符型和String类型(字符串)搞混,但两个不是一回事。
char 类型表示的是一个16 位 unicode 字符,最小值是 u0000(十进制为 0);最大值是 uffff(65535),而字符串类型(String)是引用类型,下面会提及。
最简单的区分方式:单引号(’ ')为字符型,双引号(" ")为String类型。
表示形式如下:char c1 = 'A'; // 使用单个字符char c2 = 65; // 使用十进制的整数(Unicode 值),[0, 65535]char c3 = 'u0061'; // 使用十六进制的整数,格式'uXXXX',('u0000'~'u00FF')注:常用字符的 unicode1)a~z: a为97,b为98,…其余以此类推(z为97+25=122)2)A~Z:A为65,B为66,…其余以此类推(Z为65+25=90)3 布尔型(boolean)只有两种结果 true或false,默认值为 false。
关系运算符:==,!=,>,<,>=,<= (用于布尔运算,结果为 true或 false)4 占位及数据范围下表为各数据类型的占位及其范围:占位一定要非常熟悉,而数据范围对于前四个整数类型和char的要知道。
float和double只要知道表示范围非常大即可,一般都够用了。
E为科学计数法,表示10的多少次方。
eg: -3.4E38即-3.4 * 1038,3.4E38即3.4 * 1038。
简单分析上表:先看前4个整数类型和char,区别在于整数可以有正负,而char没有负数。
这就涉及二进制整数的表示问题。
有正负则用带符号整数表示,否则就用无符号整数表示,先记住以下两条结论: 1)n位的无符号整数的表示范围为 [0,2n-1],刚好符合 char的范围表示 2)n位的带符号整数的表示范围为 [-2n-1,2n-1-1],符合上面4个整数类型的范围表示注: 1)1byte=8bit,即 1个字节(1B)占 8位(b) 2)float和double范围的推算涉及计算机组成原理中浮点数的表示和运算,是个难点,包括符号、阶码和尾数之间的转换与表示,有兴趣的同学可以去了解一下。
5 类型转换5.1 自动类型转换(隐式类型转换)转换前的数据类型的位数要低于转换后的数据类型 (小转大为自动)。
如32位(4字节)的 int类型可以自动转换为64位(8字节)的double类型// 小 -> 大(低位 -> 高位) byte -> short -> char -> int -> long -> float -> doubleint a=10;double b=a; //自动转换,int到double,得 b的值为 10.05.2 强制类型转换(显式类型转换)转换前的数据类型的位数高于转换后的数据类型 (大转小为强转)。
如64位(8字节)的 double类型转换为32位(4字节)的 int类型时,自动类型转换无法进行,需要进行强制类型转换。
格式:(targetType)value。
byte b = 10; // 系统会自动把整型10当成 byte类型处理int a = 12;byte b = (byte) a; // 强制类型转换(原理同上)float a = (float) 5.6; // 浮点数常量默认是 double类型,强制类型转换char c= (char) 65 // 表示 'A' 字符int i = (int) -12.81; // 强制类型转换(小数部分被截掉),i = -12强制类型转换过程可能造成溢出或损失精度。
public class TypeConversion { // 类型转换 public static void main(String[] args) { int i = 128; byte b = (byte)i; //强转 System.out.println(b); }}输出b的值为 -128,这是因为 byte 表示的数据范围最大为127,所以当 int强制转换为 byte 类型时,值 128 就会导致溢出。
5.3 其他(了解)1)隐含强转整数的默认类型是 int。
小数默认是 double 类型浮点型,在定义 float 类型时必须在数字后面跟上 F 或者 f。
2)表达式的自动提升(了解)所有的 byte、short、char 类型被自动提升到 int 类型。
整个算术表达式最终结果的数据类型被提升到表达式中操作数类型最高的类型。
short s = 5; // 自动类型转换(int转short,大转小)s = s - 2; 输出s提示错误: “不兼容的类型: 从int转换到short可能会有损失”。