Java 表达式、语句、代码块
一、核心概念区分(一句话分清)
- 表达式(Expression):能算出一个值的代码片段,有返回结果
- 语句(Statement):完整执行单元,完成一件事,以
;结尾,不一定有返回值 - 代码块(Block):
{}包裹的一组语句,把多条语句打包成整体,拥有独立作用域
二、表达式 Expression
1. 定义
任何可以求值、产生结果的代码,一定有返回值,可以放在赋值、判断、输出等位置。
2. 常见分类
(1)字面量表达式
10;// 整数表达式,值103.14;// 浮点数true;// 布尔"hello";// 字符串'A';// 字符(2)变量表达式
inta=5;a;// 表达式,值为5(3)运算表达式
算术、关系、逻辑、位运算、三元运算
a+3;// 算术a>0;// 关系(结果true/false)a>0&&a<10;// 逻辑a&1;// 位运算a>5?1:0;// 三元表达式(4)方法调用表达式
有返回值的方法调用是表达式
Math.max(1,2);// 返回2,属于表达式"abc".length();// 返回3(5)赋值表达式(重点)
=本身是表达式,会返回赋值后的值
inta;a=10;// 整个表达式结果是10intb=a=20;// 等价 int b = (a=20);3. 表达式不能单独当完整代码
单独写a + 1会编译报错;加分号a + 1;就变成表达式语句。
三、语句 Statement
1. 定义
Java 最小执行单元,用来完成操作,以分号;结束。
语句可以由表达式衍生,也可以是控制流、声明、空语句。
2. 分类
1)表达式语句(最常用)
表达式 +;升级成语句
inta=10;// 赋值表达式语句a++;// 自增表达式语句System.out.println(a);// 方法调用语句2)变量声明语句
定义变量,自带分号
intnum;doublepi=3.14;Stringstr="java";3)空语句
只有一个分号,什么都不做
;// 示例(多余空语句)if(a>0);{System.out.println();}4)控制流语句(无分号结尾,自带结构)
if / for / while / switch / break / continue / return
if(a>0){...}for(inti=0;i<10;i++){...}while(true){...}return0;// return是语句5)复合语句 = 代码块(下一节单独讲)
3. 表达式 vs 表达式语句对比
a+5// 表达式(仅求值,不能单独放一行)a+5;// 表达式语句(合法,执行但丢弃结果)四、代码块 Block(复合语句)
1. 格式
用大括号{ }包裹任意多条语句(0条/1条/多条都可以)
{inta=10;System.out.println(a);a++;}2. 核心特性:作用域
代码块内定义的局部变量,仅块内可见,出}直接销毁
publicstaticvoidmain(String[]args){intouter=10;{intinner=20;System.out.println(outer);// 可以访问外部变量}System.out.println(inner);// 编译报错,inner已失效}3. 代码块出现的场景
- 分支/循环后包裹多语句
if(a>0){System.out.println("大于0");a++;}- 方法体本身就是代码块
publicvoidtest(){// 方法块开始// 语句}// 方法块结束- 类中的实例代码块、静态代码块
classDemo{// 实例代码块,创建对象时执行{System.out.println("实例块");}// 静态代码块,类加载时执行static{System.out.println("静态块");}}- 单独独立代码块(缩小变量作用域)
publicstaticvoidmain(String[]args){{inttemp=99;System.out.println(temp);}// temp 不可用}4. 特殊规则
- 代码块整体算一条复合语句,if/while 后面不加
; - 块内可以再嵌套代码块(多层作用域)
- 同一个块内不能重名局部变量;内层块可以定义和外层同名变量(变量遮蔽)
五、三者嵌套完整示例
publicclassTest{publicstaticvoidmain(String[]args){// 1. 变量声明语句inta=5;// 代码块 { }{// a > 3 是表达式,if(表达式)if(a>3){// a * 2 表达式,构成表达式语句System.out.println(a*2);a=a+1;// 赋值表达式语句}}}}拆解层级:
main方法整体是代码块if(){}又是内层代码块a > 3、a * 2、a = a +1都是表达式int a =5;、System.out.println(...);、a=a+1;都是语句
六、易混易错点总结
- 表达式一定有值;语句不一定有值,以
;结尾 - 表达式加分号 → 表达式语句
{}包裹一堆语句 = 代码块(复合语句,整体视为一条语句)- 局部变量作用域止于所属代码块的右大括号
} - if/for/while 后如果不写
{},只能跟一条语句;多语句必须包代码块 - 赋值
=是表达式,所以支持链式赋值int x=y=z=10;
