java数据类型
标志符
标志符就是类名、方法(函数)名、变(常)量名、包名等的名字。
Java规定,标识符是由
[_a-zA-Z$]
开头,后面跟 [_a-zA-Z0-9$]*
组成的符号序列。根据此定义,下列单词都是合法的标识符:
i count num day Scoll Lock $a789 a89 Java Int
而下列标识符是不合法的:
abc&# a3*4 int b-c #ab class
Java是区分大小写的:
int
是关键字,而 Int
是合法的用户标识。Java关键字和保留字不能用作标志符: 如 while 是关键字,不能作它用。
Java的标识符可以是任意长度,但建议不要取得太长,最好不要超过4个单词。因为太长的名字容易输入错误,降低编程效率。
另外,虽然 JDK1.5 支持用中文给变量命名,不过很少有人采用中文变量名。一个直观的原因就是在中文输入法下,标点符号也是中文的,但Java只支持西文的标点符号,这样输入容易出错。
基本类型
包括整型、浮点型、布尔型、字符型
整型(byte、short、int、long)
Java中的整型数据,是以补码的形式存放在内存中的。Java中没有无符号型整数。
字节型 byte 1字节(8位) 默认值是 0,范围 -128~127
短整型 short 2字节 默认值是 0,范围 -32768~32767。即二进制的: 1000000000000000 ~ 0111111111111111。
基本型 int 4字节 默认值是 0,范围 -2,147,483,648(-2^31)~ 2,147,483,647(2^31 - 1)
长整型 long 8字节 默认值是 0L,范围 -9,223,372,036,854,775,808(-2^63)~ 9,223,372,036,854,775,807(2^63 -1)
浮点型(float、double)
Java中的浮点数,是按照IEEE-754标准来存放的。
单精度数 float 4字节 有效数字7个十进制位 默认值是
双精度数 double 8字节 有效数字15~16个十进制位 默认值是
字符型 char 2字节,存放的并不是 ASCII码,而是Unicode码。默认值为 'u0000',最小值是
ASCII码在其高字节(最左侧的字节)添上0,就是其对应的Unicode码。
布尔型 boolean 1字节或4字节, 可取true和false两个值,默认值为 false。
单个的boolean 类型变量在编译的时候是使用的 int 类型。而对于boolean 类型的数组时,在编译的时候是作为byte array来编译的所以boolean 数组里面的每一个元件占一个字节,这是确定的
常量
字面常量
直接的数字或字符串这种量,如 38
整型字面量
如果只有数字
[-+]?[0-9]+
,则根据范围动态确定是 byte、shor、int 三种类型之一。即根据字面量大小会进行自动类型识别。(但其实是都识别为int类型的,这里为便于理解才说是动态识别成不同类型)。byte型字面量:
-128~127
,可以赋值给byte、short、int、long、... 型变量。(当赋值给short等兼容类型时,自动进行类型转换,下同)short型字面量:
-32768~32767
,可以赋值给short、int、long、... 型变量,int型字面量:
-2,147,483,648~2,147,483,647
,可以赋值给int、long、... 型变量。long a = 2147483648; // 报错,说明纯数字的整数最多只能表示到int型,因为int最大为2147483647
long型字面量:
[-+]?[0-9]+[lL]
,可直接赋值给long、... 型变量。二进制数:
[-+]?0[bB][01]+[lL]?
,如 0B1001L 八进制数:
[-+]?0[0-7]+[lL]?
, 如 000021 十进制数:
[-+]?[1-9][0-9]*[lL]?
,不能以0开头 十六进制数:
[-+]?0[xX][0-9a-fA-F]+[lL]?
,如 0x0078aL实型字面量
float型字面量:
[-+]?[.0-9][eE][-+]?[0-9]+[fF]
,如 0.33 、 .78 、 123.
double型字面量:
[-+]?[.0-9][eE][-+]?[0-9]+
,如 1E5 表示 1*10^5 、1E+5
注意,E前面必须有数字,E后面必须是整数。
实型字面量只有十进形式,所以
float a = 0x3.7;
会报错。也就是说Java中没有二/八/十六进制的小数或科学计数表示。浮点数的有效位数是有限的: float型只有7个有效位,double型只有15~16个有效位,超过部分会自动做四舍五入处理。请看下例。

所以字面量中 1234567.456F 和 1234567.45678833F 并没有什么区别,最终都会被识别为1234567.5F。
浮点数并不能准确被存储: 如 1.3 在内存中可能是 1.299999 也可能是 1.30000001 ,所以可能(不绝对) 1.3 !== 1.3
字符型字面量
字符常量是用单引号(即撇号)括起来的一个字符。如
'a'
、'D'
都是字符常量。某些特殊的字符,比如回车符、换行符、退格符等,无法直接用单引号括起来。为了表示这些字符,Java提供了一种特殊形式的字符常量,就是以一个“\”开头的字符序列,“\”后面的字符不再是原来的含义,所以又被称为转义序列或换码序列。如 '\n'表示换行,'\r'表示回车,另外还有八进制和十六进制的表示方法,如下:
常规字符字面量: 'a', 'D', '国',.....
单字母转义字符字面量: '\[trnvb\'"...]' ,如 '\n','\t','\'','\\', ....
八进制转义字符字面量: '\[0-7]{3}'
十六进制转义字符字面量: '\u[0-9a-fA-F]{3}' (16进制Unicode字符)
字符型的变量存储时,就是一个无符号型short类型的整数,即范围为0~65535。所以字符型基本可以当作short型变量来运算。
字符串型字面量
Java的字符串常量也是包含在两个双引号之间的字符序列(可以是任何 Unicode 字符)。
字符串本质上是一个String类型的对象。
如
"hello中国\u00ab直接\t好的\672"
布尔型字面量
即
true
和 false
。命名常量
final int FEMALE = 2;
// 用 final 修饰的是常量,定义时必须有初始值,不可再修改
习惯上,符号常量名用大写(用_线分割单词),普通变量名用小写(用驼峰分割单词),以示区别。
变量
局部变量
局部变量是指定义在方法体内的变量或者方法体中的语句块中(由一对花括号确定)的变量。由于方法体也是由{}包围起来的,所以方法体也可看成一个普通的语句块,后面就不再区分方法体,均称为语句块。
定义变量的一般格式是:
类型名 标识符1[=初始值1,标识符2=[初始值2,[...]]]
实际上会被编译成:
类型名 标识符1;
标识符1 = 初始值1;
类型名 标识符2;
标识符2 = 初始值2;
....
在 Java中,所有用到的变量都要“先定义,后使用”
一个局部变量在引用之前,必须要显示地初始化,否则将无法通过编译。注意,只要在第一次取值前初始化即可,不用定义变量时就必须初始化。
所以
int a = 3, b = a;
是可以的,因为a在b之前已经定义并赋值。但
int a, b = a;
会报错,因为使用a时,a没有被赋值。局部变量的作用域
变量的作用域是指可以正常访问一个变量的范围。
1. 一个语句块确定一个作用域。作用域可以进行嵌套。
2. 局部变量只在定义它的作用域中有效,在此作用域以外,是不存在这些变量的(不可见)。
3. 从定义变量的这一行开始,到本作用域的结尾,是可以访问该变量的。
4. 在同一个作用域中,不允许定义两个同名的变量(即使类型不同也会报错)。
5. 不同作用域中可以定义同名变量,互不干扰,程序会读取最近的作用域的那个变量。
6. 当程序遇到一个变量需要读取其值时,就从本作用域开始查找,再查找父作用域,直到最顶层的作用域(方法体),取第一个找到的值。如果最后没找到,就报错。
成员变量
数据类型的转换
基本数据类型,除了布尔类型外,其余类型的数据是可以混合在起运算的。
例如:“
10+a+1.5-5.123*'b'
”是合法的。不过在运算时,如果某个运算符两侧的数据类型不一致,就必须要转换成同一类型,然后才能运算。但
int a = (int)true;
直接报错,因为boolean类型的不能进行任何转换(包括自动或强制转换)。无论是扩展转换还是缩减转换, 都是产生了原数据的一个副本转换的结果不会对原赘据有任何的影响。
自动类型转换(扩展转换)
由系统自动进行的类型转换,不会损失精度。转换的基本原则是: 范围小的转换成范围大的,精度小的转换成精度大的。

当双目运算符左右两侧的变量(常量)类型不一致时,必须先转换为一致才可进行运算。
从上图中取两种类型的最近的共同祖先类型。运算符可以是赋值运算符、加号...。
如
byte+char ==> int + int
、 byte+short ===> short + short
强制类型转换(缩减转换)
必须由程序员手动指定的类型转换,这种转换多数时候可能会损失精度。

当需要转换为另 一种类型时,按上图中的方向转换时,都需要进行强制转换。
如
int a; byte c = (byte) a;
// 在变量左侧加要转换的目的类型,注意,(byte)的括号是必须的,不写的话会报错
(byte) (a + b);
// 对于表达式,可以用括号括起来
Java在根据程序员的指令进行缩减转换的时候,有一套比较复杂的规则。
原则上是在保证符号的情况下,丢弃掉高字节(靠左边的字节)的内容。
但这么做并不能保证转换的结果符合程序员的预期效果。
浮点数到整数的转换是通过舍弃小数得到,而不是四舍五入。
可进行类型转换的条件是转换的数据类型必须是兼容的:
所以,不能对boolean类型进行类型转换,不能把对象类型转换成不相关类的对象。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· DeepSeek 开源周回顾「GitHub 热点速览」
· 物流快递公司核心技术能力-地址解析分单基础技术分享
· .NET 10首个预览版发布:重大改进与新特性概览!
· AI与.NET技术实操系列(二):开始使用ML.NET
· 单线程的Redis速度为什么快?