1、计算机中的进制与字节
1.1 进制
十进制数据转成二进制数据:使用除以2获取余数的方式
二进制数据转成十进制数据:使用8421编码的方式
2、运算符
2.1 算术运算符
运算符和表达式
运算符:对常量或者变量进行操作的符号
表达式:用运算符把常量或者变量连接起来符合java语法的式子就可以称为表达式。
不同运算符连接的表达式体现的是不同类型的表达式。
举例说明:
+:是运算符,并且是算术运算符。
a + b:是表达式,由于+是算术运算符,所以这个表达式叫算术表达式。
操作符 | 描述 |
---|---|
+ | 加法(也是一元加号) |
- | 减法(也是一元减号) |
* | 乘法 |
/ | 除法 |
% | 求模运算符,既可以用于浮点数,也可以用于整数 |
Java中,整数使用以上运算符,无论怎么计算,也不会得到小数。
一元减号运算符对 其唯一的操作数进行求反,一元加号运算符简单返回其操作数的值。
除法运算符用用整数类型时,结果不会包含小数部分。
+ 符号在字符串中的操作:
+ 符号在遇到字符串的时候,表示连接、拼接的含义。
“a”+"b"的结果是“ab”,连接含义
2.1.1 自增自减运算符
独立运算:
变量在独立运算时, 前++ 和 后++ 没有区别 。
变量 前++ :例如 ++i 。
变量 后++ :例如 i++ 。
混合运算:
和其他变量放在一起, 前++ 和 后++ 就产生了不同。
变量 前++ :变量a自己加1,将加1后的结果赋值给b,也就是说a先计算。a和b的结果都是2。
public static void main(String[] args) {
int a = 1;
int b = ++a;
System.out.println(a);//计算结果是2
System.out.println(b);//计算结果是2
}
变量 后++ :变量a先把自己的值1,赋值给变量b,此时变量b的值就是1,变量a自己再加1。a
的结果是2,b的结果是1。
public static void main(String[] args) {
int a = 1;
int b = ++a;
System.out.println(a);//计算结果是2
System.out.println(b);//计算结果是1
}
2.2 位运算符
操作符 | 描述 |
---|---|
~ | 按位一元取反,翻转操作数的每一位,即0变成1,1变成0。 |
& | 按位与,如果相对应位都是1,则结果为1,否则为0 |
| | 按位或,如果相对应位有一个1,则结果为1;全为0,否则为0 |
^ | 按位异或 ,如果相对应位值不同,则结果为1,否则为0 |
>> | 右移 |
>>> | 右移0填充 |
<< | 左移 |
2.3 赋值运算符
赋值运算符是单个等号"="
一般形式:
var = expression;
它允许赋值链:
int x,y,z;
x=y=z=100;
操作符 | 描述 |
---|---|
&= | 按位与赋值 |
|= | 按位或赋值 |
^= | 按位异或赋值 |
>>= | 右移并赋值 |
>>> | 右移0填充并赋值 |
<<= | 左移并赋值 |
public static void main(String[] args){
short s = 1;
s+=1;
System.out.println(s);
}
分析: s += 1 逻辑上看作是 s = s + 1 计算结果被提升为int类型,再向short类型赋值时发生错误,因为不能将取值范围大的类型赋值到取值范围小的类型。但是, s=s+1进行两次运算 , += 是一个运算符,只运算一次,并带有强制转换的特点,也就是说 s += 1 就是 s = (short)(s + 1) ,因此程序没有问题编译通过,运行结果是2
复合赋值运算符
+=、-=等都是复合赋值运算符:
优点
1、便于输入
2、有时它们比等价的长格式的版本效率更高。
2.4 关系运算符
关系运算符有6种关系,分别为小于、小于等于、大于、等于、大于等于、不等于。
可判定相等和排序关系。
注意事项:
关系运算符的结果都是boolean类型,要么是true,要么是false。 最常用于if语句和各种循环语句的控制表达式中。
千万不要把“==”误写成“=”,"==“是判断是否相等的关系,”="是赋值。
java中任何类型,都可以进行相等和不相等测试
只有数值类型才能使用排序运算符,即只有整型、浮点型以及字符型,才可以进行比较以判定相互之间的大小
java中,true和false不是数值,它们与是否为0没有任何关系。
int done;
if (done == 0)...//不能写成 if (!done)...
2.5 布尔逻辑运算符
逻辑运算符把各个运算的关系表达式连接起来组成一个复杂的逻辑表达式,以判断程序中的表达式是否成立,判断的结果是 true 或 false
只能操作布尔型操作数,结果值是布尔类型
操作符 | 描述 | 说明 |
---|---|---|
& | 逻辑与 | a&b,a和b都是true,结果为true,否则为false |
| | 逻辑或 | a|b,a和b有一个为true,则为true;都是false,才为false, |
^ | 逻辑异或 | a^b,a和b结果不同为true,相同为false |
&& | 短路与 | |
|| | 短路或 | |
! | 逻辑一元非 | |
&= | 逻辑与并赋值 | |
|= | 逻辑或并赋值 | |
^= | 逻辑异或并赋值 | |
== | 等于 | |
!= | 不等于 | |
?: | 三元 if-then-else |
短路逻辑运算符
short-circuit
java正式规范将短路运算符称为条件与(conditional-and)和条件或(condition-or)
在逻辑与运算中,只要有一个表达式的值为false,那么结果就可以判定为false了,没有必要将所有表达式的值都计算出来,短路与操作就有这样的效果,可以提高效率。同理在逻辑或运算中,一旦发现值为true,右边的表达式将不再参与运算。
逻辑与&,无论左边真假,右边都要执行。
短路与&&,如果左边为真,右边执行;如果左边为假,右边不执行。
逻辑或|,无论左边真假,右边都要执行。
短路或||,如果左边为假,右边执行;如果左边为真,右边不执行。
对于布尔逻辑,使用逻辑与和逻辑或的短路形式是标准用法,而将单字符的版本专门留给位运算。但是也有例外
三元运算符
三元运算符语法格式:
表达式1 ? 表达式2 : 表达式3;
解释:表达式1是判断的条件(任何结果为布尔值的表达式),判断结果为boolean型;为true时,对表达式2进行求值,为false时对表达式3进行求值。
“?”运算的结果是进行求值的表达式的值
表达式2和表达式3都需要返回相同或兼容的类型,并且不能为void。
三元运算符在使用时必须要有赋值,没有赋值是错误语法。
int c = a > b ? a : b;
2.6 Java 运算符优先级
同一行中的运算符具有相同的优先级。
二元运算,求值顺序从左向右进行(赋值运算除外,它是从右向左求值)
技术上讲,[ ] 、() 、. 是分隔符,但也可以作为运算符(优先级最高)
箭头运算符(->),用于Lambda表达式
3、变量
变量:常量是固定不变的数据,那么在程序中可以变化的量称为变量。
Java中要求一个变量每次只能保存一个数据,必须要明确保存的数据类型。
3.1 变量的定义
变量定义的格式包括三个要素: 数据类型 、 变量名 、 数据值 。
// 声明变量并赋值
// 数据类型 变量名 = 数据值; 比如
int age = 18;
System.out.println(age);
或者
// 先声明,后赋值(使用前赋值即可)
// 数据类型 变量名;
// 变量名 = 初始化值;
double money;
money = 55.5;
System.out.println(money);
或者
//还可以在同一行定义多个同一种数据类型的变量,中间使用逗号隔开。 但不建议使用这种方式,降低程序的可读性。
int a = 10, b = 20; // 定义int类型的变量a和b,中间使用逗号隔开
System.out.println(a);
System.out.println(b);
int c,d; // 声明int类型的变量c和d,中间使用逗号隔开
c = 30;
d = 40;
System.out.println(c);
System.out.println(d);
long类型:建议数据后加L表示。
float类型:建议数据后加F表示。
3.2 注意事项
变量名称:在同一个大括号范围内,变量的名字不可以相同。
变量赋值:定义的变量,不赋值不能使用。
定义long类型的变量时,需要在整数的后面加L(大小写均可,建议大写)。因为整数默认是int类型,整
数太大可能超出int范围。
定义float类型的变量时,需要在小数的后面加F(大小写均可,建议大写)。因为浮点数的默认类型是
double, double的取值范围是大于float的,类型不兼容。
4、 标识符
标识符:是指在程序中,我们自己定义内容。比如类的名字、方法的名字和变量的名字等等,都是标识
符。
命名规则: 硬 性 要 求
标识符可以包含 英文字母26个(区分大小写) 、 0-9数字 、 $(美元符号) 和 _(下划线) 。
标识符不能以数字开头。
标识符不能是关键字。
命名规范: 软 性 建 议
类名规范:首字母大写,后面每个单词首字母大写(大驼峰式)。
Demo02MethodDefine
Demo03MethodInvoke
方法名规范: 首字母小写,后面每个单词首字母大写(小驼峰式)。
变量名规范:首字母小写,后面每个单词首字母大写(小驼峰式)。
num
value
maxValue
5、数据类型转换
Java程序中要求参与的计算的数据,必须要保证数据类型的一致性,如果数据类型不一致将发生类型的转换。
5.1 自动转换
一个 int 类型变量和一个 byte 类型变量进行加法运算, 结果会是什么数据类型?
int i = 1;
byte b = 2;
运算结果,变量的类型将是 int 类型,这就是出现了数据类型的自动类型转换现象。
自动转换:将 取值范围小的类型 自动提升为 取值范围大的类型 。
同样道理,当一个 int 类型变量和一个 double 变量运算时, int 类型将会自动提升为 double 类型进行运算。
转换规则
范围小的类型向范围大的类型提升, byte、short、char 运算时直接提升为 int 。
double 类型内存8个字节,
char类型内存2个字节,
int类型内存4个字节
5.2 强制转换
强制类型转换:将 取值范围大的类型 强制转换成 取值范围小的类型 。
比较而言,自动转换是Java自动执行的,而强制转换需要我们自己手动执行。
转换格式:
数据类型 变量名 = (数据类型)被转数据值;
范围大的类型必须真实指向范围小的类型
public void service(ServletRequest req, ServletResponse res)
throws ServletException, IOException
{
HttpServletRequest request;
HttpServletResponse response;
try {
request = (HttpServletRequest) req; //父类赋值给子类
response = (HttpServletResponse) res;
} catch (ClassCastException e) {
throw new ServletException("non-HTTP request or response");
}
service(request, response);
}
}
6、ASCII编码表
在计算机的内部都是二进制的0、1数据,如何让计算机可以直接识别人类文字的问题呢?就产生出了编码表的概念。
编码表:就是将人类的文字和一个十进制数进行对应起来组成一张表格。
存储字符时:需要查找ASC码表,找到字符对应的数字,将数字转换为二进制数存放到计算机中
使用字符时:将对应的二进制数转换为十进制 找到ASC表中对应的字符 显示出来
人们就规定:
字符 数值
0 48
9 57
A 65
Z 90
a 97
z 122
将所有的英文字母,数字,符号都和十进制进行了对应,因此产生了世界上第一张编码表ASCII(
American Standard Code for Information Interchange 美国标准信息交换码)。
在char类型和int类型计算的过程中,char类型的字符先查询编码表,得到97,再和1求和,结果为98。