一、基本类型 primitive(原始 简单)
byte short int long float double char boolean
二、引用类型 reference
String、数组、类等
- 包装类型
Byte、Short、Integer、Long、Float、Double、Character、Boolean
对基本类型进行封装,包装类型对应的是类,相应地有对象和方法 - 特殊值
null
NullPointerException 空指针异常:当引用类型取值为null时,想进一步使用它(调用方法和字段),会抛出错误
判断是否是null:
if (xx != null)
三、类型转换
-
为什么要类型转换
声明变量之后,必须赋予变量和声明类型一致的数据类型
1、基本类型间
- 顺箭头:隐式转换(java自动转换)
byte a = 10;
int b = a;
- 逆箭头:强制转换
在要转换的变量前加括号声明新类型
int c = 20;
byte d = (byte) c
注意:强制转换有可能损失精度
2、包装类型和基本类型间
3、引用类型之间
- 为什么要转?
(1)向上转型
a.使用父类型统一处理子类型。例如Animal是Cat类和Dog类的父类型,如果一个静态方法想同时对Cat类和Dog类处理,就可以传入父类型
static void test(Animal a){
};
test(new Cat());
test(new Dog());
b.数组类型可以使用父类型统一
Animal[] cats = new Animal[] {new Cat(), new Dog()};
(2)向下转型
将转换的父类型转换回来
-
隐式转换【向上转型】:待转换的对象和目标类型之间,要符合“是一个”的关系
注意:转换之后,对象还是对象,只是用父类型来表示它
// 猫类型转换为动物类型和Object类型
Animal a = new Cat()
Object b = new Cat()
- 强制转换【向下转型】:与基本类型的强制转换一样,加括号声明
注意:强制转换需要满足转换对象和目标类型之间符合“是一个”关系,举例如下
// 隐式转换
Animal a = new Cat();
Object b = new Cat();
// 强制转换
Cat c = (Cat) a; //将Animal类强制转换为cat类,因为a代表的对象本来就是cat,转换合法
Dog d = (Dog) d; //不合法,a代表的对象是cat
Cat e = (Cat) b; //合法。b是cat对象
Animal g = (Animal)b;合法,b是cat对象,和Animal符合“是一个”关系
4、不属于以上三种