方法引入
变量的声明与赋值
说明:变量表示存储单元,变量名就是存储单元的名称,变量初始化之后就可以通过变量名访问存储单元。
1、变量声明 int i; String str; //还没有分配存储空间
2、初始化(赋初值) i=10; str=”abc”; //初始化之后就分配了存储空间
3、声明并赋值 int i = 10; String str=”abc”; //声明的同时进行初始化
注意:变量在使用之前必须先初始化(赋初值)。
常量的声明与赋值
声明常量需要使用final关键字,如,final double PI = 3.1415926。
常量通常在声明时赋值,并且赋值之后其值不能改变
常量标识符通常全部为大写。
实例变量与局部变量
根据变量声明的位置,变量可以分为实例变量(也叫全局变量)和局部变量。
实例变量及作用范围
在类的{}内直接定义的变量,称为全局变量。
作用范围:整个类中都可以使用
实例变量在创建对象时会自动初始化,并有初始值(默认值)
byte/short/int:0
long:0L
float:0.0f
double:0.0
char:空
boolean:false
引用类型:null
局部变量及作用范围
在方法中或代码块{}中定义的变量,称之为局部变量。
作用范围:直接包含它的{}内有效
局部变量不会自动初始化,没有默认值,使用之前必须要初始化。
类型转换
自动类型转换
类型兼容、小类型转换为大类型
byte-->int short--->int int--->long
long--->float float--->double
String--->Object (子类--->父类)
格式: 小类型 变量名1 = 变量值1;
大类型 变量名2 = 变量值1;
int test1 = 188;
long test2 = test1;
强制类型转换
大类型转换为小类型
int-->byte int--->short long--->int
float--->long double--->float
Object--->String
格式: 大类型 变量名1 = 变量值1;
小类型 变量名2 = (小类型)变量值1;
例: double d = 123.345567;
float f = (float) d;
运算符
可以将大部分Java运算符划分为四组:算术运算符、位运算符、关系运算符以及逻辑运算符。
赋值运算符
赋值运算符有一个有趣的特性:它允许创建赋值链。例如,分析下面的代码段:
int x, y, z;
x = y = z = 100; // set x, y, and z to 100
但这种赋值方法在实际开发中基本不会使用。
算术运算符
算术运算符用于数学表达式,其使用方法与在代数中的使用方法相同。
运算符 | 结 果 |
+ | 加法(也是一元加号) |
- | 减法(也是一元负号) |
* | 乘法 |
/ | 除法 |
% | 求模/取余 |
+= | 加并赋值 |
-= | 减并赋值 |
*= | 乘并赋值 |
/= | 除并赋值 |
%= | 求模并赋值 |
++ | 自增 |
-- | 自减 |
需要注意的地方:
(1)当将除法运算符用于整数类型时,其结果不会包含小数部分。
(2)求模运算符%,返回除法操作的余数。它既可以用于浮点数也可以用于整数。可以用于判断一个整数是否是奇数、偶数、是否是某个数的倍数。
算术与赋值复合运算符
int a = 1;
a += 2; //相当于a = a+2;
(1)对于所有的二元算术运算,都有相应的复合赋值运算符。
(2)复合赋值运算符的效率更高。所以在专业的Java程序中,会经常看到复合赋值运算符。
自增与自减
(1)自增运算符将其操作数加1。自减运算符将其操作数减1。
(2)自增与自减分前缀形式与后缀形式。++、--
前缀形式:
int i = 10;
int a = ++ i; //等同于 i++; int a = i; 所以a=11, i= 11
后缀形式:
int j = 10;
int b = j++; //等同于 int b = j; j++; 所以b=10,j = 11
前缀形式和后缀形式区别:
++i和--1是先计算,后运行
i++和i--是先运行,后计算
表达式
(1)表达式的概念:由操作数与运算符组成 j++; a+b;
(2)表达式的求值:表达式是有值的,需要注意表达式值的类型
(3)表达式中的类型提升规则:
表达式的类型会自动提升为所有操作数的最大类型。
对于操作数全为非long类型整数的表达式,其类型会自动提升为int。
对于操作数全为非double类型浮点数的表达式,其类型会自动提升为double。
关系运算符
关系运算符也称为比较运算符
运算符 | 结 果 |
== | 等于 |
!= | 不等于 |
> | 大于 |
小于 | |
>= | 大于等于 |
小于等于 |
(1)关系运算的结果为boolean型数值,只有true和false两种值。
(2)关系运算符最常用于if语句和各种循环语句中的控制表达式。
逻辑运算符
布尔逻辑运算符,只能操作boolean型操作数。
运算符 | 结 果 |
&& | 逻辑与(短路形式) |
|| | 逻辑或(短路形式) |
^ | 逻辑异或 |
! | 逻辑一元非 |
& | 逻辑与 |
| | 逻辑或 |
布尔逻辑运算规则:
操作数 | 逻辑运算及结果 | ||||
A | B | A || B | A && B | !A | A ^ B |
false | false | false | false | true | false |
true | false | true | false | false | true |
false | true | true | false | true | true |
true | true | true | true | false | false |
运算规则说明:
对于||,只要有一个操作数为true,则结果为true;
对于&&,只要有一个操作数为false,则结果为false。
对于^,两个操作数不同,则结果为true,否则结果为false。
注意:&&和||,这两个运算符是所谓短路形式的逻辑运算符。假如单独根据左操作数就能确定表达式的结果,那么就不会计算右操作数的值。
位运算符
工作中基本不使用
三目(三元)运算符
运算规则
表达式1 ? 表达式2: 表达式3
语法:表达式1?表达式2:表达式3
表达式1必须是boolean类型的表达式
如果结果为true,那么取表达式2的结果
如果结果为false,那么取表达式3的结果
int aa = 24;
int bb = 23;
int r = aa>bb?3:4;
System.out.println("r = "+r);
大概顺序:算术运算符>移位运算符>关系运算符>逻辑运算符>赋值运算符
圆括号会提升其内部操作数的优先级。为了得到所期望的结果,这通常是必需的。圆括号(不管是否冗余)不会降低程序的性能。所以,为了减少模糊性而添加圆括号,不会对程序造成负面影响。
流程控制--选择结构
选择结构是通过分支语句实现的,分支语句有两种。
if分支
if语句的三种形式
注意:
else 不能单独使用,要和if配对使用
if else 都可以后面不跟{},但是只能控制下面的一行代码
switch分支
switch语句的结构
switch (expression) {
case value1:
// statement sequence
break;
case value2:
// statement sequence
break;
...
case valueN :
// statement sequence
break;
default:
// default statement sequence
}
switch语句需要注意的问题
(1)switch(expression)中expression的结果必须是byte,short,char,int,枚举类型、String中的一种。 不可以是long
(2)在同一个switch语句中,两个case常量不允许具有相同的值
(3)每个case语句中需要加上break;语句。如果遗漏了break,则会继续进入到下一个case。
(4)可以省略default语句。
(5)default语句通常放在末尾,可以放在开始,中间或者末尾位置。
if-else与Switch的区别
(1)switch语句只能进行相等性测试,这一点与if语句不同,if语句可以对任何类型的布尔表达式进行求值。即,switch只查看表达式的值是否和某个case常量相匹配。
(2)相对于一系列嵌套的if语句,switch语句通常效率更高。
(3) switch能做的分支,if...else...一定能做。但是if...else...能做的分支,switch不一定能做。