
引言Java 作为一门跨平台、面向对象的高级编程语言其核心基础语法是所有Java开发的基石。无论是入门新手还是想要进阶架构师的资深开发者扎实的语法基础都是规避 bug、提升编码效率、深入理解 JVM 底层原理的前提。本文将系统梳理 Java 核心基础语法结合原理讲解、可运行的实战代码示例与行业通用的避坑指南帮你彻底吃透 Java 基础。一、Java 程序的基本结构1.1 第一个可运行的 Java 程序所有 Java 代码都必须放在类class中我们先从经典的Hello World程序入手完整代码如下// 公共类类名必须与文件名完全一致 public class HelloWorld { // 程序入口方法JVM固定识别的执行入口 public static void main(String[] args) { // 控制台输出语句 System.out.println(Hello Java!); } }运行说明将文件保存为HelloWorld.java公共类名必须与文件名一致大小写敏感使用javac HelloWorld.java编译代码生成HelloWorld.class字节码文件使用java HelloWorld运行程序控制台输出Hello Java!。1.2 程序结构核心详解代码片段作用与原理public class HelloWorld定义一个公共类public表示类可被全局访问class是定义类的关键字HelloWorld是类名public static void main(String[] args)Java 程序的唯一固定入口JVM 启动时会自动寻找该方法执行-public保证 JVM 可以访问到该方法-static无需实例化类直接通过类名调用-void方法无返回值JVM 不需要接收返回结果-String[] args接收命令行传入的参数System.out.println()Java 标准输出语句用于向控制台打印内容println会自动换行对应的print不会换行二、标识符与关键字2.1 标识符的定义与规则标识符是程序员为类、方法、变量、常量等自定义的名称必须遵守以下硬性规则只能由字母A-Z/a-z、数字0-9、下划线_、美元符$组成不能以数字开头不能使用 Java 的关键字、保留字大小写敏感Hello和hello是两个不同的标识符。2.2 关键字与保留字关键字Java 语言赋予了特殊含义的单词全部小写共有 50 个例如public、class、static、int、if、for等保留字Java 预留的、暂无特殊含义但未来可能作为关键字的单词包括goto、const标识符也不能使用这两个单词。2.3 通用命名规范标识符类型命名规范示例类名 / 接口名大驼峰命名法每个单词首字母大写UserService、HelloWorld方法名 / 变量名小驼峰命名法第一个单词首字母小写后续单词首字母大写getUserName、studentAge常量名全大写单词之间用下划线分隔MAX_AGE、DEFAULT_TIMEOUT包名全小写单词之间用点分隔com.example.demo三、Java 数据类型体系Java 是强类型语言所有变量必须先声明类型、再赋值使用数据类型分为基本数据类型和引用数据类型两大类。3.1 基本数据类型Java 提供 8 种基本数据类型分为 4 大类所有基本类型的取值范围、字节数都是固定的与平台无关保证了 Java 的跨平台特性。类型分类类型名占用字节取值范围默认值示例整数型byte1-128 ~ 1270byte age 18;整数型short2-32768 ~ 327670short salary 30000;整数型int4-2^31 ~ 2^31-10int id 100001;整数型long8-2^63 ~ 2^63-10Llong total 10000000000L;浮点型float4单精度约 6-7 位有效数字0.0Ffloat weight 65.5F;浮点型double8双精度约 15-16 位有效数字0.0Ddouble height 175.5;字符型char2单个 Unicode 字符0 ~ 65535\u0000char gender 男;布尔型boolean1bitJVM 实现true/falsefalseboolean isAdult true;避坑指南long类型的数值必须加后缀L推荐大写避免和数字 1 混淆float类型必须加后缀F否则会被默认识别为double类型编译报错浮点型存在精度丢失问题绝对不能用比较两个浮点数商业计算请使用java.math.BigDecimalchar类型使用单引号包裹只能存放单个字符和使用双引号的字符串String完全不同。3.2 引用数据类型引用数据类型指向堆内存中的对象包括类、接口、数组、枚举、注解等String本质是类属于引用类型。核心区别基本数据类型的变量直接存储值存放在栈内存引用类型的变量存储的是对象的内存地址引用对象本身存放在堆内存引用存放在栈内存。示例// 基本类型直接存储值 int a 10; // 引用类型存储对象的地址 String str new String(Java); int[] arr new int[5];3.3 类型转换3.3.1 自动类型转换隐式转换小范围类型可以自动转换为大范围类型无需手动处理规则byte - short - int - long - float - doublechar可以自动转换为int。示例int num 100; // int自动转换为long long bigNum num; // int自动转换为double double doubleNum num;3.3.2 强制类型转换显式转换大范围类型转换为小范围类型必须手动强制转换可能会丢失精度或溢出。语法(目标类型) 变量/值示例double pi 3.1415926; // 强制转换为int丢失小数部分结果为3 int intPi (int) pi; byte b (byte) 130; // 溢出结果为-126超出byte的取值范围发生循环溢出 System.out.println(b);3.4 自动装箱与拆箱Java 5 及以上版本支持基本类型和对应的包装类之间的自动转换装箱基本类型自动转换为包装类如int-Integer拆箱包装类自动转换为基本类型如Integer-int核心注意点Integer 缓存池JVM 会缓存-128 ~ 127范围内的Integer对象超出范围会新建对象示例Integer i1 127; Integer i2 127; // true使用缓存池中的同一个对象 System.out.println(i1 i2); Integer i3 128; Integer i4 128; // false超出缓存范围新建了两个不同的对象 System.out.println(i3 i4);四、Java 运算符体系4.1 核心运算符分类与示例运算符类型常用运算符示例说明算术运算符、-、*、/、%、、--a、b--%是取余运算前置先自增再运算后置先运算再自增赋值运算符、、-、*、/a 10等价于a a 10复合赋值运算符会自动强制类型转换比较运算符、!、、、、a 10结果为 boolean 类型的 true/false逻辑运算符短路与短路或、!非a10 b20短路特性左边表达式能确定结果时右边不再执行位运算符^、、a 2等价于a * 4直接操作二进制位效率极高三元运算符条件表达式 ? 值1 : 值2a 18 ? 成年 : 未成年简化的 if-else根据条件返回对应的值4.2 高频避坑指南1.短路与非短路的区别左边为 false 时右边不执行无论左边结果如何右边一定会执行示例int a 10; boolean res1 (a 20) (a 10); // 输出10右边a没有执行 System.out.println(a); int b 10; boolean res2 (b 20) (b 10); // 输出11右边b执行了 System.out.println(b);2.与equals()的核心区别比较基本类型时比较值比较引用类型时比较对象的内存地址equals()本质是类重写后的方法String等类重写后用于比较对象的内容未重写的类默认和一致。示例String s1 new String(Java); String s2 new String(Java); // false两个不同的对象地址不同 System.out.println(s1 s2); // true字符串内容相同 System.out.println(s1.equals(s2));五、流程控制语句5.1 分支结构5.1.1 if-else 分支适用于区间判断语法int score 85; if (score 90) { System.out.println(优秀); } else if (score 60) { System.out.println(及格); } else { System.out.println(不及格); }5.1.2 switch 分支适用于固定值的匹配Java 7 支持String类型Java 14 支持 switch 表达式简化写法无需 break。传统写法注意 case 穿透int day 2; switch (day) { case 1: System.out.println(周一); break; // 必须加break否则会发生case穿透 case 2: System.out.println(周二); break; case 3: System.out.println(周三); break; default: System.out.println(无效日期); }Java 14 新写法switch 表达式直接返回值int day 3; String dayType switch (day) { case 1,2,3,4,5 - 工作日; case 6,7 - 周末; default - throw new IllegalArgumentException(无效日期 day); }; // 输出工作日 System.out.println(dayType);5.2 循环结构用于重复执行某段代码包括for、while、do-while三种。5.2.1 for 循环适用于循环次数已知的场景语法// 计算1-100的和 int sum 0; for (int i 1; i 100; i) { sum i; } // 输出5050 System.out.println(sum);5.2.2 while 循环适用于循环次数未知的场景先判断条件再执行循环体int i 1; int sum 0; while (i 100) { sum i; i; }5.2.3 do-while 循环先执行循环体再判断条件循环体至少执行一次int i 1; int sum 0; do { sum i; i; } while (i 100);循环优化技巧避免在循环终止条件中重复调用方法例如// 不推荐每次循环都会调用list.size()方法 for (int i 0; i list.size(); i) {} // 推荐提前获取长度只调用一次方法 int size list.size(); for (int i 0; i size; i) {}5.3 跳转语句break终止当前循环或 switch 语句continue跳过本次循环执行下一次循环return终止方法执行返回结果。六、数组数组是相同类型数据的有序集合长度一旦初始化就不可改变属于引用类型。6.1 一维数组的定义与初始化// 方式1静态初始化指定元素长度自动确定 int[] arr1 {1,2,3,4,5}; // 方式2动态初始化指定长度元素为默认值 int[] arr2 new int[5]; arr2[0] 1; arr2[1] 2;6.2 数组的遍历int[] arr {1,2,3,4,5}; // 方式1普通for循环 for (int i 0; i arr.length; i) { System.out.println(arr[i]); } // 方式2增强for循环foreach无法获取索引 for (int num : arr) { System.out.println(num); }6.3 Arrays 工具类java.util.Arrays是 Java 提供的数组工具类封装了常用的数组操作import java.util.Arrays; public class ArrayDemo { public static void main(String[] args) { int[] arr {3,1,5,2,4}; // 排序升序排序 Arrays.sort(arr); System.out.println(Arrays.toString(arr)); // 输出[1,2,3,4,5] // 查找二分查找必须先排序 int index Arrays.binarySearch(arr, 3); System.out.println(index); // 输出2 // 填充将数组所有元素填充为指定值 Arrays.fill(arr, 0); System.out.println(Arrays.toString(arr)); // 输出[0,0,0,0,0] } }6.4 常见异常避坑ArrayIndexOutOfBoundsException数组下标越界下标超出[0--数组长度-1]的范围NullPointerException空指针异常数组引用为 null 时操作数组。七、方法函数方法是封装了特定功能的代码块实现代码复用Java 中的方法必须定义在类中。7.1 方法的定义与格式修饰符 返回值类型 方法名(参数类型 参数名1, 参数类型 参数名2) { // 方法体 return 返回值; }示例定义一个加法方法public class MethodDemo { // 定义加法方法 public static int add(int a, int b) { return a b; } public static void main(String[] args) { // 调用方法 int res add(10, 20); System.out.println(res); // 输出30 } }7.2 方法的重载Overload方法重载是指 ** 同一个类中方法名相同参数列表不同个数、类型、顺序不同** 的多个方法与返回值、修饰符无关是 Java 多态的一种体现。示例public class OverloadDemo { // 两个int相加 public int add(int a, int b) { return a b; } // 三个int相加参数个数不同 public int add(int a, int b, int c) { return a b c; } // 两个double相加参数类型不同 public double add(double a, double b) { return a b; } }7.3 Java 的参数传递机制只有值传递Java 中只有值传递没有引用传递核心规则基本类型参数传递的是值的副本方法内修改副本不会影响原变量引用类型参数传递的是引用地址的副本副本和原引用指向同一个堆对象通过副本修改对象的属性会影响原对象但修改副本的指向不会影响原引用。示例 1基本类型参数传递public class ValuePassDemo { public static void swap(int a, int b) { int temp a; a b; b temp; } public static void main(String[] args) { int x 10; int y 20; swap(x, y); // 输出x10, y20原变量没有交换 System.out.println(x x , y y); } }示例 2引用类型参数传递class User { String name; public User(String name) { this.name name; } } public class ReferencePassDemo { public static void changeName(User user) { // 修改对象的属性原对象会被改变 user.name 李四; } public static void main(String[] args) { User u new User(张三); changeName(u); // 输出李四 System.out.println(u.name); } }总结与进阶方向本文覆盖了 Java 核心基础语法的全部核心内容这些语法是 Java 开发的基石后续的面向对象编程、集合框架、IO 流、多线程、JVM 底层原理、Spring 等框架的学习都建立在扎实的基础语法之上。