Java 是强类型语言, 所以在源代码编译时,声明的变量时必须明确它所属类型.
基本数据类型 引用数据类型
byte 对应的包装类→ Byte
short 对应的包装类→ Short
int 对应的包装类→ Integer
long 对应的包装类→ Long
char 对应的包装类→ Character
float 对应的包装类→ Float
double 对应的包装类→ Double
boolean 对应的包装类→ Boolean
interface 接口
Array 数组
基本数据类型中,除了char ,boolean以外, 其他的都可以font用来表示数字.
区别如下:
byte 范围 -128 ~ 128
short 范围 -2的15次方 ~ 2的15次方-1
int 范围 -2的31次方 ~ 2的31次方-1
long 范围 -2的63次方 ~ 2的63次方-1
float 范围 -2的-149次方 ~ 2的128次方-1
double 范围 -2的-1074次方 ~ 2的1024次方-1
特殊的是char类型, 例如 char a = 1; a 表示的是 UCS-2 编码为 1 的字符,直接打印 a 是乱码
在Java中不支持使用char类型,UCS-2 远远少于Unicode字符的数量,在跟一些数据库的char类型数据结合进行的特殊查询的情况下,会出现问题.
字节和字符
字节: 硬盘或内存中存储形式.1个字节代表 8位的二进制数(bit).比如:1 byte = 0110 1010
字符: 占用字节数根据不同的字符集确定
字符集
Unicode 字符集
Java默认采用的就是这个字符集,
常用编码方法 UTF-8(Unicode Tranformation Format),万国码
一个字节代表一个英语字符,三个字节表示一个汉语字符,特殊汉语字符4个字节
GBK 字符集
英语字符占一个字节,汉语字符占两个字符
包括中日韩字符的大字符集合,支持中文简体和繁体
GB2312 字符集
英语字符占一个字节,汉语字符占两个字符
GBK子集,中国国家标准的简体中文字符集, 不支持繁体字符的编码.
一般用于中国大陆和新加坡
ASCII 字符集
基于罗马字母表的一套电脑编码系统,一个英语字符由占一个字节,
汉语字符占两个字节
数据类型的转换
自动转换
小范围的数据类型到大范围的数据类型会自动转换类型
小----------------------------------------------大
byte - short - int - long - float - double
byte a = 1; byte b = 2; byte c = a + b;//编译失败,需要强制类型转换成int类型 int c = a + b;//编译通过
强制转换
基本数据类型之间
public byte cout(byte b1, byte b2) { return (byte) (b1 / b2); //需要强制类型转换 }
大范围类型到小范围类型强制转换会损失精度
double d = 3.14; int i = (int) d; System.out.println(i);//打印结果 i = 3
引用数据类型之间
通常是在存在继承关系的父子类中的强制转换
public class Father { public void print() { System.out.println("Father"); } } public class Son extends Father { public void other() { System.out.println("son"); } }
Son的内容要比Father丰富,也可以说Son的范围比Father大,所以:
Father father = new Son();//将大范围的内容交给小范围的实例
所以father实例虽然指向的是Son内容,但是能力被削弱了,它不能访问Son中独有的部分
父类对象强制转换成子类类型
Son son = (Son) father;//把father对象强化回Son对象,功能恢复
但是:
Father father = new Father(); Son son = (Son) father;//抛出异常:java.lang.ClassCastException转换异常
总得来说:子类可以自动转型为父类,但是父类强制转换为子类时只有当引用类型真正的身份为子类时才会强制转换成功,否则失败.
在强制转换之前必须保证前提是:功能较弱的类型引用的一个功能较强的对象时,使用强制转换来恢复功能,反之失败.所以,良好的编码习惯是转换之前使用方法 instanceof 方法判断一下:
if (father instanceof Son) { Son son = (Son) father;//判断为true 则执行转换 }