Java是一种强类型静态语言,分为 原始类型(primitive type) 和 引用类型(reference type)。
不可变类型(Immutable):原始类型或引用类型的数据被初始化赋值后是不可变的,如果被修改需在新内存地址保存新值,旧值所在的旧内存地址随后会被垃圾回收。
可变类型(Mutable):原始类型或引用类型的数据被初始化赋值后是可变的,如果被修改只需在原有内存地址将新值取代旧值。
原始类型 包含 整数类型(不可变)、IEEE754浮点类型(不可变)、布尔类型(不可变)、Unicode 字符类型(不可变)。
引用类型 包含 类类型(可变)、接口类型(可变)、BigInteger
类类型(不可变)、BigDecimal
类类型(不可变)、Unicode 字符串类型(不可变)、枚举类型(不可变)、记录类型(不可变)、数组类型(可变)。java.lang.Object是所有其它类的超类。
原始类型的变量包含该原始类型的值。类类型的变量可以保存null
引用或对象的引用。接口类型的变量可以保存null
引用或实现该接口的任何类的实例的引用。数组类型的变量可以保存null
引用或对数组的引用。类类型 Object
的变量可以保存null
引用或对任何对象的引用,无论是类实例还是数组。
1.整数(integral)类型
整数类型可以用十进制、十六进制(前缀0X
或0x
)、八进制(前缀0
,容易混淆) 或 二进制(0B
或0b
) 来表示。
long
后缀 L
是首选,因为字母 l
通常很难与数字 1
区分开来。
为了让数字易于阅读,数值很长会加上下划线(_
),但Java编译器会去除这些下划线,例如:1_000_000_000_000
。
类型 | 存储需求 | 范围 | 默认值 | 打包(wrapping)类型 |
byte | 1字节 | -128(-27) ~ 127(27-1) | 0 | java.lang.Byte |
short | 2字节 | -32768(215) ~ 32767(215-1) | 0 | java.lang.Short |
int | 4字节 | -2,147,483,648(-231) ~ 2,147,483,647(231 -1) | 0 | java.lang.Integer |
long | 8字节 | -9,223,372,036,854,775,808L(-263) ~ 9,223,372,036,854,775,807L(263 -1) | 0L | java.lang.Long |
2.IEEE754浮点(floating-point)类型
浮点类型遵循IEEE 754二进制浮点算术标准。
后缀为F
或f
为float
(单精度)类型。
没有后缀或后缀为D
或d
为double
(双精度)类型。
类型 | 存储需求 | 范围 | 默认值 | 打包(wrapping)类型 |
float(单精度) | 4字节 | 大约 ±3.402 823 47E+38F (有效位数6~7位) | 0.0f | java.lang.Float |
double(双精度) | 8字节 | 大约 ±1.797 693 134 862 315 70E+308 (有效位数15位) | 0.0d | java.lang.Double |
四个特殊的浮点数值:
- 正负零
- 正无穷大
- 负无穷大
- NaN(Not-a-Number,不是一个数字)
3.布尔(boolean)类型
类型 | 值 | 描述 | 默认值 | 打包(wrapping)类型 |
boolean | true 和 false | 用来判断真假 | false | java.lang.Boolean |
4.Unicode 字符(char)类型
类型 | 存储需求 | 范围 | 默认值 | 打包(wrapping)类型 |
char | 2字节 | 从'\u0000' 到 '\uffff' ,即从 0 到 65535 | ‘\u0000’ | java.lang.Character |
5.类(class)类型
类型 | 默认值 | API |
class | null | java.lang.Class<T> |
6.接口(interface)类型
类型 | 默认值 |
interface | null |
7.BigInteger类类型
类型 | 范围 | API |
BigInteger | 任意范围整数 | java.math.BigInteger |
8.BigDecimal类类型
类型 | 范围 | API |
BigDecimal | 任意范围精确小数 | java.math.BigDecimal |
9.Unicode 字符串(String)类型
类型 | 是否可变类型 | 默认值 | API |
String | 不可变类型 | null | java.lang.String |
StringBuffer | 可变类型(多线程,效率低) | null | java.lang.StringBuffer |
StringBuilder | 可变类型(单线程,效率高) | null | java.lang.StringBuilder |
10.枚举(enum)类型
类型 | 默认值 | API |
enum | null | java.lang.Enum<E> |
11.记录(record)类型
类型 | 默认值 | API |
record | null | java.lang.Record |
12.数组(array)类型
类型 | 默认值 | API |
array | null | java.util.Arrays |
13.空(null)类型
类型 | 值 | 描述 |
null | null | 表示空引用 |
14.void返回类型
类型 | API |
void | java.lang.Void |
15.编译时类型和运行时类型
//编译时类型为 object,运行时类型为 string。
object anotherMessage = "This is another string of characters";
16.类型转换
隐式转换
隐式转换始终会成功且不会导致数据丢失,因此无需使用任何特殊语法。
//从范围较小的整数值类型到范围较大的整数值类型的隐式转换
int num = 2147483647;
long bigNum = num;
//从派生类引用类型到直接或间接的超类或接口引用类型的隐式转换
Derived d = new Derived();
Base b = d;
显式转换(强制转换)
显式转换,又称强制转换,可能会导致数据丢失,因此必须使用强制转换表达式。
//从精度较高或范围较大的数值值类型到精度较低或范围较小的数值值类型的显式转换
double x = 1234.7;
int a;
a = (int)x;
System.out.println(a);
// Output: 1234
//从超类引用类型到派生类引用类型的显式转换
//隐式转换到基类是安全的
Giraffe g = new Giraffe();
Animal a = g;
//显式转换到派生类型,如果右侧的a实际不是长颈鹿类型,将在运行时抛出异常
Giraffe g2 = (Giraffe)a;
17.打包(wrapping)和解包(unwrapping)
打包
打包(又称boxing,装箱)转换将原始类型的表达式视为相应引用类型的表达式。
从类型byte到类型Byte
从类型short到类型Short
从类型int到类型Integer
从类型long到类型Long
从类型float到类型Float
从类型double到类型Double
从类型char到类型Character
从类型boolean到类型Boolean
从null类型到null类型
解包
解包(又称unboxing,拆箱)转换将引用类型的表达式视为相应原始类型的表达式。
从类型Byte到类型byte
从类型Short到类型short
从类型Integer到类型int
从类型Long到类型long
从类型Float到类型float
从类型Double到类型double
从类型Character到类型char
从类型Boolean到类型boolean
原创文章,作者:huoxiaoqiang,如若转载,请注明出处:https://www.huoxiaoqiang.com/java/javalang/2473.html