Java基本语法
变量
整型
- Java的整数类型有:
byte
、short
、int
、long
- Java各整数类型有固定的表数范围和字段长度,不受具体操作系统的影响,以保证Java程序的可移植性。
表数范围的得出:以byte
为例,占用存储空间为1字节即8bit,因此可以表示$ 2^8 = 256 $个数,分成一半正(包含0)一半负,则得到其表数范围为-128~127
。
由于byte
的表数范围比较小,使用的时候容易超出其范围,因此需要记一下byte
的表数范围,即-128~127
。
可以这样记四种整数类型占用的存储空间,以字节为单位,从小到大分别为:$ 2^0、2^1、2^2、2^3$字节。
四种整数类型的表数范围,一半正数(0作为正数),一半负数,因此就是:$ -2^{占用的存储空间字节数} \div 2 \sim 2^{占用的存储空间字节数} \div 2 - 1 $ - 如果定义
byte
类型时,给其赋值超出了其范围,会编译失败。编译失败的信息是错误: 不兼容的类型: 从int转换到byte可能会有损失
,这里的意思就是要注意=
这个赋值号,相当于先存在128
这个int
型的整数,再赋值给了byte
类型的变量。因此实际上超出范围
错误虽然是用了超出范围的数,但由于赋值操作,系统先是存在了int
类型的数(即任何存在的数实际上都有一个类型),因此实际上产生的是数据类型不兼容的问题。 - 声明
long
型变量,必须以l
或L
结尾。
实际上,有时不带l
或L
也不会出错。本质上还是因为赋值,相当于不带l
或L
的在int
类型表数范围内的数是int
型的,赋值给了一个long
型的变量,这时会自动类型转换,即int
型的数自动转换为long
型了。 - 通常定义整型变量时,使用
int
型。
浮点型
- Java的浮点类型有:
float
、double
。 - Java的浮点类型也有固定的表数范围和字段长度,不受具体操作系统的影响。
虽然float
型和int
型占用的存储空间都是4byte
,但是float
型表示的数带有小数点并且表数范围比int
型要大,实际上比long
型表数范围还大。这是因为对于整型,整个存储空间就是表示一个数,而对于浮点型,存储空间中一部分用来表示数,一部分用来表示幂数即10的几次方,因此表数范围很大。 浮点型常量有两种表示形式:
- 十进制数形式(必须有小数点):如:5.12, 512.0f, .512
- 科学计数法形式:如:5.12e2, 521E2, 100E-2
float
:单精度,尾数可以精确到7位有效数字。很多情况下,精度很难满足需求,后面会有Java的相关类来表示更大精度的数。double
:双精度,精度是float
的两倍。通常采用这种类型。- Java的浮点型常量默认为
double
型,声明float
型常量,必须以f
或F
结尾。 - 如果定义
float
类型时,给其赋值在其表数范围内,但是没有以f
或F
结尾,会报错。错误类型为错误: 不兼容的类型: 从double转换到float可能会有损失
。也就是说,由于系统默认带小数点的数的类型为double
,由于赋值,相当于把double
型赋给了float
型,因此出现数据类型不兼容的错误。 - 通常定义浮点型变量时,使用
double
型。
字符型
- Java的字符类型有:
char
。 - 定义
char
型变量,通常使用一对单引号''
,在单引号中写一个字符。
定义char
型变量,也存在可以不使用单引号就能定义的情况,就是直接用一个ASCII码对应的整数范围内的整数定义,此时就相当于定义了一个该整数对应的ASCII码的字符。
注意字符类型就是表示一个字符的类型,因此没有空字符类型。也不能是多个字符,因此就是有且仅有一个字符。 char
型数据用来表示通常意义上的字符
,其字段长度即占用的存储空间为2 byte
。- Java中所有字符都使用
Unicode
编码,因此一个字符
可以存储一个字母、一个汉字或其他书面语的一个字符。 字符型变量的3种表现形式:
- 字符常量是用单引号
''
括起来的单个字符。如char c1 = 'a'
。 - Java中还允许使用转义字符
\
来将其后的字符转变为特殊字符型常量。如char c2 = '\n'
。 - 可以直接使用
Unicode
值来表示字符型常量,\uXXXX
。其中XXXX
代表一个十六进制整数。如\u000a表示\n
。
- 字符常量是用单引号
char
类型是可以进行运算的,因为它有对应的Unicode
码。
乱码情况和字符集
在计算机内部,所有数据都使用二进制表示。每一个二进制位(bit)有0和1两种状态。
也就是说计算机上所展示了各种数据在底层都是以二进制存储的,因此存在一个对应关系,将我们所看到的数据存储时对应到其对应的二进制表示,同时在我们去读一个数据时,也会将存储的二进制对应到其对应的数据,即还原成我们所看到的样子。
将我们看的数据对应到其对应的二进制,将二进制数据还原成我们所看到的数据,中间的这个对应关系的就是字符集。ASCII码
- 最简单的也是最初的一个字符集就是ASCII码。
- ASCII码:美国制定的一套字符编码,对英文字符与二进制之间的关系做了统一规定,被称为ASCII码。ASCII码一共规定了
128
个字符的编码。这128个符号只占用了一个字节的后7位,最前面的1位统一规定为0. 缺点:不能表示所有字符。
Unicode编码
- 乱码:世界上存在着多种编码方式,同一个二进制数字可以被解释为不同的符号。因此,要想打开一个文本文件,就必须知道它的编码方式,用错误的编码方式解读,就会出现乱码。
Unicode
:一种编码,将世界上所有的符号都纳入其中。每个符号都给予了一个独一无二的编码,使用Unicode没有乱码的问题。缺点:
Unicode
只规定了符号的二进制代码,却没有规定这个二进制代码应该如何存储:无法区别Unicode
和ASCII
;计算机无法区分三个字节表示一个符号还是表示三个符号。另外,英文字母只用一个字节表示就够了,如果Unicode
统一规定,每个符号用三个或四个字节表示,那么每个英文字母前都必须有2到3个字节是0,这对于存储空间来说是极大的浪费。UTF-8
UTF-8
是在互联网上使用最广的一种Unicode
实现方式。UTF-8
是一种变长的编码方式。它可以使用1~6个字节表示一个符号,字节长度根据不同的符号而变化。UTF-8
的编码规则:- 对于单字节的
UTF-8
编码,该字节的最高位为0,其余7位用来对字符进行编码(等同于ASCII码)。 对于多字节的
UTF-8
编码,如果编码包含n个字节,那么第一个字节的前n位为1,第一个字节的n+1位为0,该字节的剩余各位用来对字符进行编码。在第一个字节之后的所有字节,都是最高两位为10
,其余6位用来对字符进行编码。示例
用
UTF-8
方式存储,但用命令行解析报错。是因为,命令行读取文件是用GBK
编码方式。因此,出现乱码现象,这里是直接报错。如果不想出现乱码问题,写入与读入的编码方式应该一致。
- 对于单字节的
布尔型
- 对于布尔型就不说所谓的表数范围或字段长度了,布尔型只能取两个值:
true
和false
。 - Java中的布尔型与C语言中的不同,不存在0、1表示true或false。
- 通常在条件判断或循环结构中使用。
基本数据类型转换
基本数据类型的转换是指除了boolean
型的其他7种之间的转换:byte
, short
, int
, long
, float
, double
, char
。
自动类型转换
- 自动类型转换:
容量
小的类型自动转换为容量
大的数据类型。这里的容量指的是表数范围
。数据类型按照容量
大小排序为: - 有多种类型的数据混合运算时,系统首先自动将所有数据转换为
容量
最大的那种数据类型,然后再进行计算。 char
型在与其他基本数据类型进行自动转换时,其值就是其对应的Unicode
编码所对应的数,而这个数是int
型。- 系统默认的在
int
类型表数范围内的数的数据类型就是int
型。 byte
,short
,char
之间不会相互转换,它们三者在计算时首先转化为int
型。因为由于系统默认的在int
类型表数范围内的数据类型为int
型,char
型就相当于int
型。
需要注意的是,byte
与byte
之间、short
与short
之间、char
与char
之间的转换,也是转换为int
型。boolean
类型不能与其他基本数据类型
运算。- 所有
基本数据类型
都可以和String
数据类型进行转换,当把任何基本数据类型的值和字符串(String)
进行连接(+)
运算时,基本数据类型的值将自动转化为字符串(String)
型。
强制类型转换
自动类型转换的逆过程,将
容量
大的数据类型转换为容量
小的数据类型。使用时要加上强制转换符()
,但可能造成精度下降或溢出
(也称精度损失
),需要注意。只是可能,如果强制转换前后值并没有发生变化,那就没有精度下降或溢出
。精度损失
的特殊形式:用超过byte
表数范围的数强制转换为byte
类型。
- 强制类型转换不存在
四舍五入
,就是截断
。 - 通常,
字符串
不能直接转换为基本数据类型,但通过基本类型对应的包装类则可以实现把字符串转换为基本类型。 boolean
类型不能转换为其它任何基本数据类型。基本数据类型变量运算规则的特殊情况
- 在定义
long
型数据时,如果赋值的数是在int
型表数范围内,那么不以l
或L
结尾不会出错。而如果赋值的数超过了int
型表数范围内,那么不以l
或L
结尾会出错。 - 在定义
float
型数据时,必须以f
或F
结尾。因为对于带小数点的数,系统默认就是double
型,因此,如果不以f
或F
结尾,相当于将一个double
型赋值给float
型变量,会出现数据类型不兼容
错误。 - 整形常量(不超过
int
型的表数范围)默认类型为int
型。 - 浮点型常量默认类型为
double
型。
字符串类型String
String
不是基本数据类型
,属于引用数据类型
。- 声明
String
类型变量时,使用一对双引号(""
)。 - 与字符类型不同,
String
数据类型存在空字符串的值。 String
可以和所有基本数据类型
做运算,即boolean
数据类型也能与String
数据类型进行运算,且运算只能是连接(
+)
运算,运算结果仍然是String
类型。因为,所有基本数据类型
皆可字符串化。