2 Java语言基础

2.1 注释

2.1.1 分类

注释分类 写法 特点
单行注释 // 要注释的内容 注释单行内容,不会被JVM解析
多行注释 /
要注释的内容
要注释的内容
/
注释多行内容,不会被JVM解析
文档注释 /
要注释的内容
要注释的内容
*/
通常写在文档头部,定义类的语句上面,
或方法上面,Javadoc可以生成相应的文档
文档注释有很多选项可以写,一般通过开发
工具来控制

2.1.2 特点

  • 被注释的内容:JVM 不会解释执行

2.1.3 代码示例

  1. /**
  2. * 常用文档注释,用在类上面
  3. * @author lyl // 作者
  4. * @version 1.0 // 版本号(当前程序)
  5. * @see java.lang.Object // 指定到另一个类的链接
  6. * @see #test(String) // 指定到某个方法的连接
  7. * @see Object#toString() // 指定到某个类的某个方法上的连接
  8. * @since // 当有特定的变化时标记,通常后面跟JDK版本
  9. *(还有很多不常用的自行查询,此处不再一一列举)
  10. */
  11. public class NotesTest {
  12. public static void main(String[] args) {
  13. // 单行注释
  14. /*
  15. 多行注释
  16. 多行注释
  17. */
  18. /*
  19. * 多行注释
  20. * 多行注释
  21. */
  22. }
  23. /**
  24. * 常用文档注释,用在方法上面
  25. * @param str // 方法的参数
  26. * @return String // 返回值类型
  27. * @exception // 标记抛出的异常信息
  28. * @throws // 同 @exception
  29. */
  30. public String test(String str) {
  31. return str;
  32. }
  33. }

2.2 标识符

2.2.1 概念

Java对各种变量、方法和类等要素命名时使用的字符序列成为标识符

2.2.2 命名规则

  1. 标识符由字母、下划线”_”、美元符号”$”和数字组成
  2. 标识符不能以数字开头
  3. 大小写敏感,长度无限制

注意:

  • 标识符取名字是要“见名知意”
  • 不能与Java“关键字”重名
  • 命名规范 | 合法标识符 | 非法标识符 | 原因 | | —- | —- | —- | | HelloWorld | class | 使用了Java关键字 | | ABClass | ABClass*# | 使用了非法字符 | | _123 | 1_23 | 使用数字开头 | | $123_456 | hello world | 使用了空格 |

2.3 关键字(keyword)

2.3.1 概念

Java中一些赋以特定含义,用作专门用途的字符串

2.3.2 分类

Java关键字类别 Java关键字 关键字含义
访问控制 private 一种访问控制方式:私用模式,访问控制修饰符,可以应用于类、方法或字段(在类中声明的变量)
protected 一种访问控制方式:保护模式,可以应用于类、方法或字段(在类中声明的变量)的访问控制修饰符
public 一种访问控制方式:共用模式,可以应用于类、方法或字段(在类中声明的变量)的访问控制修饰符
类、方法和变量修饰符 abstract 表明类或者成员方法具有抽象属性,用于修改类或方法
class 声明一个类,用来声明新的Java类
extends 表明一个类型是另一个类型的子类型。对于类,可以是另一个类或者抽象类;对于接口,可以是另一个接口
final 用来说明最终属性,表明一个类不能派生出子类,或者成员方法不能被覆盖,或者成员域的值不能被改变,用来定义常量
implements 表明一个类实现了给定的接口
interface 接口
native 用来声明一个方法是由与计算机相关的语言(如C/C++/FORTRAN语言)实现的
new 用来创建新实例对象
static 表明具有静态属性
strictfp 用来声明FP_strict(单精度或双精度浮点数)表达式遵循IEEE 754算术规范
synchronized 表明一段代码需要同步执行
transient 声明不用序列化的成员域
volatile 表明两个或者多个变量必须同步地发生变化
程序控制 break 提前跳出一个块
continue 回到一个块的开始处
return 从成员方法中返回数据
do 用在do-while循环结构中
while 用在循环结构中
if 条件语句的引导词
else 用在条件语句中,表明当条件不成立时的分支
for 一种循环结构的引导词
instanceof 用来测试一个对象是否是指定类型的实例对象
switch 分支语句结构的引导词
case 用在switch语句之中,表示其中的一个分支
default 默认,例如:用在switch语句中,表明一个默认的分支。Java8 中也作用于声明接口函数的默认实现
错误处理 try 尝试一个可能抛出异常的程序块
catch 用在异常处理中,用来捕捉异常
throw 抛出一个异常
throws 声明在当前定义的成员方法中所有需要抛出的异常
包相关 import 表明要访问指定的类或包
package
基本类型 boolean 基本数据类型之一,声明布尔类型的关键字
byte 基本数据类型之一,字节类型
char 基本数据类型之一,字符类型
double 基本数据类型之一,双精度浮点数类型
float 基本数据类型之一,单精度浮点数类型
int 基本数据类型之一,整数类型
long 基本数据类型之一,长整数类型
short 基本数据类型之一,短整数类型
null 空,表示无值,不能将null赋给原始类型(byte、short、int、long、char、float、double、boolean)变量
true 真,boolean变量的两个合法值中的一个
false 假,boolean变量的两个合法值之一
变量引用 super 表明当前对象的父类型的引用或者父类型的构造方法
this 指向当前实例对象的引用,用于引用当前实例
void 声明当前成员方法没有返回值,void可以用作方法的返回类型,以指示该方法不返回值
保留字 goto 保留关键字,没有具体含义
const 保留关键字,没有具体含义,是一个类型修饰符,使用const声明的对象不能更新

2.3.3 特点

2.4 常量

2.4.1 概念

常量是指在程序的整个运行过程中值保持不变的量

2.4.2 分类

常量分类 示例 特点
整型常量 1、12、100 整数
实型常量 1.2、100.1 实数
字符常量 ‘1’ 、’a’ 、’我’、’$’ 使用单引号标识
字符串常量 “你好”、”hello_world!” 使用双引号标识
boolean型常量(逻辑常量) true、false 只有”真“和”假“两个
null null 表示空,无

2.4.3 特点

注意:通常我们使用final关键字修饰的变量也可称为常量,final表示不可改变

2.4.4 代码示例

  1. /**
  2. * 常量
  3. */
  4. public class Constant {
  5. public static void main(String[] args) {
  6. System.out.println(123);
  7. System.out.println(1.2);
  8. System.out.println('$');
  9. System.out.println("你好");
  10. System.out.println(true);
  11. String a = null;
  12. System.out.println(a);
  13. }
  14. }

2.5 变量

2.5.1 概念

Java变量是程序中最基本的存储单元,要素包括变量名、变量类型、和作用域

2.5.2 特点

  • 值在某个范围区间内可以改变
  • 格式

    • type name [ = value] [ {, name [ = value ] } ];
    • 数据类型 变量名 = 初始化值;(必须先声明,再赋值)
  • 命名规范

2.5.3 代码示例

  1. /**
  2. * 变量
  3. */
  4. public class Variable {
  5. public static void main(String[] args) {
  6. int a = 10;
  7. System.out.println(a);
  8. a = 1;
  9. System.out.println(a);
  10. double d1 = 2.0, d2 = 2.1;
  11. System.out.println(d1);
  12. System.out.println(d2);
  13. }
  14. }

2.5.4 分类

  1. 按声明位置分类:

    • 局部变量
    • 成员变量

注:类外面不能有对变量的声明

  1. 按数据类型分类:

    • 基本数据类型变量
    • 引用数据类型变量 | 分类 | 定义 | | —- | —- | | 局部变量 | 在方法体内部(包括形参)或语句块内部定义的变量 | | 成员变量 | 在方法体外部,类体内部定义的变量 |

2.5.5 特点

值可以改变

本质:变量其实是内存中的一小块区域,使用变量名来访问这块区域,因此,每一个变量必须先声明(申请内存空间),再赋值(填充内容)

2.5.6 代码示例

  1. /**
  2. * 成员变量和局部变量
  3. */
  4. public class Variable_02 {
  5. int i; // 成员变量,可以不用赋值,程序加载时会自动赋默认值
  6. int j = 1; // 成员变量
  7. public static void main(String[] args) {
  8. int i = 2; // 局部变量,使用前必须进行赋值
  9. }
  10. }

2.6 数据类型

2.6.1 分类

2.6.2 基本数据类型

4类8种

  • 布尔型(boolean)

    • 用法:用于逻辑运算,通常用于流程控制 | 类型 | 取值范围 | 默认值 | | —- | —- | —- | | boolean(布尔型) | true/false | false |

代码示例:

  1. /**
  2. * 布尔类型
  3. */
  4. public class BooleanType {
  5. public static void main(String[] args) {
  6. boolean bn = true;
  7. boolean bn1 = false;
  8. System.out.println(bn);
  9. }
  10. }
  • 字符型(char)

    • 用法: 用于表示字符
    • 取值:使用单引号引起来的单个字符,例如:’a‘,’你’,’$’,’1’
    • 注意:

      • Java采用Unicode编码(默认Utf16),每个字符占用2个字节,因此可以使用16进制来表示,例如:’\u0061’ 表示小写的a,’\u’表示Unicode字符
      • Java中可以采用转义字符来将位于其后的字符表示其他含义,如’\n’表示换行符 | 类型 | 存储空间 | 取值范围 | 默认值 | | —- | —- | —- | —- | | char(字符型) | 2字节 | 0 ~ 65535 ( \u0000 ~ \uffff ) | \u0000 |

代码示例:

  1. /**
  2. * 字符类型
  3. */
  4. public class CharacterType {
  5. public static void main(String[] args) {
  6. char c1 = 'a';
  7. char c2 = '$';
  8. char c3 = '1';
  9. char c4 = '你';
  10. char c5 = '\u0061';
  11. System.out.println(c1);
  12. // char 字符型 取值范围0~65535
  13. System.out.println('我'); // 字符常量
  14. char ch = 29233; // 十进制
  15. System.out.println(ch);
  16. char ch1 = 0x4E2D; // 十六进制
  17. System.out.println(ch1);
  18. char ch2 = '\u534e'; // Unicode编码
  19. System.out.println(ch2);
  20. }
  21. }
  • 整数类型

    • 用法:进行数学运算等
    • 特点:Java整数类型有固定的字段长度和数的表示范围,不受操作系统影响,保证程序可移植性
    • 表示方式:

      • 八进制整数:以0开头,例如:012
      • 十进制整数:例如:12、-23、0
      • 十六进制整数:以0x或0X开头,例如:0x123
    • 注意:

      • Java整型常量默认为int型,例如:int i = 999;
      • long类型需要在数字后面加“l”或“L”,例如:long l = 9999999999L; 建议用大写L | 类型 | 占用存储空间 | 表数范围 | 默认值 | | —- | —- | —- | —- | | byte(字节型) | 1字节 | -2 ~ 2-1 (-128 ~ 127) | 0 | | short(短整型) | 2字节 | -2 ~ 2-1 (-32768 ~ 32767) | 0 | | int(整型) | 4字节 | -2 ~ 2-1 (-2147483648 ~ 2147483647) | 0 | | long(长整型) | 8字节 | -2 ~ 2-1(-9223372036854775808~9223372036854775807) | 0L |
  • 浮点类型

    • 特点:与整型相同
    • 表示方式:

      • 十进制形式:例如:3.14、3.0、.3
      • 科学计数法形式:例如:3.14e2、100E-2
    • 注意:

      • Java浮点型常量默认为double
      • float类型需要在常量后面添加”f”或”F”
      • 浮点型会损失精度,不能作为精确计算使用,如果想要进行精确计算,可以使用BigDecimal类 | 类型 | 占用存储空间 | 表数范围 | 默认值 | | —- | —- | —- | —- | | float(单精度浮点型) | 4字节 | -3.403E38 ~ 3.403E38 | 0.0F | | double(双精度浮点型) | 8字节 | -1.798E308 ~ 1.798E308 | 0.0 |

2.6.3 代码示例

  1. /**
  2. * 整数类型
  3. */
  4. public class NumberType {
  5. public static void main(String[] args) {
  6. /*
  7. * 每种类型的取值不能超出应类型的范围,取值超出范围后会报错
  8. *
  9. * 整型: byte short int long
  10. *
  11. * byte 字节型 取值范围为-128~127 ,
  12. */
  13. byte bt = 127;
  14. System.out.println(bt);
  15. //short 短整型
  16. short s = 32767;
  17. // int 整型 默认类型
  18. int i = 999999999;
  19. // long 长整型
  20. long lg = 9999999999L;
  21. System.out.println(lg);
  22. /*
  23. * 浮点型: float double
  24. *
  25. * float 单精度 浮点型 f F
  26. */
  27. float fl = 1.234f;
  28. // double 双精度 浮点型 默认类型
  29. double db = 1.23;
  30. }
  31. }

2.6.4 基本数据类型转换

  • boolean类型不能转换为其他类型
  • 整型、浮点型、字符型在混合运算中可互相转换,遵循以下规则

    • 容量小的类型自动转换为容量大的类型

      • byte,short,char -> int -> long -> float -> double
      • byte,short,char之间不会互相自动转换,他们在运算时会先转换成int类型
    • 容量大的类型转成容量小的类型时,需加强制转换符,有可能造成精度降低或溢出
    • 多种类型混合运算时,系统会自动将所有类型转成容量最大的那种类型进行运算
    • 整数常量(如:1)默认为int类型
    • 实数常量(如:1.2)默认为double类型

2.6.5 代码示例

  1. /**
  2. * 基本数据类型转换
  3. */
  4. public class BasicTypeConvert {
  5. public static void main(String[] args) {
  6. /*
  7. * 自动类型转换(隐式转换)
  8. * 容量小的 -> 容量大的
  9. */
  10. byte b = 123;
  11. int i = b;
  12. System.out.println(i);
  13. /*
  14. * 强制类型转换(显式类型转换)
  15. * 容量大的类型 -> 容量小的类型
  16. * 需要加 强制转换符
  17. * 缺点:可能造成精度降低或溢出
  18. */
  19. int in = 6666;
  20. byte bt = (byte)in; // 会产生溢出
  21. short sh = (short)in;
  22. System.out.println(bt);
  23. /*
  24. * 类型转换的原理:所有的byte,short char类型,都会被提升为int类型
  25. * long float double 转换的结果与自己类型一致
  26. */
  27. byte by = 123;
  28. byte byy = 1;
  29. int bb = by + byy;
  30. byte b2 = (byte)(by + byy);
  31. char ch = 'a';
  32. int aa = ch + by; // 97 + 123
  33. System.out.println(ch);
  34. System.out.println(ch+1); // 97 + 1
  35. System.out.println(aa);
  36. System.out.println('a' + 'a'); // 97 + 97
  37. short s1 = 1;
  38. int i1 = 2;
  39. // int i2 = i1 * 2.0; // 错误,有实数常量,计算时会自动转为double类型
  40. double d1 = (s1 + i1) * 2.0; // 自动转换为double
  41. System.out.println(d1);
  42. float f1 = (float) ((s1 + i1) * 2.0); // 如果不加强制转换符,会报错。
  43. float f2 = 1.23f;
  44. long l1 = 100000000000l;
  45. // long l2 = (f2 + l1); // 错误,需要强制转换,系统会自动转换成float进行计算
  46. float f3 = f2 + l1; // 正确
  47. System.out.println(f3);
  48. }
  49. }

2.6.6 引用数据类型

类型 默认值
类、数组、接口等 null

2.6.7 代码案例

  1. /**
  2. * 引用数据类型
  3. */
  4. public class Reftypes {
  5. public static void main(String[] args) {
  6. // 除了基本数据类型外,所有的都是引用数据类型
  7. String str = new String("abc");
  8. Reftypes rt = new Reftypes();
  9. System.out.println(rt); // @1b6d3586
  10. System.out.println(str);
  11. }
  12. }

2.6.8 数据类型使用参考原则

  • 如果是描述数字,首选int(整数)、double(小数)
  • 如果进行数据传输或进行文字编码转换,使用byte(字节)类型(二进制处理操作类型)
  • 如果进行中文处理,使用char(字符)类型
  • 表示文件大小、数据库表主键列(自动增长列)、内存等,使用long类型

2.7 运算符

2.7.1 运算符分类

分类 符号
算数运算符 +、-、*、/、%、++、—
关系运算符 >、<、>=、<=、==、!=
逻辑运算符 &、|、!、^ && ||
位运算符 &、|、^、~、>>、<<、>>>
赋值运算符 =、>=、<=、*=、/=
字符串连接运算符 +

“+”号:

  • 两边的操作数中,只要有一个是字符串类型(String),则系统会自动将另一个值转换为字符串进行连接
  • 进行打印输出时,如论任何类型,都会转为字符串进行打印 ,例如:System.out.print(123);

2.7.2 代码示例

  1. /**
  2. * 算数运算符
  3. */
  4. public class ArithmeticOperator {
  5. public static void main(String[] args) {
  6. /*
  7. * + - * / % ++ --
  8. *
  9. * 对负数取模 5%-2 = 1 ,负号可以忽略不计
  10. * 被取模的是负数 -5%2 = -1
  11. */
  12. System.out.println(5%2);
  13. System.out.println(5%-2);
  14. System.out.println(-5%2);
  15. // 字符串和任何数据类型相加,+可以作为连接符使用
  16. System.out.println("4+3="+4+3);
  17. // 除法 / 整数除法,只保留整数部分
  18. int a = 3456;
  19. a = a / 100;
  20. System.out.println(a);
  21. int aa = 105, bb = 20;
  22. double cc = aa / bb;
  23. double dd = aa % bb;
  24. System.out.println("cc: " + cc);
  25. System.out.println("dd: " + dd);
  26. /*
  27. * ++或-- 在前: 先运算,再赋值
  28. * ++或-- 在后: 先赋值,后运算
  29. * ++ : 自身加1
  30. * -- : 自身减1
  31. */
  32. int b = 20;
  33. b++; // b = b + 1;
  34. System.out.println("b: " + b);
  35. int c = 10;
  36. ++c;
  37. System.out.println("c: " + c);
  38. // 快捷键: Ctrl+d:快速复制一行 Ctrl+x:删除一行
  39. int a1 = 10;
  40. int a2 = a1++;
  41. System.out.println("a1: " + a1);
  42. System.out.println("a2: " + a2);
  43. int b1 = 20;
  44. int b2 = ++b1;
  45. System.out.println("b1: " + b1);
  46. System.out.println("b2: " + b2);
  47. }
  48. }
  1. /**
  2. * 关系运算符
  3. */
  4. public class RelationalOperator {
  5. public static void main(String[] args) {
  6. /*
  7. * == > < >= <= !=
  8. * 运算结果:布尔型 boolean
  9. * a > b > c 错误写法
  10. */
  11. int a = 3;
  12. int b = 2;
  13. int c = 1;
  14. System.out.println(a > b && b > c);
  15. }
  16. }
  1. /**
  2. * 逻辑运算符
  3. */
  4. public class LogicalOperator {
  5. public static void main(String[] args) {
  6. /*
  7. * &:与 |:或 !:非 ^:异或
  8. * &&:短路与 ||:短路或
  9. */
  10. int a = 10, b = 20;
  11. boolean c = a<9 & b++>10; // 左右两边都成立为true,否则为false
  12. System.out.println(c); // 左右两边同时都会运算
  13. System.out.println("b: "+ b);
  14. boolean d = a<9 | b<10; // 左右两边只要有一个条件成立,则为true,都不成立为false
  15. System.out.println(d);
  16. boolean c1 = a<9 && b++>10; // 左右两边都成立为true,否则为false
  17. System.out.println(c1); // 先运算左边,如果左边成立,再运算右边
  18. System.out.println("b: "+ b);
  19. boolean d1 = a<9 || b<10; // 左右两边只要有一个条件成立,则为true,都不成立为false
  20. System.out.println(d1); // 先运算左边,如果左边不成立,再运算右边
  21. // 异或:两边相同为假,不同为真。
  22. int a1 = 10, b1 = 20;
  23. boolean bn = a1 > 9 ^ b1 > 10; // 两侧都为真,结果为假
  24. System.out.println("bn = " + bn); // false
  25. int a2 = 10, b2 = 20;
  26. boolean bn2 = a2 < 9 ^ b2 > 10; // 两侧不同,结果为真
  27. System.out.println("bn2 = " + bn2); // true
  28. int a3 = 10, b3 = 20;
  29. boolean bn3 = a3 > 9 ^ b3 < 10; // 两侧不同,结果为真
  30. System.out.println("bn3 = " + bn3); // true
  31. int a4 = 10, b4 = 20;
  32. boolean bn4 = a4 < 9 ^ b4 < 10; // 两侧不同,结果为真
  33. System.out.println("bn4 = " + bn4); // false
  34. }
  35. }
  1. /**
  2. * 赋值运算符
  3. */
  4. public class AssignmentOperator {
  5. public static void main(String[] args) {
  6. // = += -= *= /= %=
  7. int a = 3;
  8. a +=5; // a = a + 5;
  9. System.out.println(a);
  10. /*
  11. * short s = 3;
  12. * s = s + 2;
  13. * s += 2;
  14. */
  15. short s = 3;
  16. // s = (short)(s + 2); // 需要强转
  17. s += 2; // 不用强转
  18. System.out.println(s);
  19. }
  20. }
位运算 符号 描述 运算规则
按位运算 & 两位都为1,那么结果为1
| 有一位为1,那么结果为1
~ 非(反码) ~0 = 1,~1 = 0
^ 异或 两位不相同,结果为1
移位运算 << 左移 各二进制位全部左移N位,高位丢弃,低位补0
>> 右移 各二进制位全部右移N位,若值为正,则在高位插入 0,若值为负,则在高位插入 1
>>> 无符号右移 各二进制位全部右移N位,无论正负,都在高位插入0

2.7.3 运算符优先级

  • 单目运算符包括! ~ ++ —,优先级别高
  • 优先级别最低的是赋值运算符
  • 可以通过()控制表达式的运算顺序,()优先级最高
  • 从右向左结合性的只有赋值运算符、三目运算符和单目运算符
  • 算术运算符 > 关系运算符 > 逻辑运算符

2.8 表达式(expressions)

2.8.1 概念

符合一定语法规则的运算符和操作数的序列

  1. a
  2. 1 + 2
  3. a * 2 = 4
  4. x < 1 && y > 0

2.8.2 表达式的类型和值

  • 对表达式中操作数运算得出的结果就是表达式的值
  • 表达式的值的数据类型就是表达式的类型

2.8.3 表达式的运算顺序

  • 按照运算符的优先级从高到低的顺序进行
  • 优先级相同的运算符按照事先约定的结合方向进行 | 优先级 | 运算符 | 结合性 | | —- | —- | —- | | 1 | ()、[]、{} | 从左向右 | | 2 | !、+、-、~、++、— | 从右向左 | | 3 | 、/、% | 从左向右 | | 4 | +、- | 从左向右 | | 5 | «、»、>>> | 从左向右 | | 6 | <、<=、>、>=、instanceof | 从左向右 | | 7 | ==、!= | 从左向右 | | 8 | & | 从左向右 | | 9 | ^ | 从左向右 | | 10 | | | 从左向右 | | 11 | && | 从左向右 | | 12 | || | 从左向右 | | 13 | ?: | 从右向左 | | 14 | =、+=、-=、=、/=、&=、|=、^=、~=、«=、»=、>>>= | 从右向左 |

3.8.4 三元表达式

  • 格式:数据类型 变量名 = (条件表达式) ? 值1 : 值2;
  • 含义:条件表达式为true,则结果为值1,否则,结果为值2
  • 注意:

    • 数据类型要与“值1”或“值2”的类型一致
    • “值1”或“值2”也可以是其他的表达式

3.8.5 代码示例

  1. /**
  2. * 三元表达式
  3. */
  4. public class TernaryExp {
  5. public static void main(String[] args) {
  6. /*
  7. * 格式:数据类型 变量名 = (条件表达式)?值1:值2;
  8. * 数据类型 要与 值1 或 值2 的类型一致
  9. */
  10. int a = 3, b = 4;
  11. int c;
  12. c = (a > b) ? a : b;
  13. System.out.println(c);
  14. String d = (a > b) ? "ok" : "no";
  15. System.out.println(d);
  16. }
  17. }

2.9 语句

2.9.1 分支语句(条件语句)

分支结构又称为选择结构。选择结构有特定的语法规则,代码要执行具体的逻辑运算进行判断,逻辑运算的结果有两个,所以产生选择,按照不同的选择执行不同的代码。

if分支语句

  • 理解:

    • 首先判断条件表达式是否为true
    • 如果条件表达式为true,则进入代码块执行表达式
    • 如果条件表达式为false,则结束当前代码块,或者进入else if中进行判断,以此类推
    • 最后如果都不满足,则进入else代码块,然后程序结束
  • 特点:

    • 条件表达式结果为boolean类型
    • 如果只有一条执行表达式,可以省略大括号,如果是多条执行语句,不能省略,这里建议都要加上
    • else if 代码块,可以有多个
    • else 代码块放在最后
  1. if(条件表达式) {
  2. 执行表达式;
  3. ...
  4. }
  5. if(条件表达式)
  6. 执行表达式;
  7. if(条件表达式) 执行表达式;
  1. if(条件表达式){
  2. 执行表达式1;
  3. } else {
  4. 执行表达式2;
  5. }
  1. if(条件表达式1){
  2. 执行表达式1;
  3. } else if(条件表达式2){
  4. 执行表达式2;
  5. } else if(...){
  6. ...
  7. } else {
  8. 执行表达式3;
  9. }

switch分支语句

  • 理解:

    • 首先计算出表达式的值
    • 其次和case依次比较, 一旦有对应的值, 就会执行相应的语句, 在执行的过程中,遇到break就会结束
    • 最后,如果所有的case都和表达式的值不匹配,就会执行default语句体部分,然后程序结束
  • 特点:

    • 表达式的取值:byteshortintchar,JDK5以后可以是枚举,JDK7以后可以是String
    • case可以有多个,后面跟的是要和表达式进行比较的值
    • 执行表达式语句体部分可以是一条或多条语句
    • break关键字表示结束当前代码块,是中断,结束的意思
    • 如果不写break,则程序会一直往下子执行,直到遇到break或者程序结束
    • default语句表示所有情况都不匹配的时候,就执行该处的内容,和if语句中的else相似,可以省略
  1. switch(表达式){
  2. case 1:
  3. case 2:
  4. 执行表达式 2;
  5. break;
  6. case 3:
  7. 执行表达式 3;
  8. break;
  9. ...
  10. default:
  11. 执行表达式 default;
  12. break; // 到这里程序结束,可以没有break,建议写上
  13. }

2.9.2 代码示例

  1. /**
  2. * 分支语句/条件语句
  3. */
  4. public class BranchStat {
  5. public static void main(String[] args) {
  6. /*
  7. * if选择结构
  8. * if(条件表达式){执行表达式}
  9. * 条件表达式结果为boolean类型
  10. * 如果只有一条执行表达式,可以省略大括号,如果是多条执行语句,不能省略。这里建议都要加上
  11. */
  12. if(true)
  13. System.out.println(111);
  14. if(false){
  15. System.out.println(1);
  16. } else {
  17. System.out.println("进入else");
  18. }
  19. if(false){
  20. System.out.println(1);
  21. } else if(true){
  22. System.out.println("进入else if 1");
  23. } else if(true){
  24. System.out.println("进入else if 2");
  25. } else {
  26. System.out.println("else");
  27. }
  28. /*
  29. * switch 选择结构
  30. * switch(表达式){
  31. * case 值1:
  32. * case 值2:
  33. * 表达式 2;
  34. * break;
  35. * case 值3:
  36. * 表达式3;
  37. * break;
  38. * ...
  39. * default:
  40. * 表达式 defult;
  41. * break;
  42. * }
  43. * break: 表示停止当前选择结构
  44. */
  45. int a = 1;
  46. switch(a){
  47. case 1:
  48. case 2:
  49. System.out.println(2);
  50. break;
  51. case 3:
  52. System.out.println(3);
  53. break;
  54. default:
  55. System.out.println("default");
  56. break;
  57. }
  58. }
  59. }

2.9.3 循环语句

  • 理解:

    • 循环语句可以在满足循环条件的情况下,反复执行某一段代码,这段被重复执 行的代码被称为循环体语句。
    • 当反复执行这个循环体时,需要在合适的时候把循环判断条件修改为false,从而结束循环,否则循环将一直执行下去,形成死循环。

for循环

  • 特点:

    • 完整for循环,详见 格式 1
    • 初始化值表达式可以写在外部,详见 格式 2
    • 循环后的操作表达式,可以写在内部,或者省略(不做任何操作),详见 格式 3
    • 死循环,详见 格式 4
    • for循环小括号中的分号不能省略
    • 初始化值表达式只执行一次
  1. // 格式 1
  2. for(初始化值表达式; 条件表达式; 循环后的操作表达式){
  3. 执行表达式;
  4. }
  5. // 格式 2
  6. for(; 条件表达式; 循环后的操作表达式){
  7. 执行表达式;
  8. }
  9. // 格式 3
  10. for(; 条件表达式; ){
  11. 执行表达式;
  12. 循环后的操作表达式;
  13. }
  14. // 格式 4
  15. for(; ; ){
  16. 执行表达式;
  17. }

while循环

  • 特点:

    • 满足条件表达式,执行表达式将会一直执行,执行完一次后,会再次确认条件表达式,直到条件不满足
    • 如果不满足条件,while循环将一次也不会执行
  1. // while循环格式
  2. while (条件表达式){
  3. 执行表达式;
  4. }

do…while 循环

  • 特点:

    • 注意:while最后要写一个分号结尾
    • 不管条件是否满足,do...while循环最少会执行一次
  1. // do...while循环格式
  2. do{
  3. 执行表达式;
  4. } while (条件表达式);

2.9.4 代码示例

  1. /**
  2. * 循环语句
  3. */
  4. public class LoopStat {
  5. public static void main(String[] args) {
  6. /*
  7. * for(初始化值表达式;条件表达式;循环后的操作表达式){
  8. * 执行表达式;
  9. * }
  10. */
  11. for(int a = 0; a < 10; a++){
  12. System.out.println(a);
  13. }
  14. // while 循环结构
  15. int i =1;
  16. while (i<10){
  17. System.out.println("haha " + i);
  18. i++;
  19. }
  20. // 最少执行一次
  21. do{
  22. System.out.println("heihei " + i);
  23. i++;
  24. } while (i < 20);
  25. }
  26. }

三种循环区别

  • do...while循环至少执行一次循环
  • forwhile必须先判断条件是否是true,然后后才能决定是否执行循环体

循环使用的注意事项(死循环)

  • 一定要注意修改控制条件,否则容易出现死循环
  • 最简单的死循环格式

    • while(true){...}
    • for(;;){...}

2.9.5 跳转控制语句(break、continue、return)

  • break:中断

    • 使用场景

      • 在选择结构switch语句中
      • 在循环语句中
    • 作用

      • 跳出当前(单层)循环
      • 跳出当前(多层)循环

        • 带标签的跳出
        • 格式:标签名: 循环语句
        • 标签名要符合Java的命名规则
  • continue:继续

    • 使用场景

      • 在循环语句中
    • 作用

      • 退出本次循环,继续下次循环
  • return:返回

    • 使用场景

      • return关键字不是为了跳转出循环体,更常用的功能是结束一个方法
    • 作用

      • 退出一个方法,跳转到上层调用的方法

注意:三个关键字后面都不可以紧跟其他语句

2.9.6 代码示例

  1. /**
  2. * 跳转控制语句
  3. */
  4. public class JumpControlStat {
  5. public static void main(String[] args) {
  6. test();
  7. test1();
  8. test2();
  9. test3();
  10. }
  11. public static void test(){
  12. int a = 0;
  13. while (a<20){
  14. a++;
  15. if(a==5){
  16. continue;
  17. // break;
  18. // return;
  19. // 三个关键字后面都不可以紧跟其他语句
  20. }
  21. System.out.println(a);
  22. }
  23. }
  24. public static void test1(){
  25. System.out.println("test1");
  26. return;
  27. }
  28. public static int test2(){
  29. System.out.println("test2");
  30. return 2;
  31. }
  32. public static String test3(){
  33. System.out.println("test3");
  34. return "abc";
  35. }
  36. }

2.9.7 方法

类似于其他语言的函数,用来完成特定功能的代码片段

  1. // 方法格式
  2. [修饰符...] 返回值类型 方法名(形式参数列表){
  3. Java语句...
  4. }
基本概念 含义
返回值 在方法执行完成后,返回给调用它的环境的数据
返回值类型 事先约定的返回值的数据类型,如果没有返回值,则需给出返回值类型为void
形参 在方法被调用时,用于接收外部传入的数据
实参 调用方法时,实际传给方法的数据

方法调用方式:对象名.方法名(实参列表)

注意:

  • 实参的数目、数据类型、次序必须和所调用方法声明的形参列表一致
  • return语句可以终止方法并返回对应数据
  • Java在进行函数调用中传递参数遵循值传递原则

    • 基本数据类型传递值本身
    • 引用数据类型传递的是对象的引用,而不是对象本身
  • 方法中不能嵌套方法

2.9.8 代码示例

  1. /**
  2. * 方法/函数
  3. */
  4. public class FuncStat {
  5. public static void main(String[] args) {
  6. testReturn(); // testReturn
  7. int j = testReturnType(10);
  8. System.out.println(j); // 10
  9. FuncStat funcStat = new FuncStat(); // 创建对象
  10. String str = funcStat.testMultiParam("jason", 18); // 通过对象名.方法名,调用非静态方法
  11. System.out.println(str); // jason: 18岁
  12. testVarargs(); // [I@1b6d3586
  13. testVarargs(1); // [I@4554617c
  14. testVarargs(2, 3, 4); // [I@74a14482
  15. }
  16. /**
  17. * return语句
  18. * 当返回值为void时,可以写,也可以省略
  19. */
  20. public static void testReturn(){
  21. System.out.println("testReturn");
  22. return;
  23. }
  24. /**
  25. * return后面的返回值必须和方法上声明的返回值类型一致
  26. * @param i
  27. * @return int类型
  28. */
  29. public static int testReturnType(int i){
  30. return i++;
  31. }
  32. /**
  33. * 形参可以是多个不同类型的参数,用“,”隔开
  34. * @param name
  35. * @param age
  36. * @return String类型
  37. */
  38. public String testMultiParam(String name, int age){
  39. String result = name + ": " + age + "岁";
  40. return result;
  41. }
  42. /**
  43. * 可变参数/不定长参数
  44. * 格式:方法名(数据类型... 变量名)
  45. * 例如:String... args, byte... agrs 等等
  46. *
  47. * 特点:
  48. * 1. 表示可以接收多个当前数据类型的变量
  49. * 2. 可看作是一个数组
  50. * 3. 一个方法中只能有一个不定长参数
  51. * 错误:(String... args, int... ints)
  52. * 4. 如果有其他类型参数一起,则不定长参数只能写在最后
  53. * 正确:(int in, String... args)
  54. * 错误:(String... args, int in)
  55. * 5. 调用时可以传入0个、1个或多个当前数据类型的实参,实参用逗号隔开
  56. *
  57. * 解析参数列表:
  58. * 请参阅{@link cn.com.liyanlong.java.javase._07_array.ArrayTest#testVarages(int...)}
  59. *
  60. * @param args 参数列表
  61. */
  62. public static void testVarargs(int... args) {
  63. System.out.println(args);
  64. }
  65. }

2.10 Java命名规范

分类 规范 示例
包名 所有字母小写 xxyyzz
类名 每个单词首字母大写 XxxYyyZzz
标识符/变量/方法 驼峰 xxxYyyZzz
常量 所有字母大写,中间用下划线链接 XXX_YYY_ZZZ