Java 表达式、语句、代码块

Java 表达式、语句、代码块

一、核心概念区分(一句话分清)

  1. 表达式(Expression):能算出一个值的代码片段,有返回结果
  2. 语句(Statement):完整执行单元,完成一件事,以;结尾,不一定有返回值
  3. 代码块(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. 代码块出现的场景

  1. 分支/循环后包裹多语句
if(a>0){System.out.println("大于0");a++;}
  1. 方法体本身就是代码块
publicvoidtest(){// 方法块开始// 语句}// 方法块结束
  1. 类中的实例代码块静态代码块
classDemo{// 实例代码块,创建对象时执行{System.out.println("实例块");}// 静态代码块,类加载时执行static{System.out.println("静态块");}}
  1. 单独独立代码块(缩小变量作用域)
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;// 赋值表达式语句}}}}

拆解层级:

  1. main方法整体是代码块
  2. if(){}又是内层代码块
  3. a > 3a * 2a = a +1都是表达式
  4. int a =5;System.out.println(...);a=a+1;都是语句

六、易混易错点总结

  1. 表达式一定有值;语句不一定有值,以;结尾
  2. 表达式加分号 → 表达式语句
  3. {}包裹一堆语句 = 代码块(复合语句,整体视为一条语句)
  4. 局部变量作用域止于所属代码块的右大括号}
  5. if/for/while 后如果不写{},只能跟一条语句;多语句必须包代码块
  6. 赋值=是表达式,所以支持链式赋值int x=y=z=10;