Java数据类型
变量是一个内存中开辟的被命名的且被特定的数据类型约束的空间用来存储变量的值.
变量按照数据类型来分 :
- 基本数据类型 : 内存空间中保存的是数据本身
- 数值型
(1) 整数
byte 1字节 -128~127
short 2字节 -32768~32767
int 4字节 -20多亿~20多亿
long 8字节 -巨大~巨大
(2) 浮点数
float 4字节 -1038~1038
double 8字节 -10308~10308 - 字符型
char 2字节 - 布尔型
boolean 1字节 true, false
- 数值型
- 引用数据类型 : 内存空间中保存的是其他数据的地址.
数据转换实例
实例1
public static void main(String[] args) {
byte b1 = 10; // 没有风险的赋值, 可以
short s1 = 20;
int i1 = 30;
long l1 = 40;
// 常量 : 其中的值不可以改变的量
// 1) 字面量
// 2) 被final修饰的量
//300 = 300; 左侧是常量 , 不允许被写入
s1 = b1; // 把b1中值复制出来, 写入s1空间中
//b1 = s1; // 把s1中的值复制来, 写入b1空间中, 是有风险的, 因为变量中的值不确定
//强制类型转换 (目标类型)原始数据;
b1 = (byte)s1;
i1 = s1;
i1 = (int)l1;
// 整数字面量默认的类型是int型.
long l2 = 300000000000L; // 后缀L的作用是告诉编译器,这个字面量不要用int型保存, 而是用long型
double d1 = 3.22;
double d2 = .58; // 0.58
// 浮点数字面量默认的类型是double型
//float f1 = 1.2;
float f1 = 1.2F; // 字面量使用float型来保存
float f2 = (float)0.2;
f1 = (float)d1;
d2 = f2;
//l1 = f1; // float型虽然4个字节, 但是它的范围要比8个字节的Long还大.
l1 = (long)f1;
// 结论 : 范围小的量赋值给范围大的变量, 可以自动进行
// 范围大的量赋值给范围小的变量, 必须强制类型转换, 强制类型转换有可能会损失精度
// double的兼容性最好.
d1 = l1;
d1 = s1;
d1 = b1;
// 范围从小到大排序
// byte < short < int < long < float < double
}
}
实例二
class VariableTest2 {
public static void main(String[] args) {
// 任意个非long整数运算, 结果总是int类型
short s1 = 10;
byte b1 = 20;
//s1 = s1 + b1; // s1 + b1 结果是int类型
s1 = (short)(s1 + b1); // s1 + b1 结果是int类型
long l1 = 40;
s1 = (short)(s1 + l1); // 不同范围的数据混合运算时, 结果是范围最大的那种类型
float f1 = 0.2F;
double d1 = 0.3;
//l1 = l1 * f1; // 结果是float型
f1 = l1 * f1;
f1 = (float)(s1 + d1); // 结果是double型
d1 = s1 + b1 - l1 * d1;
// 任意个非long整数运算, 结果总是int类型
// 不同范围的数据混合运算时, 结果是范围最大的那种类型
}
}
实例三
class VariableTest3 {
public static void main(String[] args) {
// char是两个字节, 其中保存的是字符的Unicode码值, 所以它也是整数
// 其范围是0~65535
char c1 = 'a';
char c2 = 'b';
char c3 = 'A';
char c4 = '2';
char c5 = '我';
char c6 = '你';
char c7 = 10;// 一些字符无法用字面量来表示, 可以直接使用码值,码值为10的是换行
System.out.println(c7);
c7 = '\n'; // '\r', '\t', '\b'
System.out.println(c1);
System.out.println(c2);
System.out.println(c3);
System.out.println(c4);
System.out.println(c5);
System.out.println(c6);
System.out.println((int)c1);
System.out.println((int)c2);
System.out.println((int)c3);
System.out.println((int)c4);
System.out.println((int)c5);
System.out.println((int)c6);
System.out.println("******************************");
c1 = 99;
System.out.println(c1);
c3 = (char)(c5 + c2); // 两个整数相加, 任意两个非long整数相加, 结果总是int类型
System.out.println(c3);
byte b1 = (byte)c1;
short s1 = (short)c2;
}
}
结果
判断语句正误
int i1 = 20;
short s1 = i1; (错)
char c1 = 97; (对) //'a' char放的是码值,整数,可以直接赋整数
char c2 = '我' - '你';(对) //两个字面量(常亮)之差是安全的,在char范围内,是安全的
char c3 = (char)(c1 - 32); //可以达到小写变大写的效果(对)
float f1 = i1;(对)//小范围转大范围自动进行
long l1 = 234234239933;(错) //默认为int类型,后面要加L,字面量超出int范围
f1 = l1 * 20;(对) //结果仍为float类型
double d1 = .342; (对)
d1 = i1 * f1 * l1;(对)//不同范围的数据混合运算时, 结果是范围最大的那种类型
l1 = f1 / 10000;(错)//float范围更大,范围大的量赋值给范围小的变量, 必须强制类型转换, 强制类型转换有可能会损失精度
boolean b1 = (boolean)1;(错) // 布尔类型不允许和其他值运算和比较, 还有强制类型转换也不可以
重要结论
数据类型范围从小到大排序
byte < short < int < long < float < double
范围小的量赋值给范围大的变量, 可以自动进行
范围大的量赋值给范围小的变量, 必须强制类型转换, 强制类型转换有可能会损失精度
double的兼容性最好.
整数字面量默认的类型是int型
浮点数字面量默认的类型是double型
任意个非long整数运算, 结果总是int类型
不同范围的数据混合运算时, 结果是范围最大的那种类型
虽然true底层是1, 但是不允许把1强制转换为boolean