# 数据类型
Java中的数据类型主要分为两类
- 基本数据类型(Primitive Type)
 - 引用数据类型(Reference Type)
 
# 基本数据类型
- 8 种基本类型,值传递,存储在 
Stack中 - 数值类型不存在无符号,取值范围固定,不依赖硬件环境或操作系统
 - 类变量无需初始化具有默认值,局部变量必须初始化(数组例外,数组分配空间后,以默认值初始化)
 
| 类型 | 空间大小/bit | 范围 | 默认值 | 
|---|---|---|---|
| byte | 8 | [-128,127] | 0 | 
| short | 16 | [-2^15 + 1,2^15 - 1] | 0 | 
| int | 32 | [-2147483648,2147483647] | 0 | 
| long | 64 | 0L | |
| float | 32 | 0.0f | |
| double | 64 | 0.0d | |
| boolean | 1 | true/false | false | 
| char | 16 | /u0000 | 
# 数值型
- 整数常量的默认类型是
int - 小数常量的默认类型是
double - 对
byte变量直接赋值时,如果在范围内会自动进行int->byte转换 byte可以方便的用于数据传输以及编码转换
类型转换
- 向上转换: 表达式中,如果进行运算的两个数据类型不同,自动向上转换,不会出现数值转化错误
char->short->int->long->float->double
signed->unsigned - 向下转换: 需要使用强制类型转换
 
int num1 = 1;
int num2 = 1;
long sum1 = num1 + num2; // Automatically cast to more general type
int sum2 = (int)sum1;    // Explicit type cast
int x = 2147483647;    // Max of int
long n = x + 1;        // n = -2147483648
long n = x + 1L;       // n = 2147483648
long n = (long)x + 1;  // n = 2147483648
 1
2
3
4
5
6
7
8
9
2
3
4
5
6
7
8
9
# 字符型
- 使用单引号
'ch',区别于字符串使用双引号"str" - Java使用
UNICODE编码,可以认为包含了ASCII编码('A': 65, 'a': 97, '0': 48) 
ASCLL与UNICODE编码
ASCII: 每个字符占用 1 字节(byte),可以表示 256 个字符,分为标准码(0-127),键盘上可以找到和拓展码(128-255),键盘上找不到,可以表示英文字符和一些符号
UNICODE: 每个字符占用 2 byte,可以表示世界所有语言文字
# 布尔型
- 只有
true和false两个值(如果赋值null会报错) - 不同于
C,Java不支持数值型作为布尔型 
int flag = 1;
if (flag) {
    // Error
}
 1
2
3
4
2
3
4
# 引用数据类型
- Java 引用类型指向一个对象,指向对象的变量是引用变量,默认值为 
null - Java 创建对象实例时,将地址赋给引用变量,存储于 
Stack,实例存储于Heap - 对象、数组都是引用数据类型,引用传递
 
引用类型的大小取决于地址空间,一个 32 位的地址,引用类型需要 4 byte 存储,如果是 64 位,则是 8 byte
注意
特殊数据类型: null
 null用来标识一个空的对象,因此不能将null赋给基本型的变量
 null可以转换为任何引用类型
# 变量类型
# 局部变量
- 局部变量在其作用域中被执行时创建,存储于
Stack,在执行完毕后销毁 - 访问修饰符不能修饰局部变量
 - 局部变量没有默认值,在被声明后必须经过初始化才能使用
 
# 实例变量
- 实例变量声明在类中,方法、构造方法和语句块外
 - 实例变量跟随对象创建而创建,销毁而销毁
 - 实例变量可以被访问修饰符修饰,且具有默认值
 
# 类变量
- 类变量即静态变量,由
static修饰,声明于方法之外 - 同一个类的所有实例对象共享类变量的一份拷贝
 - 静态变量通常与
final配合用于声明常量,名称一般使用大写字母 - 类变量具有默认值,与实例变量相似
 
# 参考
[1] Java菜鸟教程 (opens new window)