文章目录
- 变量
- 定义
- 声明
- 赋值
- 使用
- 简化
- 数据类型
- 基本数据类型
- 整型
- 浮点型
- 布尔型
- 字符型
- 空型
- 引用数据类型
- 数据类型转换
- 自动类型转换
- 强制类型转换
- 运算符
- 算术运算符
- 赋值运算符
- 比较运算符
- 逻辑运算符
- 位运算符
- 条件运算符
- 一元运算符
- 二元运算符
- 三元运算符
- 运算符优先级
变量
变量类似于数学中的未知数x,是计算机中内存地址的一个别名。这样就可以通过这个变量来操作该内存空间的存储内容了。
定义
在Java中变量需要先声明再使用。故变量的定义可以分为三步:声明,赋值和使用。
声明
声明就是声明一个变量的数据类型和其名称,格式如下:数据类型 变量名称
数据类型可以指定这个变量所占的内存空间大小。
// 声明一个变量
int age;
赋值
赋值就是为声明的变量,存储一个内容,格式如下:变量名 = 值
// 为变量赋值
age = 12;
使用
当变量完成声明和赋值后,就可以使用了。
// 使用变量
System.out.println("我的年龄是: " + age);
简化
为了提供效率,有时候也可以将声明和赋值合并在一步中,格式如下:数据类型 变量名 = 值
上述例子可以简化为:
int age = 12;
System.out.println("我的年龄是: " + age);
数据类型
Java是强数据类型的语言,变量之间进行运算时,需要变量的数据类型具有兼容性。数据类型通常分为无引用数据类型(基础数据类型)和引用数据类型。
基本数据类型
基础数据类型通常分为数值型,字符型,布尔型和空型。
整型
整型数据类型用来表示整数,根据不同数据类型所占的内存大小,分为byte,short,int和long这四种数据类型。
数据类型 | 内存大小 | 数据范围 | 案例 |
---|---|---|---|
byte | 1字节 | -2^7 ~ 2^7-1 | 1 |
short | 2字节 | -2^15 ~ 2^15 -1 | 2 |
int | 4字节 | -2^31 ~ 2^31 -1 | 3 默认 |
long | 8字节 | -2^63 ~ 2^63 -1 | 3L |
浮点型
浮点型表示小数,根据精度不同,分为float和double两种数据类型。
数据类型 | 内存大小 | 数据范围 | 案例 |
---|---|---|---|
float | 4字节 | -3.403E38 ~ 3.403E38 | 2.0F |
double | 8字节 | -1.798E308 ~ 1.798E308 | 2.0D 默认 |
布尔型
布尔型主要有两个true和false,通常用在条件语句和循环语句中。
字符型
字符型表示单个字符,用单引号包围,例如’a’。内存空间为2个字节。实现原理,底层存储为整型。几个特殊的字符所对应的整型,'A’为65,'a’为97,'0’为48
空型
空型表示一种特殊的类型,通常用在方法中,表示没有返回值。
引用数据类型
引用数据类型有类,接口,枚举,注解和数组等。
数据类型转换
Java中通常当数据类型不一致时,会编译报错。所以在使用过程中需要进行数据类型转换。
自动类型转换
当运算过程中,当操作数的数据类型不一致时,java会先将操作数的数据类型自动转换为统一的数据类型,然后再以统一的数据类型输出结果。
自动类型转换的规律是,内存空间低的数据类型可以自动转换为内存空间高的数据类型。
强制类型转换
当将内存空间高的数据类型转换为内存空间低的数据类型时,需要进行强制数据类型转换。格式:(数据类型) 变量名
当进行强制数据类型转换时,需要注意的是注意截断问题
布尔型无法与其他数据类型进行转换。
- 表达式类型自动提升的一般原则:表达式结果的类型为操作数中最大的类型
- byte类型和short类型进行运算时,系统自动当作int类型处理
- char变量可以保存为int常量值,但不能直接保存为int变量值,char类型进行运算时,系统自动当作int类型处理
- 自动类型转换的逆过程是将容量大的数据类型转换为容量小的数据类型。使用时要加上强制转换符号,但可能造成精度降低或溢出,需要格外注意。
- 强制转换符号为小括号,优先级非常高,故强制转换表达式结果的类型时,需要将表达式用小括号包起来,提升优先级。
- 布尔类型不可以转换为其他的数据类型。
short a = 97;
int b = 200;
a = (short) b;
运算符
运算符就是Java中特殊的符号,表示运算方法。
算术运算符
运算符 | 说明 | 示例 |
---|---|---|
+ | 正号 | +2 |
- | 负号 | -4 |
+ | 加法 | a +b |
- | 减法 | a-b |
* | 乘法 | a*b |
/ | 除法 | a/b |
% | 取余 | a%b |
++ | 自增 | ++a,a– |
– | 自减 | –a,a– |
+ | 字符串连接 | “a”+b |
特殊运算符的说明
:
- 除法,被除数、除数都是整型,则结果为整型,且结果以阶段方式取整。若被除数或除数是浮点型,则结果就是浮点型。都是整型时,除数为0时会产生ArithmeticException异常,浮点型时,除数为0或0.0时,则不会报异常,得到的结果是Infinity。
- 当除数为0时,取余的结果为NaN
- ++和–不会改变本身变量的数据类型
- ++a时,a先自增1,再去变量的值做其他运算
- a++时,先取变量的值放入操作数栈,随后自增变量增1,然后用自增之前取的值进行运算
- +作为字符串连接符时,可以和八种基本数据类型变量运算,运算结果为String
赋值运算符
复合赋值运算符是先进行运算然后数据类型转换,最后赋值。注意根据左侧操作数的数据类型,进行数据类型强转
。
运算符 | 说明 | 示例 |
---|---|---|
= | 赋值 | a = 2 |
+= | 加等 | a += 2 |
-= | 减等 | a -= 2 |
*= | 乘等 | a *= 2 |
/= | 除等 | a /= 2 |
%= | 取余等 | a %= 2 |
&= | 位与等 | a &= 2 |
|= | 位或等 | a |= 2 |
^= | 位异或等 | a ^= 2 |
<<= | 左移等 | a <<= 2 |
>>= | 右移等 | a >>= 2 |
>>>= | 无符号右移等 | a >>>= 2 |
比较运算符
比较时操作数的类型具有一致性或兼容型
比较运算符就是用来比较变量值之间的大小,比较运算符的结果都是布尔型。Java中比较运算符如下表:
运算符 | 说明 | 案例 |
---|---|---|
== | 相等 | a == b |
!= | 不等 | a != b |
< | 小于 | a < b |
> | 大于 | a > b |
<= | 小于等于 | a <= b |
>= | 大于等于 | a >= b |
Java中最对基本数据类型和引用类型,在相等判断上有区别:
- 如果两个操作数为基本数据类型,则“==”判断的是值是否相等。
- 如果两个操作数为引用类型,则“==”判断的是两个引用是否指向同一个对象实体或数组实体。
逻辑运算符
逻辑运算符用于表示多个条件之间的相关关系,其结果也为布尔型。两侧的操作数的数据类型为布尔型。
Java中逻辑运算符如下表:
运算符 | 案例 | 说明 |
---|---|---|
&& | a && b | 短路与,a为false时,b不会被执行,直接返回false,效率更高,其他与与运算符一致。 |
& | a & b | 与,只有a和b都为true时,返回true,否则返回false;a和b都会被执行 |
|| | a || b | 短路或,a为true时,b不会被执行,直接返回true,效率更高。 |
| | a | b | 或,只有a和b都为false时,返回false,否则返回true;a和b都会被执行 |
^ | a ^ b | 异或,当a和b相同时,返回false;不同时返回true |
! | !a | 非,返回与a相反的结果 |
位运算符
位运算符的操作数的数据类型位数值类型。
位运算符就是操作变量的二进制码,效率比较高,但是比较抽象难懂。因为它的操作都是针对变量在内存中的补码形式
进行。
运算符 | 案例 | 说明 |
---|---|---|
<< | a << 2 | 将a的二进制补码左移2位,移出的低位以0补充。一定范围内,左移几位相当于乘以2的几次方 |
>> | a>>2 | 将a的二进制补码右移2位,如果a的高位为0,则移出的高位以0补充;如果移出的高位为1,则移出的高位以1补充。 |
>>> | a >>> 2 | 将a的二进制补码右移2位,移出的高位以0补充 |
& | 6 & 2 | 将6和2的二进制补码,按位进行与操作,返回执行后的数值 |
| | 6 | 2 | 将6和2的二进制补码,按位进行或操作,返回执行后的数值 |
^ | 6 ^2 | 将6和2的二进制补码,按位进行异或操作,返回执行后的数值 |
~ | ~6 | 将6的二进制补码,按位取反,并返回执行后的数值 |
通过操作数的类型来判断是位运算符还是逻辑运算符
条件运算符
条件运算符是唯一的三元运算符,可以实现简单的条件判断。
语法结构为:条件表达式?表达式1:表达式2
- 当条件表达式结果为true时,返回表达式1的结果
- 当条件表达式结果为false时,返回表达式2的结果
表达式1和表达式2具有相同的数据类型
一元运算符
一元运算符有四个,分别为++, --, !和~。
二元运算符
除了一元和三元运算符外,剩下的都是二元运算符。
三元运算符
Java中只有一个三元运算符,其语法为:条件表达式?值1:值2
,当条件表达式为true时,返回值1,否则返回值2
运算符优先级
和四则运算一样,当表达式中出现多个运算符时,计算器根据优先级,决定先执行哪个部分的运算。优先级越高,越优先执行。
通常利用小括号来实现优先级的提高。
优先级 | 运算符符号 |
---|---|
1 | ++, --, ~, ! |
2 | *, /, % |
3 | +, - |
4 | <<, >>, >>> |
5 | <, >, <=, >=, instanceof |
6 | ==, != |
7 | & |
8 | ^ |
9 | | |
10 | && |
11 | || |
12 | ?: |
13 | =, *=, /=, %= |
14 | +=, -=, <<=, >>= |
15 | >>>=, &=, ^=, |= |
在做运算符相关的题时记住已经几点就可以确保无错:
- 操作数的类型统一性
- 优先级相关的可以参考后缀表达式来理解