JAVA学习笔记二之(4)数据类型
Java语言就是为了编写程序,编写程序是为了把现实世界的操作通过程序给模拟出来。
Java中的数据类型就是为了方便表示现实世界的数据的。
-
一、数据类型的分类
- java中的数据类型按照大的分类分为2种:基本数据类型和引用数据类型(了解)。 二、基本数据类型: 4类8种。
- 1、整数:
- A:byte 1字节
- B:short 2字节
- C:int 4字节
- D:long 8字节
- 整数默认是int类型。
-
要想表示long类型的数据,在后面加上l或者L。建议加L。
-
2、浮点数:
- A:float 4字节
- B:double 8字节
-
浮点数据的表示:
- 1.23456
- 12345.678
- 3.14E12
-
浮点数默认是double类型。
- 要想表示float类型的数据,在后面加f或者F。
-
3、字符:
- char 2字节
- 4、布尔:
- boolean 1字节
-
5、面试题:
- java中的字符能够存储一个汉字么?
- 答:能。因为Java语言采用unicode编码,每一个字符占用两个字节。
- 6、注意:
- A:类名和文件名的问题
- java文件的名称可以和类名不一致。
- 但是要注意:编译的时候,编译文件名称。运行的时候,运行类名。
- 由于名称的不一致,可能会导致混乱,所以,建议,类名和文件名一致。
- B:变量的范围。
- 定义的变量在它所属的那对{}内有效,并且,该{}对内不能重复定义。
- 7、举例
class DataTypeDemo {
public static void main(String[] args) {
//定义一个byte类型的变量
byte b = 10;
System.out.println(b);
//可能损失精度:超出范围了
//byte b2 = 200;
//System.out.println(b2);
//定义一个short类型的变量
short s = 10;
System.out.println(s);
//定义一个int类型的变量
int i = 10;
System.out.println(i);
//错误: 过大的整数: 1000000000000000000
//int j = 1000000000000000000;
//定义一个long类型的变量
long number = 1000000000000000000L;
System.out.println(number);
//定义一个float类型的变量
// 错误: 可能损失精度
float f = 12.345f;
System.out.println(f);
//定义一个double类型的变量
double d = 12.345;
System.out.println(d);
//定义一个字符类型变量
char c = 'a';
System.out.println(c);
//定义一个布尔类型的变量
//错误: 已在方法 main(String[])中定义了变量 b
//boolean b = true;
boolean flag = true;
System.out.println(flag);
}
}
-
三、数据类型转换
- 在运算操作的时候,数据的类型要求一致,但是很多时候,我们会遇到不一致也可以的情况。原因很简单,因为它们做了自动转换(隐式转换)。
- 1、隐式转换:小的类型到大的类型。
- byte,short,char –> int –> long –> float –> double
-
A:boolean类型不参与数据的转换。
-
B:byte,short,char之间不转换,它们参与运算都首先转换为int类型。
class DataTypeDemo2 {
public static void main(String[] args) {
byte b = 10;
int i = 100;
//这里按说会有问题,但是现在没有,到底为什么呢?
//System.out.println(i + b);
//一般来说,做运算操作的两个数据的类型应该是一致的才可以。
//错误: 可能损失精度
/*
byte bb = b + i;
System.out.println(bb);
*/
int j = b + i;
System.out.println(j);
}
}
-
: 2、强制转换
- 直接把大类型赋值给小类型是不可以的。但是,我们有另外的方式,让它可以。
- 强制转换的定义:从大的类型的数据到小的数据类型的数据。
- 强制转换的格式:目标数据类型 变量名 = (目标数据类型)原始数据;
class DataTypeDemo3 {
public static void main(String[] args) {
int x = 10;
byte b = 10;
//byte类型提升为int类型,结果为int类型
//int y = x + b;
//System.out.println(y);
//把x的值赋值给b变量
//b = x;
//目标数据类型 变量名 = (目标数据类型)原始数据;
//byte bb = (byte)x;
byte bb = (byte)(x + b);
//byte bb = (byte)x + b; //注意,要把后面的整体加括号。
System.out.println(bb);
}
}
四、面试题
A:请问下面的那条语句有问题,如果有,请问是什么问题。
byte b1 = 3;
byte b2 = 4;
byte b3 = b1 + b2;
System.out.println(b3);
byte b4 = 3 + 4;
System.out.println(b4);
—————————————————————————————-
答:byte b3 = b1 + b2;有问题。
编译器在处理的时候,如果看到的是变量,就直接提示类型,然后计算。
如果是常量,就先计算,然后看是否在范围内,如果不是就报错。
B:请问下面的程序有木有问题,如果有请给出解决方案,并说出最终的结果。
byte b = 130;
—————————————————————————————-
分析步骤如下:
A:看到130,我就知道该数据默认是int类型。
B:而int类型的数据,占用4个字节。
C:把130用int类型的字节数表示。
130十进制 – 二进制
由于130是个正数,所以,它的原码,反码,补码的值都一样的。
所以,130在内存中的存储就是如下表示:
00000000 00000000 00000000 10000010
D:byte b = (byte)130;
这个动作其实就是把130截取剩余1个字节,而且是低位的字节数据。
补码:
1 0000010
反码:
1 0000001
原码:
1 1111110
class DataTypeDemo5 {
public static void main(String[] args) {
//面试题1
byte b1 = 3;
byte b2 = 4;
//byte b3 = b1 + b2; //有问题
//System.out.println(b3);
byte b4 = 3 + 4; //常量相加,编译器的处理是先加,然后看值是否在byte范围内。如果在就不报错。
System.out.println(b4);
System.out.println("------------------------");
//面试题2
//byte b = 130; //-128~127之间。
//有问题。
//解决方案:做强制类型转换
byte b = (byte)130;
System.out.println(b);
System.out.println("-----------------------");
System.out.println((byte)127);
System.out.println((byte)128);
System.out.println((byte)129);
System.out.println((byte)130);
System.out.println((byte)131);
}
}