JAVA数据类型
数据类型
基本数据类型
变量名指向具体数值,变量声明后,Java 立即分配内存空间。
基本数据类型:byte、short、int、long、float、double、char、boolean。
整数类型
byte(8位)
- 8位、有符号的以二进制补码表示的整数
- min : -128(-2^7)
- max: 127(2^7-1)
- default: 0
- 对应包装类:Byte
short(16位)
- 16位、有符号的以二进制补码表示的整数
- min : -32768(-2^15)
- max: 32767(2^15 - 1)
- default: 0
- 对应包装类:Short
int(32位)
- 32位、有符号的以二进制补码表示的整数
- min : -2,147,483,648(-2^31)
- max: 2,147,483,647(2^31 - 1)
- default: 0
- 对应包装类:Integer
long(64位)
- 64位、有符号的以二进制补码表示的整数
- min : -9,223,372,036,854,775,808(-2^63)
- max: 9,223,372,036,854,775,807(2^63 -1)
- default: 0
- 对应的包装类:Long
浮点数类型
float(单精度、32位)
- 单精度、32位、符合IEEE 754标准的浮点数
- float 在储存大型浮点数组的时候可节省内存空间
- 浮点数不能用来表示精确的值,如货币
- default: 0.0f
- 对应的包装类:Float
double(双精度、64位)
- 双精度、64位、符合IEEE 754标准的浮点数
- 浮点数的默认类型为double类型
- double类型同样不能表示精确的值,如货币
- default: 0.0d
- 对应的包装类:Double
字符类型
char(16位 Unicode)
- char类型是一个单一的 16位 Unicode 字符
- 最小值是 \u0000(即为0)
- 最大值是 \uffff(即为65,535)
- char 数据类型可以储存任何字符
- 对应的包装类:Character
布尔类型
boolean(8位)
- boolean数据类型表示一位的信息
- 只有两个取值:true 和 false
- 这种类型只作为一种标志来记录 true/false 情况
- 对应的包装类:Boolean
数据类型转换
自动转换
也称隐式类型转换。
由系统自动完成的类型转换。
从存储范围小的类型到存储范围大的类型。
byte→short(char)→int→long→float→double
强制转换
也称显式类型转换。
必须书写代码才能完成的类型转换。
可能存在精度的损失。
从存储范围大的类型到存储范围小的类型。
double→float→long→int→short(char)→byte
(转换到的类型)需要转换的值。
包装类型
提供一种机制,使得基本数据类型与引用类型互相转换。
Byte <-> byte
Short <-> short
Integer <-> int
Long <-> long
Float <-> float
Double <-> double
Character <-> char
Boolean <-> boolean
装箱(boxing)
将值类型转换为引用类型。
通过调用包装类的valueOf方法实现。
拆箱(unboxing)
将引用类型转换为值类型。
通过调用包装类的xxxValue方法实现。
自动装拆箱
自动装箱就是Java自动将原始类型值转换成对应的对象,比如将int的变量转换成Integer对象,这个过程叫做装箱,反之将Integer对象转换成int类型值,这个过程叫做拆箱。
装箱拆箱方法在编译成class文件时自动加上,不需要程序员手工介入。
Integer i = 10; // 自动装箱
int n = i; // 自动拆箱
引用数据类型
变量名指向存数据对象的内存地址,以特殊的方式(类似 C 指针)指向对象实体(具体的值),这类变量声明时不会分配内存,仅存储一个内存地址。
引用数据类型有两块存储空间,一个在栈(Stack)中,一个在堆(Heap)中,栈中存放的是堆中的地址。
使用 new 关键字创建出来的类型都是引用数据类型,包含类、接口、数组。
值传递
方法调用时,实际参数把它的值传递给对应的形式参数,函数接收的是原始值的一个copy,此时内存中存在两个相等的基本类型,即实际参数和形式参数,后面方法中的操作都是对形参这个值的修改,不影响实际参数的值。
Java中只有按值传递。不管是基本类型还是引用类型,形参都是实参的一个拷贝。
引用传递
也称为传地址。方法调用时,实际参数的引用(地址,而不是参数的值)被传递给方法中相对应的形式参数,函数接收的是原始值的内存地址;在方法执行中,形参和实参内容相同,指向同一块内存地址,方法执行中对引用的操作将会影响到实际对象。
值传递和引用传递可以得出这样的结论:
(1)基本数据类型传值,对形参的修改不会影响实参;
(2)引用类型传引用,形参和实参指向同一个内存地址(同一个对象),所以对参数的修改会影响到实际的对象;
(3)String, Integer, Double等immutable的类型特殊处理,可以理解为传值,最后的操作不会修改实参对象。