java语言中数据类型分为8中基本数据类型和3中引用数据类型。
注:引用数据类型的大小统一为4个字节,记录的是其引用对象的地址!
基本数据类型的取值范围:
整数:
Java 语言整型常数的三种表示形式:
q 十进制整数,如:99, -500, 0。
q 八进制整数,要求以 0 开头,如:015。
q 十六进制数,要求 0x 或 0X 开头,如:0x15 。
Java语言的整型常数默认为int型,声明long型常量可以后加‘ l ’或‘ L ’ ,如:
long a = 55555555; //不出错,在Int表示的范围内(21亿内)。
long b = 55555555555;//不加l出错,已经超过int表示的范围。报错:
The literal 55555555555 of type int is out of range
Java中没有无符号类型
浮点数:
Java 浮点类型常量有两种表示形式:
- 十进制数形式,例如:
3.14 314.0 0.314
- 科学记数法形式,如
314e2 314E2 314E-2
double f = 314e2; //314*10^2-->31400.0
double f2 = 314e-2; //314*10^(-2)-->3.14
Float类型的数值有一个后缀F/f ,没有后缀F/f的浮点数值默认为double类型。
也可以在浮点数值后添加后缀D/d, 以明确其为double类型。
浮点数默认是double类型
浮点数存在舍入误差,很多数字不能精确表示。如果需要进行不产生舍入误差的精确数字计算,需要使用BigDecimal类。,所以避免在比较中使用浮点数
字符型:
.单引号用来表示字符常量。例如‘A’是一个字符,它与“A”是不同的,“A”表示含有一个字符的字符串。
. char 类型用来表示在Unicode编码表中的字符。
Unicode编码被设计用来处理各种语言的所有文字,它占2个字节,可允许有65536个字符;ASCII码占1个字节,可允许有128个字符,是Unicode编码表中前128个字符。
char eChar = ‘a’;
char cChar =‘中’;
Unicode具有从0到65535之间的编码,他们通常用从’\u0000’到’\uFFFF’之间的十六进制值来表示(前缀为u表示Unicode)
char c = ‘\u0061;
.Java 语言中还允许使用转义字符 ‘\’ 来将其后的字符转变为其它的含义,
char c2 = ‘\n’; //代表换行符
转义符 | 含义 | Unicode值 |
\b | 退格(backspace) | \u0008 |
\n | 换行 | \u000a |
\r | 回车 | \u0008 |
\t | 制表符(tab) | \u0009 |
\“ | 双引号 | \u0022 |
\‘ | 单引号 | \u0027 |
\ | 反斜杠 | \u005c |
注:以后我们学的String类,其实是字符序列(char sequence)。
boolean类型(一位,不是一个字节)
boolean类型有两个值,true和false,不可以 0 或非 0 的整数替代 true 和 false ,这点和C语言不同。
boolean 类型用来判断逻辑条件,一般用于程序流程控制。
boolean flag ;
flag = ………;
if(flag) {
// true分支
} else {
// false分支
}
实践:Less is More!!请不要这样写:if ( is == true && done == false ) ,只有新手才那么写。
对于任何程序员 if ( whether && !done ) 都不难理解吧。所以去掉所有的==fasle 和 ==true。
自动类型转换
自动类型转换:容量小的数据类型可以自动转换为容量大的数据类型。
整型、实型(常量)、字符型数据可以混合运算。运算中,不同类型的数据先转化为同一类型,然后进行运算。
转换从低级到高级:
摘自:
自动类型转换必须满足转换前的数据类型的位数要低于转换后的数据类型,例如: short数据类型的位数为16位,就可以自动转换位数为32的int类型,同样float数据类型的位数为32,可以自动转换为64位的double类型。
数据类型转换必须满足如下规则:
- 不能对boolean类型进行类型转换。
- 不能把对象类型转换成不相关类的对象。
- 在把容量大的类型转换为容量小的类型时必须使用强制类型转换。
- 转换过程中可能导致溢出或损失精度,例如:
int i =128;
byte b = (byte)i;
因为 byte 类型是 8 位,最大值为127,所以当 int 强制转换为 byte 类型时,值 128 时候就会导致溢出。 - 浮点数到整数的转换是通过舍弃小数得到,而不是四舍五入,例如:
(int)23.7 == 23;
(int)-45.89f == -45
规律一:小的类型自动转化为大的类型
byte b = 125;
int i = b;
规律二:整数类型可以自动转化为浮点类型,可能会产生舍入误差
short s = 7;
long l = s;
long l = 500; // 500是一个整数,整数默认为int,int的范围比long小,所以可以自动转换
float f = 56.71F;
double d = f;
int i = 300;
double d = i;
规律三:字符可以自动提升为整数
int i = 500;
float f = i; // i是int类型,int的取值范围比float小,所以int可以自动转化为float
long s = 259L;
float f = s;
float f = -25; // -25是整数
char c = ‘a’;
int i = c;
特例: 可以将整型常量直接赋值给byte, short, char等类型变量,而不需要进行强制类型转换,只要不超出其表数范围
Short b = 12; //合法
short b = 1234567; //非法
强制类型转换(Cast)
强制类型转换,又被称为造型,用于显式的转换一个数值的类型. 在有可能丢失信息的情况下进行的转换是通过造型来完成的,但可能造成精度降低或溢出。
强制类型转换的语法格式:“(type)var”,运算符“()”中的type表示将值var想要转换成的目标数据类型。
例如:
double x = 3.14;
int nx = (int)x; //值为3
char c = 'a';
int d = c+1;
System.out.println(d);
System.out.println((char)d);
当将一种类型强制转换成另一种类型,而又超出了目标类型的表示范围,就会被截断成为一个完全不同的值。
例如:
int x = 300;
byte bx = (byte)x; //值为44
不能在布尔类型和任何数值类型之间做强制类型转换。
如果需要把布尔类型转换成一个数字该怎么办呢?
基本类型转化时常见错误和问题
1.操作比较大的数时,要留意是否溢出,尤其是整数操作时。
int money = 1000000000; //10亿
int years = 20;
int total = money*years; //返回的是负数
long total1 = money*years; //返回的仍然是负数。默认是int,因此结果会转成int值,再转成long。但是已经发生了数据丢失
long total2 = money*((long)years); //先将一个因子变成long,整个表达式发生提升。全部用long来计算。
所以在进行运算的时候,可以把左边的第一个数有限使用L修饰,让运算的数全部变成L。
L和l 的问题:
不要命名名字为l的变量
long类型使用大写L不要用小写。
int l = 2;
long a = 23451l;
System.out.println(l+1);