一、Java语言中8个基本数据类型分别是:byte、short、int、long、float、double、char、Boolean
(1)byte类型占1个字节,取值范围:-128~127
// 1.声明一个byte类型的变量并初始化
byte b1 = 25;
//byte b1 = 250; 不兼容的类型 byte类型数据的取值范围是 -128~127
// 像250这样直接写出来的数据称为直接量/常量/字面值 默认为int类型
System.out.println("b1 = " + b1);
(2)short类型占2个字节,取值范围:-2^15 ~ 2^15-1`
short s1 = 250;
// short s1 = 250250; 超出short类型的取值范围
System.out.println("s1 = " + s1);
(3)int类型占4个字节
int i1 = 250250;
System.out.println("i1 = " + i1);
(4)long类型占据8个字节
注意:若希望表达更大的直接量 则在直接量后面加上L或l(推荐L)
如果想要描述一个比long类型还大的数据,则使用java.math.BigInteger类型
// long lg = 12345678987654; 数据本身是默认int类型,不管前面的是什么数据类型,这个数据本身就已经过大了
// 若希望表达更大的直接量 则在直接量后面加上L或l(推荐L)
long lg = 12345678987654L;
//由于有些数据后面会加上类似于L这样的字母做特殊用途,这也是标识符命名规则中数字不能开头的原因
System.out.println("lg = " + lg);
// 如果想要描述一个比long类型还大的数据,则使用java.math.BigInteger类型
可以将直接量25赋值给byte类型的变量,但是不能把值(暂时)等于25的变量赋值给byte类型,因为变量的值是不确定的
byte b2 = 25;
int i2 = 25;
// byte b2 = i2; 此处是变量给byte类型赋值,不能保证一定是byte类型的
(5)float类型占4个字节,单精度浮点数,可以表示到7位有效数字,取值范围:-3.403E38~3.403E38.(10的38次方)
与int类型有所不同的是,int类型的二进制数中,只有符号位和数,但是float类型除了符号位和数之外,中间有一部分专门表示次方位,所以float类型表示的数比int类型大。
// 1.声明一个float类型的变量并初始化
//float f1 = 3.1415926; // 3.1415926也叫作直接量,默认为double类型
float f1 = 3.1415926F; // 需要表达float类型数据在后面加上F或者f
System.out.println("f1 = " + f1); // 运行结果:f1 = 3.1415925 默认7位有效数字
(6)double类型占8个字节,双精度浮点数,可以表示15位有效数字,取值范围:-1.798E308~1.798E308
double d1 = 3.1415926;
System.out.println("d1 = " + d1);// 运行结果:d1 = 3.1415926 默认15位有效数字
注意:
System.out.println(0.1+0.2); //运行结果:0.30000000000000004 float类型和double类型在运算时会有误差
若希望实现精确运算则借助java.math.BigDecimal类型
(7)char类型占2个字节,并且是没有符号位的(与同样占2个字节的short类型取值范围不同了),取值范围:0~65535
现实生活中很少有数据能够使用单个字符描述,因此使用更多的是由多个字符串起来组成的字符串,用String类型加以描述
char c1 = 'a';
System.out.println("c1 = " + c1);
// c1在底层是使用ASCII的形态存在的,但是打印的是char类型数据,所以结果是“图案”而非“编号”
System.out.println("对应的编号是:" + (int)c1); //表示将char类型的c1强制转换成int类型并打印 97
// 打印的结果取决于使用什么方式解析
char c2 = 98;
System.out.println("c2 = " + c2); //运行结果:c2 = b
重要的几个ASCII:‘0’- 48 ‘A’-65 ‘a’-97 空格-32 ‘/n’-10
ASCII之外的字符使用Unicode字符集表示,该字符集可以百度搜索
char c3 = '\u5947'; //奇
char c4 = '\u5948'; //奈
System.out.println("c3 = " + c3 + ", c4 = " + c4);
(8)boolean类型所占大小没有明确地规定,可以认为是一个字节(其实一个进制位就可以表示)boolean类型的数据只有两个:true和false
// 1.声明一个布尔类型的变量并初始化
boolean b1 = true;
System.out.println("b1 = " + b1);
System.out.println("---------------------------------");
// 2.修改变量b1的数值 = 赋值运算符 将它右边的数据赋值给左边,并覆盖左边原来的数值
b1 = false;
// b1 = 1; 此时b1为boolean类型不能赋值int类型的数据
System.out.println("b1 = " + b1);
二、数据类型之间的相互转换
(1)自动类型转换:从小类型到大类型之间的转换
byte=>short/char=>int=>long=>float=>double
// 1.声明两个变量并初始化
byte b1 = 10;
short s1 = 20;
System.out.println("b1 = " + b1); //10
System.out.println("s1 = " + s1); //20
// 2.实现自动类型的转换
s1 = b1; //将b1的数值赋值给s1 相当于从byte类型到short类型的转换 小到大的转换
System.out.println("b1 = " + b1); //10
System.out.println("s1 = " + s1); //10
(2)强制类型转换:从大类型到小类型之间的转换
语法格式:目标类型 变量名 = (目标类型)源类型变量名
// 3.实现强制类型的转换
// 语法格式:目标类型 变量名 = (目标类型)源类型变量名
s1 = 128; //测试强转是否有损失
// 128:0000 0000 1000 0000 转换为byte类型默认取低八位 => 1000 0000 负二进制转换为十进制 最终结果为-128
b1 = (byte)s1; // 把short类型的s1转换为byte类型的b1
System.out.println("b1 = " + b1); //-128
System.out.println("s1 = " + s1); //128
强制转换有风险!