1. Java基础语法概述
Java作为一门面向对象的编程语言,其语法体系构成了整个编程范式的基石。对于初学者而言,掌握Java基础语法是迈向Java开发的第一步;对于有经验的开发者,深入理解语法细节能够帮助编写更高效、更健壮的代码。
Java语法体系包含以下几个核心组成部分:
- 数据类型系统(基本类型和引用类型)
- 变量与常量的声明和使用
- 运算符与表达式
- 流程控制结构
- 方法的定义与调用
- 面向对象的基本概念(类、对象、继承、多态等)
2. 数据类型与变量
2.1 基本数据类型
Java定义了8种基本数据类型,分为四类:
-
整型:
- byte:1字节,范围-128~127
- short:2字节,范围-32768~32767
- int:4字节,范围-2^31~(2^31-1)
- long:8字节,范围-2^63~(2^63-1)
-
浮点型:
- float:4字节,单精度
- double:8字节,双精度
-
字符型:
- char:2字节,Unicode字符
-
布尔型:
- boolean:true/false
实际开发中,整型首选int,浮点型首选double,除非有明确的内存限制考虑。
2.2 引用数据类型
引用类型包括类、接口、数组等。与基本类型不同,引用类型变量存储的是对象的引用(内存地址),而非对象本身。
java复制String str = "Hello"; // String是引用类型
int[] arr = new int[5]; // 数组也是引用类型
2.3 变量声明与初始化
Java是强类型语言,变量使用前必须声明:
java复制// 声明并初始化
int count = 10;
// 先声明后赋值
double price;
price = 99.8;
// 常量使用final修饰
final float PI = 3.14f;
变量命名规范:
- 遵循驼峰命名法
- 类名首字母大写,变量名首字母小写
- 避免使用$和_开头
- 常量全大写,单词间用_分隔
3. 运算符与表达式
3.1 算术运算符
java复制int a = 10, b = 3;
System.out.println(a + b); // 13
System.out.println(a - b); // 7
System.out.println(a * b); // 30
System.out.println(a / b); // 3 (整数除法)
System.out.println(a % b); // 1 (取模)
注意整数除法的特性,以及浮点数运算可能存在的精度问题。
3.2 关系运算符
java复制System.out.println(a > b); // true
System.out.println(a == b); // false
System.out.println(a != b); // true
3.3 逻辑运算符
java复制boolean x = true, y = false;
System.out.println(x && y); // false
System.out.println(x || y); // true
System.out.println(!x); // false
短路特性:&&和||具有短路特性,即左边表达式能确定结果时,右边不再计算。
3.4 位运算符
java复制int m = 5; // 0101
int n = 3; // 0011
System.out.println(m & n); // 0001 -> 1
System.out.println(m | n); // 0111 -> 7
System.out.println(m ^ n); // 0110 -> 6
System.out.println(~m); // 取反
System.out.println(m << 1); // 1010 -> 10
System.out.println(m >> 1); // 0010 -> 2
3.5 赋值运算符
java复制int num = 10;
num += 5; // 等价于 num = num + 5
num *= 2; // 等价于 num = num * 2
3.6 三元运算符
java复制int max = (a > b) ? a : b;
4. 流程控制
4.1 条件语句
if-else语句:
java复制if (score >= 90) {
System.out.println("优秀");
} else if (score >= 60) {
System.out.println("及格");
} else {
System.out.println("不及格");
}
switch语句:
java复制switch (day) {
case 1:
System.out.println("周一");
break;
case 2:
System.out.println("周二");
break;
// ...
default:
System.out.println("无效输入");
}
Java 12+支持switch表达式,可以更简洁地返回值。
4.2 循环结构
for循环:
java复制for (int i = 0; i < 10; i++) {
System.out.println(i);
}
增强for循环:
java复制int[] numbers = {1, 2, 3};
for (int num : numbers) {
System.out.println(num);
}
while循环:
java复制int i = 0;
while (i < 10) {
System.out.println(i);
i++;
}
do-while循环:
java复制int j = 0;
do {
System.out.println(j);
j++;
} while (j < 10);
4.3 跳转语句
java复制for (int i = 0; i < 10; i++) {
if (i == 5) {
break; // 跳出整个循环
}
if (i % 2 == 0) {
continue; // 跳过本次循环
}
System.out.println(i);
}
5. 方法与函数
5.1 方法定义
java复制// 方法定义
public static int add(int a, int b) {
return a + b;
}
// 方法调用
int sum = add(3, 5);
方法组成:
- 访问修饰符(public等)
- 返回类型(void表示无返回值)
- 方法名
- 参数列表
- 方法体
5.2 方法重载
同一类中允许存在多个同名方法,只要参数列表不同:
java复制public static int add(int a, int b) {
return a + b;
}
public static double add(double a, double b) {
return a + b;
}
5.3 可变参数
java复制public static int sum(int... numbers) {
int total = 0;
for (int num : numbers) {
total += num;
}
return total;
}
int result = sum(1, 2, 3, 4);
6. 数组
6.1 数组声明与初始化
java复制// 声明
int[] arr1;
// 初始化
arr1 = new int[5];
// 声明并初始化
int[] arr2 = {1, 2, 3};
// 二维数组
int[][] matrix = {{1,2}, {3,4}};
6.2 数组操作
java复制// 访问元素
int first = arr2[0];
// 修改元素
arr2[1] = 10;
// 遍历数组
for (int i = 0; i < arr2.length; i++) {
System.out.println(arr2[i]);
}
// 使用增强for循环
for (int num : arr2) {
System.out.println(num);
}
6.3 数组工具类Arrays
java复制import java.util.Arrays;
int[] arr = {3, 1, 2};
// 排序
Arrays.sort(arr);
// 二分查找
int index = Arrays.binarySearch(arr, 2);
// 数组转字符串
System.out.println(Arrays.toString(arr));
// 填充数组
Arrays.fill(arr, 0);
7. 面向对象基础
7.1 类与对象
java复制// 类定义
public class Person {
// 字段(属性)
String name;
int age;
// 方法
void sayHello() {
System.out.println("Hello, I'm " + name);
}
}
// 创建对象
Person p = new Person();
p.name = "Alice";
p.age = 25;
p.sayHello();
7.2 构造方法
java复制public class Person {
String name;
int age;
// 构造方法
public Person(String name, int age) {
this.name = name;
this.age = age;
}
}
Person p = new Person("Bob", 30);
7.3 封装
使用private修饰字段,提供getter/setter方法:
java复制public class Person {
private String name;
private int age;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
// 其他getter/setter
}
7.4 继承
java复制public class Student extends Person {
private String school;
public Student(String name, int age, String school) {
super(name, age); // 调用父类构造方法
this.school = school;
}
}
7.5 多态
java复制Person p = new Student("Alice", 20, "XYZ University");
// 编译时类型是Person,运行时类型是Student
8. 常用类库
8.1 String类
java复制String s1 = "Hello";
String s2 = new String("World");
// 常用方法
System.out.println(s1.length());
System.out.println(s1.concat(s2));
System.out.println(s1.indexOf('e'));
System.out.println(s1.substring(1, 3));
System.out.println(s1.equals("hello")); // false,区分大小写
System.out.println(s1.equalsIgnoreCase("hello")); // true
8.2 StringBuilder/StringBuffer
java复制StringBuilder sb = new StringBuilder();
sb.append("Hello");
sb.append(" ");
sb.append("World");
String result = sb.toString(); // "Hello World"
StringBuffer是线程安全版本,但性能稍低。
8.3 包装类
java复制Integer i = 10; // 自动装箱
int j = i; // 自动拆箱
// 类型转换
String numStr = "123";
int num = Integer.parseInt(numStr);
9. 异常处理
9.1 try-catch-finally
java复制try {
int result = 10 / 0;
} catch (ArithmeticException e) {
System.out.println("除数不能为零");
} finally {
System.out.println("无论是否异常都会执行");
}
9.2 抛出异常
java复制public void setAge(int age) throws IllegalArgumentException {
if (age < 0) {
throw new IllegalArgumentException("年龄不能为负数");
}
this.age = age;
}
10. 集合框架基础
10.1 List接口
java复制List<String> list = new ArrayList<>();
list.add("Apple");
list.add("Banana");
list.add(0, "Orange"); // 在指定位置插入
for (String fruit : list) {
System.out.println(fruit);
}
10.2 Set接口
java复制Set<Integer> set = new HashSet<>();
set.add(1);
set.add(2);
set.add(1); // 重复元素不会被添加
System.out.println(set.contains(2)); // true
10.3 Map接口
java复制Map<String, Integer> map = new HashMap<>();
map.put("Apple", 10);
map.put("Banana", 5);
System.out.println(map.get("Apple")); // 10
11. 输入输出
11.1 控制台输入
java复制import java.util.Scanner;
Scanner scanner = new Scanner(System.in);
System.out.print("请输入姓名:");
String name = scanner.nextLine();
System.out.print("请输入年龄:");
int age = scanner.nextInt();
11.2 文件读写
java复制// 写入文件
try (FileWriter writer = new FileWriter("test.txt")) {
writer.write("Hello World");
}
// 读取文件
try (BufferedReader reader = new BufferedReader(new FileReader("test.txt"))) {
String line;
while ((line = reader.readLine()) != null) {
System.out.println(line);
}
}
12. 枚举类型
java复制public enum Day {
MONDAY, TUESDAY, WEDNESDAY,
THURSDAY, FRIDAY, SATURDAY, SUNDAY
}
Day today = Day.MONDAY;
switch (today) {
case MONDAY:
System.out.println("星期一");
break;
// ...
}
13. 注解
Java内置常用注解:
java复制@Override // 表示方法重写
@Deprecated // 表示方法已过时
@SuppressWarnings("unchecked") // 抑制警告
14. 泛型基础
java复制// 泛型类
public class Box<T> {
private T content;
public void setContent(T content) {
this.content = content;
}
public T getContent() {
return content;
}
}
Box<String> stringBox = new Box<>();
stringBox.setContent("Hello");
15. Lambda表达式
java复制List<String> names = Arrays.asList("Alice", "Bob", "Charlie");
// 传统方式
Collections.sort(names, new Comparator<String>() {
@Override
public int compare(String a, String b) {
return a.compareTo(b);
}
});
// Lambda表达式
Collections.sort(names, (a, b) -> a.compareTo(b));
16. 日期时间API
Java 8引入了新的日期时间API:
java复制import java.time.*;
LocalDate today = LocalDate.now();
LocalDate birthday = LocalDate.of(1990, Month.JANUARY, 1);
Period period = Period.between(birthday, today);
System.out.println("年龄:" + period.getYears());
LocalDateTime now = LocalDateTime.now();
DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss");
System.out.println(now.format(formatter));
17. 多线程基础
17.1 创建线程
java复制// 方式1:继承Thread类
class MyThread extends Thread {
public void run() {
System.out.println("线程运行中");
}
}
// 方式2:实现Runnable接口
class MyRunnable implements Runnable {
public void run() {
System.out.println("线程运行中");
}
}
// 启动线程
new MyThread().start();
new Thread(new MyRunnable()).start();
17.2 线程同步
java复制class Counter {
private int count = 0;
public synchronized void increment() {
count++;
}
}
18. 反射基础
java复制Class<?> clazz = Class.forName("java.lang.String");
Method[] methods = clazz.getDeclaredMethods();
for (Method method : methods) {
System.out.println(method.getName());
}
19. 常用设计模式示例
19.1 单例模式
java复制public class Singleton {
private static Singleton instance;
private Singleton() {}
public static synchronized Singleton getInstance() {
if (instance == null) {
instance = new Singleton();
}
return instance;
}
}
19.2 工厂模式
java复制interface Shape {
void draw();
}
class Circle implements Shape {
public void draw() {
System.out.println("画圆");
}
}
class ShapeFactory {
public Shape getShape(String type) {
if ("circle".equals(type)) {
return new Circle();
}
return null;
}
}
20. Java新特性
20.1 Java 8特性
- Lambda表达式
- Stream API
- 方法引用
- 默认方法
- 新的日期时间API
20.2 Java 11特性
- 局部变量类型推断(var)
- 新的字符串方法
- HTTP Client API
20.3 Java 17特性
- 密封类(sealed class)
- 模式匹配instanceof
- 文本块改进
21. 编码规范与最佳实践
- 遵循命名规范
- 合理使用注释
- 避免魔法数字
- 处理异常而非忽略
- 使用日志而非System.out
- 遵循单一职责原则
- 优先使用接口而非具体实现
- 合理使用集合框架
- 注意字符串拼接性能
- 资源使用后及时关闭
22. 常见问题与解决方案
22.1 NullPointerException
java复制// 不安全的做法
String name = person.getName().toUpperCase();
// 安全做法
String name = person != null ? person.getName() : null;
name = name != null ? name.toUpperCase() : null;
// 更好的做法(Java 8+)
String name = Optional.ofNullable(person)
.map(Person::getName)
.map(String::toUpperCase)
.orElse(null);
22.2 并发修改异常
java复制List<String> list = new ArrayList<>(Arrays.asList("a", "b", "c"));
// 错误做法(会抛出ConcurrentModificationException)
for (String s : list) {
if ("b".equals(s)) {
list.remove(s);
}
}
// 正确做法1:使用迭代器
Iterator<String> it = list.iterator();
while (it.hasNext()) {
if ("b".equals(it.next())) {
it.remove();
}
}
// 正确做法2:Java 8+
list.removeIf("b"::equals);
22.3 内存泄漏
常见内存泄漏场景:
- 静态集合持有对象引用
- 未关闭的资源(数据库连接、文件流等)
- 监听器未注销
- 内部类持有外部类引用
解决方案:
- 使用WeakReference
- 及时释放资源(try-with-resources)
- 注销不再需要的监听器
- 避免非静态内部类长时间存活
23. 调试技巧
- 使用IDE调试工具
- 合理使用日志
- 单元测试
- 断言
- 远程调试
- 性能分析工具(VisualVM等)
24. 性能优化建议
- 避免创建不必要的对象
- 使用StringBuilder拼接字符串
- 合理使用集合初始容量
- 使用基本类型而非包装类
- 优化循环
- 使用缓存
- 并行处理
25. 学习资源推荐
- 官方文档:Oracle Java Documentation
- 书籍:《Effective Java》、《Java核心技术》
- 在线课程:Coursera、Udemy等平台
- 开源项目:GitHub上的Java项目
- 社区:Stack Overflow、掘金等
掌握Java基础语法是成为一名合格Java开发者的第一步。在实际开发中,除了理解语法规则外,更重要的是培养良好的编程习惯和解决问题的思维方式。建议通过实际项目练习来巩固所学知识,并持续关注Java语言的新特性和最佳实践。
