Java基础语法与核心概念详解
1. Java基础语法概述Java作为一门面向对象的编程语言其基础语法构成了整个编程体系的基石。对于初学者来说掌握这些基础概念和规则是迈向Java开发的第一步。Java语法设计严谨而规范这既保证了代码的可读性也为大型项目开发提供了良好的基础。Java程序的基本组成单位是类class每个Java程序至少包含一个类。类中可以定义变量用于存储数据和方法用于执行操作。Java程序从main方法开始执行这是所有Java应用程序的入口点。一个简单的Java程序示例如下public class HelloWorld { public static void main(String[] args) { System.out.println(Hello, World!); } }这个简单的程序展示了几个关键语法元素类定义、方法声明、语句和输出。Java要求每个语句以分号结束代码块用大括号{}包围这些都是Java语法的基本规则。2. Java标识符与命名规范2.1 标识符规则Java标识符是用来命名变量、类、方法等的名称。有效的Java标识符必须遵循以下规则必须以字母A-Z或a-z、美元符号$或下划线_开头后续字符可以是字母、数字、$或_不能使用Java关键字作为标识符区分大小写合法标识符示例age,$salary,_value,__1_value非法标识符示例123abc,-salary,class关键字注意虽然技术上可以使用中文作为标识符如int 年龄 20;但在实际开发中强烈建议使用英文命名这符合国际通用编程规范也便于团队协作。2.2 命名约定Java社区形成了以下命名约定虽然不是语法强制要求但遵循这些约定能使代码更易读和维护类名采用大驼峰式UpperCamelCase每个单词首字母大写如StudentRecord、BankAccount。方法名和变量名采用小驼峰式lowerCamelCase第一个单词首字母小写后续单词首字母大写如calculateSalary()、studentName。常量名全部大写单词间用下划线分隔如MAX_VALUE、DEFAULT_TIMEOUT。包名全部小写通常使用公司域名的反写如com.example.project。布尔变量通常以is、has、can等开头如isActive、hasPermission。良好的命名习惯能显著提高代码可读性。例如calculateMonthlySalary()比calcMS()更清晰易懂。3. Java基本数据类型3.1 八种基本类型Java是强类型语言所有变量都必须先声明类型后使用。Java有8种基本数据类型byte8位有符号整数范围-128到127short16位有符号整数范围-32,768到32,767int32位有符号整数范围-2^31到2^31-1long64位有符号整数范围-2^63到2^63-1float32位单精度浮点数double64位双精度浮点数char16位Unicode字符booleantrue或false类型选择应考虑数值范围和内存占用。例如年龄可以用byte而人口数量可能需要int或long。3.2 类型转换Java支持两种类型转换自动类型转换隐式转换小范围类型自动转为大范围类型int i 100; long l i; // 自动转换强制类型转换显式转换大范围类型转为小范围类型需要强制转换double d 100.04; long l (long)d; // 强制转换值为100类型转换可能导致精度丢失或数据溢出int large 130; byte small (byte)large; // 结果为-126溢出3.3 包装类Java为每个基本类型提供了对应的包装类如Integer对应int用于在需要对象的场合使用基本类型Integer objInt Integer.valueOf(10); // 装箱 int primInt objInt.intValue(); // 拆箱Java5支持自动装箱/拆箱Integer a 100; // 自动装箱 int b a; // 自动拆箱4. 变量与运算符4.1 变量类型Java中有三种变量局部变量方法内部声明必须初始化后才能使用void method() { int localVar 10; // 局部变量 }实例变量类中声明对象特有有默认值class MyClass { int instanceVar; // 实例变量默认值为0 }类变量静态变量用static修饰类所有实例共享class MyClass { static int classVar; // 类变量 }4.2 运算符Java支持丰富的运算符算术运算符、-、*、/、%、、--int a 10 / 3; // 结果为3整数除法 double b 10.0 / 3; // 结果为3.333...关系运算符、!、、、、boolean result (5 3); // true逻辑运算符、||、!if (age 18 hasLicense) { // ... }位运算符、|、^、~、、、int flags 0b1010; int mask 0b1100; int result flags mask; // 0b1000赋值运算符、、-等int x 10; x 5; // 等价于x x 5三元运算符?:int max (a b) ? a : b;运算符优先级决定了表达式的计算顺序不确定时建议使用括号明确优先级。5. 流程控制5.1 条件语句if-elseif (score 90) { grade A; } else if (score 80) { grade B; } else { grade C; }switch-caseJava12支持箭头语法switch (day) { case 1 - System.out.println(Monday); case 2 - System.out.println(Tuesday); default - System.out.println(Weekend); }5.2 循环结构for循环for (int i 0; i 10; i) { System.out.println(i); }增强for循环int[] numbers {1, 2, 3}; for (int num : numbers) { System.out.println(num); }while循环while (condition) { // 代码块 }do-while循环do { // 至少执行一次 } while (condition);5.3 控制语句break跳出当前循环或switchwhile (true) { if (condition) break; }continue跳过当前循环迭代for (int i 0; i 10; i) { if (i % 2 0) continue; System.out.println(i); // 只打印奇数 }return从方法返回int add(int a, int b) { return a b; }6. 数组与枚举6.1 数组数组是存储固定大小同类型元素的数据结构// 声明和初始化 int[] arr1 new int[5]; // 长度为5的数组 int[] arr2 {1, 2, 3}; // 初始化赋值 // 访问元素 int first arr2[0]; // 第一个元素 // 多维数组 int[][] matrix new int[3][3]; matrix[0][0] 1;数组长度固定创建后不能改变。需要动态大小集合时可使用ArrayList。6.2 枚举枚举定义一组命名常量比普通常量更安全enum Day { MONDAY, TUESDAY, WEDNESDAY, THURSDAY, FRIDAY, SATURDAY, SUNDAY } Day today Day.MONDAY; if (today Day.SATURDAY || today Day.SUNDAY) { System.out.println(Weekend!); }枚举可以有字段、方法和构造函数enum Planet { EARTH(5.97e24, 6371), MARS(6.39e23, 3389); private final double mass; private final double radius; Planet(double mass, double radius) { this.mass mass; this.radius radius; } public double surfaceGravity() { return 6.67e-11 * mass / (radius * radius); } }7. 方法与参数7.1 方法定义方法由以下几部分组成修饰符如public、static返回类型void表示无返回值方法名参数列表方法体public static int add(int a, int b) { return a b; }7.2 参数传递Java只有值传递传递的是值的副本基本类型传递值的副本对象引用传递引用的副本指向同一对象void modifyPrimitive(int x) { x 10; // 不影响原始值 } void modifyObject(ListString list) { list.add(new); // 修改会影响原始对象 }7.3 方法重载同一类中可以有多个同名方法只要参数列表不同void print(int i) { System.out.println(int: i); } void print(String s) { System.out.println(String: s); }重载方法根据参数类型在编译时决定调用哪个版本。8. 注释与文档8.1 注释类型单行注释//// 这是单行注释 int x 10;多行注释/* ... *//* 这是 多行注释 */文档注释/** ... */用于生成API文档/** * 计算两个数的和 * param a 第一个加数 * param b 第二个加数 * return 两数之和 */ public int add(int a, int b) { return a b; }8.2 JavadocJavadoc是生成API文档的工具识别以下常用标签param方法参数说明return返回值说明throws可能抛出的异常see参考链接deprecated标记已过时良好的文档注释应说明方法做什么而不是如何做。9. 异常处理9.1 异常类型Java异常分为检查型异常必须处理如IOException非检查型异常RuntimeException及其子类错误Error及其子类如OutOfMemoryError9.2 处理机制try-catch-finallytry { // 可能抛出异常的代码 } catch (IOException e) { // 处理特定异常 } catch (Exception e) { // 处理其他异常 } finally { // 无论是否异常都会执行 }throws声明方法可能抛出的异常void readFile() throws IOException { // ... }throw主动抛出异常if (age 0) { throw new IllegalArgumentException(年龄不能为负); }9.3 自定义异常创建继承Exception或RuntimeException的类class MyException extends Exception { public MyException(String message) { super(message); } }10. 面向对象基础10.1 类与对象类是对象的模板对象是类的实例class Person { // 字段 String name; int age; // 方法 void introduce() { System.out.println(我叫 name 今年 age 岁); } } // 创建对象 Person p new Person(); p.name 张三; p.age 20; p.introduce();10.2 构造方法构造方法用于初始化对象class Person { String name; int age; // 构造方法 Person(String name, int age) { this.name name; this.age age; } } Person p new Person(李四, 25);10.3 访问控制Java提供四种访问级别public所有类可见protected同包或子类可见默认包私有同包可见private仅本类可见良好的封装通常将字段设为private通过public方法访问class Person { private String name; public String getName() { return name; } public void setName(String name) { this.name name; } }11. 常用类库11.1 String类String是不可变字符序列常用方法length()字符串长度charAt(int)获取指定位置字符substring(int, int)截取子串equals(Object)内容比较indexOf(String)查找子串位置toLowerCase()/toUpperCase()大小写转换String s Hello; s s.concat( World); // 创建新字符串11.2 StringBuilder可变字符序列适合频繁修改字符串StringBuilder sb new StringBuilder(); sb.append(Hello); sb.append( ); sb.append(World); String result sb.toString();11.3 Math类提供常用数学运算abs()绝对值sqrt()平方根pow()幂运算random()随机数[0,1)round()四舍五入double root Math.sqrt(25); // 5.011.4 日期时间Java8引入的java.time包LocalDate日期LocalTime时间LocalDateTime日期时间DateTimeFormatter格式化LocalDate today LocalDate.now(); LocalDate birthday LocalDate.of(1990, Month.JANUARY, 1); long days ChronoUnit.DAYS.between(birthday, today);12. 集合框架12.1 List接口有序集合允许重复ArrayList基于数组随机访问快LinkedList基于链表插入删除快ListString list new ArrayList(); list.add(Apple); list.add(Banana); String first list.get(0);12.2 Set接口无序集合不允许重复HashSet基于哈希表TreeSet基于红黑树有序SetInteger set new HashSet(); set.add(1); set.add(2); set.add(1); // 重复元素不会被添加12.3 Map接口键值对映射HashMap基于哈希表TreeMap基于红黑树按键排序MapString, Integer map new HashMap(); map.put(Apple, 10); map.put(Banana, 5); int apples map.get(Apple);13. 泛型泛型提供了编译时类型安全检查ListString strings new ArrayList(); strings.add(hello); // strings.add(1); // 编译错误 String s strings.get(0); // 不需要强制转换泛型类定义class BoxT { private T content; public void set(T content) { this.content content; } public T get() { return content; } } BoxString stringBox new Box(); stringBox.set(hello);14. 输入输出14.1 控制台I/OScanner scanner new Scanner(System.in); System.out.print(请输入姓名); String name scanner.nextLine(); System.out.println(你好 name); scanner.close();14.2 文件I/O// 读取文件 try (BufferedReader reader new BufferedReader(new FileReader(input.txt))) { String line; while ((line reader.readLine()) ! null) { System.out.println(line); } } catch (IOException e) { e.printStackTrace(); } // 写入文件 try (BufferedWriter writer new BufferedWriter(new FileWriter(output.txt))) { writer.write(Hello, World!); } catch (IOException e) { e.printStackTrace(); }15. 多线程基础15.1 线程创建继承Thread类class MyThread extends Thread { public void run() { System.out.println(线程运行中); } } MyThread t new MyThread(); t.start();实现Runnable接口class MyRunnable implements Runnable { public void run() { System.out.println(线程运行中); } } Thread t new Thread(new MyRunnable()); t.start();15.2 线程同步使用synchronized实现同步class Counter { private int count 0; public synchronized void increment() { count; } public synchronized int getCount() { return count; } }16. 反射机制反射允许在运行时检查类、调用方法和访问字段Class? clazz Class.forName(java.lang.String); Method[] methods clazz.getDeclaredMethods(); for (Method method : methods) { System.out.println(method.getName()); } Constructor? constructor clazz.getConstructor(String.class); Object str constructor.newInstance(hello); Method lengthMethod clazz.getMethod(length); int len (int) lengthMethod.invoke(str);反射功能强大但性能较低应谨慎使用。17. 注解注解为代码添加元数据Override public String toString() { return 重写toString方法; } Deprecated public void oldMethod() { // 过时方法 } SuppressWarnings(unchecked) public void methodWithWarning() { List list new ArrayList(); list.add(hello); }可以自定义注解Retention(RetentionPolicy.RUNTIME) Target(ElementType.METHOD) public interface MyAnnotation { String value() default ; int priority() default 0; } MyAnnotation(value test, priority 1) public void annotatedMethod() { // ... }18. Lambda表达式Java8引入的函数式编程特性ListString names Arrays.asList(Alice, Bob, Charlie); // 传统方式 Collections.sort(names, new ComparatorString() { public int compare(String a, String b) { return a.compareTo(b); } }); // Lambda表达式 Collections.sort(names, (a, b) - a.compareTo(b)); // 方法引用 names.forEach(System.out::println);19. Stream APIJava8引入的流式数据处理ListString names Arrays.asList(Alice, Bob, Charlie, David); // 过滤和映射 ListString result names.stream() .filter(name - name.length() 3) .map(String::toUpperCase) .collect(Collectors.toList()); // 统计 long count names.stream() .filter(name - name.startsWith(A)) .count(); // 并行流 ListString parallelResult names.parallelStream() .sorted() .collect(Collectors.toList());20. 模块系统Java9Java模块系统提供了更好的封装和依赖管理module com.example.myapp { requires java.base; requires java.sql; requires transitive com.example.utils; exports com.example.myapp.api; opens com.example.myapp.internal to com.example.test; }模块化有助于构建更安全、更可维护的大型应用。21. 记录类Java14记录类record是不可变数据的透明载体record Point(int x, int y) { // 编译器自动生成构造函数、访问器、equals、hashCode和toString } Point p new Point(10, 20); System.out.println(p.x()); // 10 System.out.println(p); // Point[x10, y20]22. 模式匹配Java16模式匹配简化了类型检查和转换Object obj hello; // 传统方式 if (obj instanceof String) { String s (String) obj; System.out.println(s.length()); } // 模式匹配 if (obj instanceof String s) { System.out.println(s.length()); }23. 密封类Java17密封类限制哪些类可以继承它public sealed class Shape permits Circle, Square, Rectangle { // ... } public final class Circle extends Shape { // ... } public non-sealed class Square extends Shape { // ... } public sealed class Rectangle extends Shape permits FilledRectangle { // ... } public final class FilledRectangle extends Rectangle { // ... }24. 文本块Java15文本块简化多行字符串的编写String html html body pHello, World!/p /body /html ;25. 空指针异常改进Java14更友好的NullPointerException信息String[] arr null; try { int length arr.length; // 传统NPE只显示行号 } catch (NullPointerException e) { e.printStackTrace(); // 现在会显示不能读取null数组的长度 }26. 接口私有方法Java9接口可以包含私有方法public interface MyInterface { default void defaultMethod() { privateMethod(); } private void privateMethod() { System.out.println(私有方法); } }27. try-with-resources改进Java9try-with-resources可以重用变量InputStream input new FileInputStream(input.txt); try (input) { // Java7需要重新声明 // 使用input }28. 集合工厂方法Java9快速创建不可变集合ListString list List.of(a, b, c); SetInteger set Set.of(1, 2, 3); MapString, Integer map Map.of(a, 1, b, 2);29. Optional改进Java9Optional新增方法OptionalString opt Optional.ofNullable(getString()); opt.ifPresentOrElse( value - System.out.println(value), () - System.out.println(无值) ); OptionalString result opt.or(() - Optional.of(default));30. 响应式编程基础Java9引入的Flow API支持响应式编程class MySubscriber implements SubscriberString { private Subscription subscription; public void onSubscribe(Subscription subscription) { this.subscription subscription; subscription.request(1); } public void onNext(String item) { System.out.println(item); subscription.request(1); } public void onError(Throwable throwable) { throwable.printStackTrace(); } public void onComplete() { System.out.println(完成); } } SubmissionPublisherString publisher new SubmissionPublisher(); publisher.subscribe(new MySubscriber()); publisher.submit(hello); publisher.submit(world); publisher.close();31. 记录模式Java19预览记录模式解构记录值record Point(int x, int y) {} static void printSum(Object obj) { if (obj instanceof Point(int x, int y)) { System.out.println(x y); } }32. 虚拟线程Java19预览轻量级线程简化高并发编程try (var executor Executors.newVirtualThreadPerTaskExecutor()) { IntStream.range(0, 10_000).forEach(i - { executor.submit(() - { Thread.sleep(Duration.ofSeconds(1)); return i; }); }); }33. 结构化并发Java19预览将多个任务作为一个工作单元管理try (var scope new StructuredTaskScope.ShutdownOnFailure()) { FutureString user scope.fork(() - findUser()); FutureInteger order scope.fork(() - fetchOrder()); scope.join(); // 等待两个都完成 scope.throwIfFailed(); // 如果有失败则抛出异常 System.out.println(user.resultNow() : order.resultNow()); }34. 外部函数和内存APIJava19预览与本地代码和安全交互Linker linker Linker.nativeLinker(); SymbolLookup stdlib linker.defaultLookup(); MethodHandle strlen linker.downcallHandle( stdlib.lookup(strlen).get(), FunctionDescriptor.of(JAVA_LONG, ADDRESS) ); try (Arena arena Arena.openConfined()) { MemorySegment str arena.allocateUtf8String(hello); long len (long) strlen.invoke(str); System.out.println(len); // 5 }35. 向量APIJava19预览利用SIMD指令加速计算static final VectorSpeciesFloat SPECIES FloatVector.SPECIES_256; void vectorComputation(float[] a, float[] b, float[] c) { for (int i 0; i a.length; i SPECIES.length()) { var m SPECIES.indexInRange(i, a.length); FloatVector va FloatVector.fromArray(SPECIES, a, i, m); FloatVector vb FloatVector.fromArray(SPECIES, b, i, m); FloatVector vc va.mul(va) .add(vb.mul(vb)) .neg(); vc.intoArray(c, i, m); } }36. switch模式匹配Java20预览switch支持类型模式和守卫条件static String formatterPatternSwitch(Object obj) { return switch (obj) { case Integer i - String.format(int %d, i); case Long l - String.format(long %d, l); case Double d - String.format(double %f, d); case String s - String.format(String %s, s); case null - null; default - obj.toString(); }; } static void testTriangle(Shape s) { switch (s) { case Triangle t (t.calculateArea() 100) - System.out.println(大三角形); case Triangle t - System.out.println(小三角形); default - System.out.println(非三角形); } }37. 记录模式增强Java20预览嵌套记录模式record Point(int x, int y) {} record Rectangle(Point p1, Point p2) {} static void printUpperLeft(Rectangle r) { if (r instanceof Rectangle(Point(var x, var y), Point p2)) { System.out.println(左上角: ( x , y )); } }38. 字符串模板Java20预览简化字符串插值String name Alice; String info STR.My name is \{name}; int x 10, y 20; String result STR.\{x} \{y} \{x y};39. 作用域值Java20预览替代线程局部变量的现代方案final static ScopedValueConnection DB_CONNECTION ScopedValue.newInstance(); void serve(Request request) { Connection conn connectToDatabase(); ScopedValue.where(DB_CONNECTION, conn) .run(() - handle(request)); } void handle(Request request) { Connection connection DB_CONNECTION.get(); // 使用连接 }40. 结构化并发API更新Java20预览更完善的异常处理Response handle() throws ExecutionException, InterruptedException { try (var scope new StructuredTaskScope.ShutdownOnFailure()) { FutureString user scope.fork(() - findUser()); FutureInteger order scope.fork(() - fetchOrder()); scope.join(); scope.throwIfFailed(); return new Response(user.resultNow(), order.resultNow()); } }41. 虚拟线程API更新Java20预览更灵活的虚拟线程创建Thread.Builder builder Thread.ofVirtual().name(worker-, 0); ThreadFactory factory builder.factory(); try (ExecutorService executor Executors.newThreadPerTaskExecutor(factory)) { executor.submit(() - System.out.println(Hello)); executor.submit(() - System.out.println(World)); }42. 外部函数和内存API更新Java20预览内存会话简化try (Arena arena Arena.openConfined()) { MemorySegment segment arena.allocate(100); // 使用内存段 } // 自动释放43. 向量API更新Java20预览更丰富的向量操作static final VectorSpeciesFloat SPECIES FloatVector.SPECIES_256; void vectorComputation(float[] a, float[] b, float[] c) { for (int i 0; i a.length; i SPECIES.length()) { var m SPECIES.indexInRange(i, a.length); FloatVector va FloatVector.fromArray(SPECIES, a, i, m); FloatVector vb FloatVector.fromArray(SPECIES, b, i, m); FloatVector vc va.lanewise(VectorOperators.POW, 2) .add(vb.lanewise(VectorOperators.POW, 2)) .sqrt(); vc.intoArray(c, i, m); } }44. 模式匹配switch增强Java20预览更复杂的模式组合static String classify(Object obj) { return switch (obj) { case String s when s.length() 10 - 长字符串; case String s - 短字符串; case Integer i when i 0 - 正整数; case Integer i - 非正整数; case null, default - 其他; }; }45. 记录模式增强Java20预览数组模式匹配static void printFirst(String[] arr) { if (arr instanceof String[] { String s, String... rest }) { System.out.println(第一个元素: s); } }46. 字符串模板增强Java20预览自定义模板处理器StringProcessor SQL StringTemplate.Processor.of( (StringTemplate st) - { // 验证并处理SQL模板 return executeQuery(st.interpolate()); } ); String name Alice; int age 30; ResultSet rs SQL.SELECT * FROM users WHERE name \{name} AND age \{age};47. 作用域值增强Java20预览跨线程传递final static ScopedValueUser CURRENT_USER ScopedValue.newInstance(); void serve(Request request) { User user authenticate(request); ScopedValue.where(CURRENT_USER, user) .run(() - handle(request)); } void handle(Request request) { User user CURRENT_USER.get(); // 在子线程中也能访问 Executors.newVirtualThreadPerTaskExecutor() .submit(() - process(user)); }48. 结构化并发增强Java20预览任务分组try (var scope new StructuredTaskScope.ShutdownOnFailure()) { ListFutureString futures new ArrayList(); for (int i 0; i 10; i) { int taskId i; futures.add(scope.fork(() - doTask(taskId))); } scope.join(); scope.throwIfFailed(); for (FutureString future : futures) { System.out.println(future.resultNow()); } }49. 虚拟线程监控Java20预览观察虚拟线程状态Thread.Builder builder Thread.ofVirtual() .name(worker-, 0) .allowSetThreadLocals(false) .inheritInheritableThreadLocals(false); ThreadFactory factory builder.factory(); Thread virtualThread factory.newThread(() - { // 任务代码 }); virtualThread.start(); System.out.println(线程状态: virtualThread.getState());50. 外部函数和内存增强Java20预览更安全的内存访问MemorySegment allocateVector(Arena arena, float[] values) { MemorySegment segment arena.allocate(values.length * 4); for (int i 0; i values.length; i) { segment.setAtIndex(ValueLayout.JAVA_FLOAT, i, values[i]); } return segment; }51. 向量API增强Java20预览更丰富的数学运算static final VectorSpeciesFloat SPECIES FloatVector.SPECIES_256; void vectorComputation(float[] a, float[] b, float[] c) { for