尧图网站设计 尧图网站设计YAOTU DESIGN
ARTICLE DETAIL

资讯详情

深耕网站设计与一线实操的经验洞察。

Java入门全解析:从历史背景、JDK环境配置到基础语法与面向对象

Java入门全解析:从历史背景、JDK环境配置到基础语法与面向对象 Java这门语言从1995年正式发布到现在已经接近三十年。它既不是语法最优雅的语言也不是执行效率最高的语言但它是企业级后端岗位数量最多、应用范围最广的语言之一。这篇内容围绕java的历史、应用领域和基础语法示例展开适合准备系统学习Java的初学者也适合已经能写一点代码、但对版本演进和选型边界还不清楚的人。我会先说清楚Java为什么能活这么多年、实际用于哪些场景再给一套可以直接照着敲的基础语法示例最后补充环境变量配置、常见报错和适合新手的学习路线。建议你先花几分钟把“为什么学Java”和“Java到底解决什么问题”想明白再进入语法练习这样后面遇到抽象概念时不容易放弃。1. Java的历史为什么它能从1995年活到现在1.1 从Oak到Java诞生背景Java最初并不是叫Java。1991年Sun Microsystems公司的一个团队想设计一种用于消费电子产品的语言最初命名为Oak。后来发现Oak这个名称已经被注册才改名为Java。1995年Java 1.0正式发布主打口号是“Write Once, Run Anywhere”也就是一次编写、到处运行。这个能力在当时非常关键因为那几年互联网刚刚开始普及网页、小程序、跨平台应用都需要一种能在不同操作系统上运行的语言。很多人提到Java历史时会想到James Gosling和最初的Green Team但我觉得初学者不需要背太多人物细节更重要的是理解当年的约束硬件平台杂、操作系统多、程序要能到处跑这才逼出了JVM这套虚拟机机制。Java后来所有的语法习惯几乎都带着那个年代的烙印。它强调类型安全所以编译检查很严格它强调稳定运行所以引入了异常处理和垃圾回收机制。理解了这些背景后面学JVM、学类加载机制时会顺畅很多。1.2 关键版本节点JDK版本演进大致脉络Java的版本演进可以分成三个阶段。第一个阶段是Java 1.x时代从1.0到1.4主要解决基础语法、集合框架、异常处理、输入输出这些底层能力。第二个阶段是Java 5到Java 8这个阶段对整个生态影响最大泛型、注解、枚举、Lambda表达式、Stream流都在这段时间出现。尤其是Java 8直到今天还有很多公司在用面试也经常考。第三个阶段是Java 9之后Oracle把版本发布节奏改成了每半年一个版本Java 9的模块化、Java 11的LTS长期支持、Java 17的LTS都是比较重要的节点。下面这张表不需要背但建议有个印象因为面试和学习路线里会反复出现这些版本号主要版本核心变化对初学者的意义Java 1.0初版跨平台能力了解即可Java 5泛型、枚举、注解、增强for循环泛型和枚举现在仍很常用Java 8Lambda、Stream、Optional、新的日期时间API企业项目使用最广的版本Java 11LTS长期支持版本老项目的常见基线Java 17LTSSpring Boot 3的基线版本新项目建议从这里起步Java 21LTS虚拟线程正式化适合关注新特性这里要提醒一句版本新不等于必须立刻升级。很多企业项目还在用Java 8原因是稳定、生态成熟、历史代码多。学习的时候建议装一个较新的LTS版本比如Java 17或Java 21但练习时仍要留意代码里哪些特性在老版本里不支持比如switch表达式、var关键字、文本块这些在Java 8里都没有。1.3 Java能活下来的三个原因第一是跨平台能力。JVM把字节码翻译成当前系统的机器指令同一个class文件在Windows、Linux、macOS上都能跑。服务器端部署时代码写一次扔到不同的Linux发行版上基本不用改省掉了大量平台适配工作。第二是生态庞大。Spring、MyBatis、Netty、Hadoop、Kafka这些主流中间件和框架大部分都是Java写的或者有完善的Java客户端。在企业里遇到问题几乎都能找到现成轮子和社区答案招聘市场上也容易招到人。第三是工程化成熟。Java有完整的编译检查、异常处理、依赖管理、单元测试工具链团队协作时更容易控制代码质量。这些东西对个人练手影响不大但放到几十人上百人的项目里价值就非常明显。很多人说Java“笨重”这恰恰是它在大型系统里的优势约束多不容易乱来。2. Java的应用领域哪些场景真的在用Java2.1 企业级后端服务这是Java最主流的应用场景。电商系统的订单服务、支付系统的交易服务、企业的OA和ERP系统、各种管理后台大量都是用Java Spring Boot或者Spring Cloud这套技术栈写的。原因很简单业务逻辑复杂、并发要求高、需要长期维护Java的稳定性和生态最适合这种场景。如果你去招聘网站上看后端开发岗位Java岗位的基数通常是最多的。岗位多意味着竞争者也多所以Java学习路线里经常出现“面试题”和“八股文”这些词。我的看法是岗位多带来的不是躺赢而是入门门槛相对清晰只要愿意花时间把基础打牢机会确实比很多小众语言多。2.2 Android应用开发早期的Android应用主要用Java开发现在官方更推荐Kotlin但Java仍然能写Android应用而且大量存量应用就是Java写的。如果你是学Android开发的Java至少要有能读懂和修改现有代码的水平。很多Android项目里依然能看到大量Java代码不会Java会遇到实际障碍。2.3 大数据生态Hadoop、Hive、HBase、Spark这些大数据组件核心代码都是Java或Scala写的Scala本身也运行在JVM上。所以在数据平台、离线计算、实时计算团队里会Java是一个基本要求。很多大数据岗位的面试题里Java基础语法占比不低尤其是集合、多线程和JVM内存相关内容。2.4 金融、电商、政企项目银行核心系统、保险系统、政务平台、大型电商这类项目对稳定性要求极高选型普遍偏保守。Java在这些行业里占了很高比例所以Java岗位的需求一直很稳定。这也是为什么很多人说Java“卷”因为竞争者多但岗位基数也确实大。2.5 选型判断什么时候用Java什么时候别用Java不是所有场景的最优解。写操作系统和驱动C和Rust更合适写前端页面JavaScript和TypeScript更合适做快速脚本和数据分析Python更顺手。如果你要做一个很小的内部工具、爬虫脚本、一次性数据处理任务用Java反而会显得笨重。我做选型时一般会看几个点项目要不要长期维护团队有没有多人协作业务是否稳定且复杂度高生态里有没有现成方案。如果这几个问题的答案都是肯定的Java是稳妥选择。如果只是短期验证一个想法或者追求极致的开发速度完全可以选更轻量的方案。3. 环境准备JDK安装和第一个Java程序3.1 先搞清楚JDK、JRE、JVM的关系很多初学者会在这三个概念上绕晕。简单说JVM是Java虚拟机负责把字节码解释或编译成机器码执行JRE是Java运行时环境包含JVM和Java核心类库JDK是Java开发工具包包含JRE、编译器javac、调试工具和打包工具。你现在做开发需要装的是JDK。只有程序跑起来的时候才需要JRE。这个顺序建议记下来源码先被javac编译成字节码也就是class文件然后由JVM加载执行。每次看报错时如果能分清是编译阶段还是运行阶段排查效率会高很多。3.2 JDK安装和环境变量配置安装JDK的步骤不复杂但有几个地方容易踩坑。以Windows为例下载对应系统的JDK安装包后一路下一步安装然后配置JAVA_HOME环境变量指向JDK安装目录再把%JAVA_HOME%\bin加到Path里。Linux和macOS建议直接用包管理工具或者SDKMAN比手工配环境变量省事。配置完成后打开命令行执行java -version javac -version如果两条命令都能输出版本号说明环境没问题。这里要特别注意java命令能跑、javac不能跑通常是Path里没有把JDK的bin目录加进去两个都不能跑就要先检查JAVA_HOME是否配置正确再检查Path是否生效。换过JDK版本后也要回到这里确认我见过不少项目报错最后发现是系统里同时存在多个JDKPATH环境变量指向了旧版本。3.3 第一个程序HelloWorld的完整过程新建一个目录比如D:\java-learn在里面创建一个HelloWorld.java文件内容如下public class HelloWorld { public static void main(String[] args) { System.out.println(Hello, Java!); } }然后在命令行进入该目录执行javac HelloWorld.java java HelloWorld看到输出“Hello, Java!”就成功了。这一步有两个最常见的坑文件名必须和public类名完全一致包括大小写执行java命令时不要加.class后缀直接写类名。初学者经常在这两个地方反复出错其实记住“javac编译文件java运行类名”就够了。3.4 验证运行结果和编码问题如果报“Error: Could not find or load main class”先看是不是目录进错了再看类名和文件名是否一致最后看编译出的class文件是否存在。如果报中文乱码通常是文件编码和系统编码不一致建议把源码文件统一保存为UTF-8编译时加参数-encoding UTF-8。4. Java基础语法变量、运算符、流程控制和数组4.1 注释、标识符和关键字注释有三种写法单行注释用//多行注释用/* ... */文档注释用/** ... */。文档注释可以配合工具生成API文档但初学阶段只要养成写注释的习惯就行。标识符就是变量名、方法名、类名这些名字规则是字母、数字、下划线、美元符号组成不能以数字开头不能和关键字重复。命名规范建议一开始就养成类名用大驼峰比如HelloWorld方法名和变量名用小驼峰比如getUserName、studentAge。代码是给别人读的更是给一个月后的自己读的命名偷懒后面会付出双倍代价。4.2 基本数据类型Java有八种基本数据类型byte、short、int、long、float、double、boolean、char。日常开发最常用的就是int、double、boolean和char。定义变量时先写类型再写变量名使用前最好先赋初值。看一个例子public class DataTypeDemo { public static void main(String[] args) { int age 25; double price 19.9; boolean isStudent true; char grade A; String name 张三; System.out.println(name 的年龄是 age); } }这里要注意String不是基本数据类型它是引用类型。基本数据类型存的是值本身引用类型存的是对象在内存中的地址。初学阶段只要知道这个区别就行后面学内存时会反复碰到。另外一个容易忽略的点是long类型的字面量后面要加大写Lfloat要加F否则会有精度或编译问题。4.3 运算符和表达式Java的运算符大概分几类算术运算符、赋值运算符、比较运算符、逻辑运算符。算术运算符有 - * / %其中/在整数之间是取整除%是取余数。比较运算符有 ! 结果都是boolean。逻辑运算符有 || !常用于条件判断。int a 10; int b 3; System.out.println(a b); System.out.println(a - b); System.out.println(a * b); System.out.println(a / b); System.out.println(a % b); boolean flag (a b) (a % b 1); System.out.println(flag);初学者最容易在这里出错的是和写混。是赋值是比较写反了程序也能编译通过但结果完全不对。逻辑运算符里和||有短路效果比如a 0 b / a 1如果a等于0后面的除法不会执行可以避免除零错误。4.4 流程控制流程控制分三类if-else条件判断、for和while循环、switch分支。写的时候注意大括号配对和缩进编译阶段虽然不强制缩进但不缩进的话后期维护非常痛苦。int score 85; if (score 90) { System.out.println(优秀); } else if (score 60) { System.out.println(及格); } else { System.out.println(需要补考); } for (int i 0; i 5; i) { System.out.println(第 (i 1) 次循环); } int count 0; while (count 3) { System.out.println(count count); count; }循环这里最容易出现死循环原因往往是循环变量没有更新或者条件写成了永远成立。我一般会建议先写好循环结束条件再写循环体。for循环里i的位置也容易漏掉一旦漏掉程序大概率卡死。4.5 数组数组是用来存储同类型多个数据的容器。定义方式有两种一种直接赋值初始化一种先指定长度再逐个赋值。数组下标从0开始访问时如果越界会抛ArrayIndexOutOfBoundsException也就是java中数组越界异常最常见的原因。int[] nums {1, 2, 3, 4, 5}; for (int i 0; i nums.length; i) { System.out.println(nums[i]); } int[] arr new int[3]; arr[0] 10; arr[1] 20; arr[2] 30;数组的length属性是数组长度不是数组里实际存了几个元素。写遍历时经常用它做循环边界但要注意i nums.length不能写成i nums.length否则最后一次访问就越界了。4.6 方法方法是一段可以重复调用的代码块。Java方法由访问修饰符、返回值类型、方法名、参数列表和方法体组成。方法定义好之后在主方法或者其他方法里调用。public class MethodDemo { public static int add(int a, int b) { return a b; } public static void main(String[] args) { int result add(3, 5); System.out.println(结果 result); } }方法的核心价值是复用和抽象。写方法时尽量让每个方法只做一件事方法名能看出用途。如果一个方法超过几十行建议拆成几个小方法虽然不影响运行但对维护非常有帮助。返回值类型是void时不用写return其他类型都必须保证所有分支都有返回值。5. 面向对象编程基础类、集合、异常、枚举和Lambda5.1 类的定义和对象的创建Java是面向对象语言基本单位不是函数而是类。类是模板对象是根据模板创建出来的具体实例。类里面通常有属性成员变量和方法成员方法。创建对象用new关键字构造方法用来在创建对象时初始化属性。class Student { private String name; private int age; public Student(String name, int age) { this.name name; this.age age; } public void showInfo() { System.out.println(姓名 name 年龄 age); } } public class ClassDemo { public static void main(String[] args) { Student s1 new Student(小明, 18); s1.showInfo(); } }这里this关键字表示当前对象用来区分成员变量和构造方法的参数。如果构造参数名和成员变量名不一样不写this也能工作但统一写this会让代码更清晰。面向对象编程java的核心就是围绕类、对象、封装、继承、多态这套思想组织代码初学时要多写几个类别只看概念。5.2 封装、继承、多态封装是指把属性设为private对外提供public的getter和setter方法防止外部直接改内部状态。继承用extends关键字子类可以复用父类的属性和方法也可以重写父类方法。多态是指同一个方法在不同对象上有不同表现核心是父类引用指向子类对象。这三个概念是Java面试的常客。初学阶段不用追求背概念先能在代码里用起来。比如写一个Animal父类让Dog和Cat继承它再各自重写一个sound方法就能很直观地感受到多态。继承要克制不要为了复用硬凑父子关系如果你的类之间没有“is-a”的关系用组合更合理。5.3 String和集合框架的简单使用String在Java里非常特殊它虽然不是基本类型但用起来像基本类型。String对象创建后不可变每次修改字符串都会生成新对象。所以如果循环里大量拼接字符串用StringBuilder更合适。集合框架最常用的是ArrayList、HashMap、HashSet。ArrayList相当于动态数组HashMap存键值对HashSet存不重复元素。下面是最简单的ArrayList使用示例import java.util.ArrayList; import java.util.List; public class CollectionDemo { public static void main(String[] args) { ListString list new ArrayList(); list.add(Java); list.add(Python); list.add(Go); for (String s : list) { System.out.println(s); } } }这里要理解为什么要用接口类型List来声明变量而用ArrayList来创建对象。这样做的原因是以后如果换成LinkedList主代码基本不用改这是面向接口编程的入门体现。集合框架里泛型也要重点掌握尖括号里的String表示这个List只能存String类型不写泛型会有很多类型转换麻烦。5.4 异常处理基础程序运行时很可能出现异常比如数组越界、空指针、除零。Java用try-catch来捕获异常用finally来执行无论如何都要做的清理操作。public class ExceptionDemo { public static void main(String[] args) { try { int[] arr new int[3]; System.out.println(arr[5]); } catch (ArrayIndexOutOfBoundsException e) { System.out.println(数组越界 e.getMessage()); } } }异常处理的目的是让程序在出错时不至于崩溃并且能输出有意义的错误信息。初学阶段不要为了处理异常而到处try-catch先让异常抛出来看清楚错误信息再考虑怎么处理。捕获异常时也要注意层级先捕获具体的异常类型再捕获通用的Exception顺序反了会导致子类异常永远不会被处理。5.5 枚举类型和Lambda的快速写法java枚举类型用enum关键字定义它用来表示一组固定的常量。比如一周的天数、订单状态、性别用枚举比用普通整型常量更安全因为枚举限制了取值范围。enum OrderStatus { PENDING, PAID, SHIPPED, DONE } public class EnumDemo { public static void main(String[] args) { OrderStatus status OrderStatus.PAID; System.out.println(当前订单状态 status); } }Lambda表达式是Java 8引入的简化写法最常用于集合遍历和函数式接口。比如用Lambda替代匿名内部类import java.util.Arrays; import java.util.List; public class LambdaDemo { public static void main(String[] args) { ListString list Arrays.asList(Java, Python, Go); list.forEach(s - System.out.println(s)); } }Lambda能简化代码但初学阶段不要一上来就全用Lambda。先把普通写法练熟理解接口和实现的关系再看Lambda会轻松很多。很多面试八股文会问Lambda的原理但它的底层涉及函数式接口和匿名类不是入门第一课。6. 常见报错和排查顺序6.1 编译报错找不到符号、源发行版17需要目标发行版17“找不到符号”这个报错最常见的原因是变量名写错、类名写错、引用的类没有import。排查时先看报错行号再看拼写最后看import语句。很多情况下是大小写不一致Java是区分大小写的。“源发行版 17 需要目标发行版 17”这个错误在IDEA和Maven项目里很常见本质是JDK版本和项目编译级别不一致。比如你电脑装的是Java 17但项目配置的编译级别是8就会提示类似错误。解决方法是把项目的Language level和JDK版本统一或者反过来用JDK 8跑Java 8项目。不同IDE设置位置不一样但思路是一样的编译环境版本要对齐。6.2 运行报错数组越界和空指针ArrayIndexOutOfBoundsException说明你访问了下标之外的元素检查循环边界和数组长度即可。NullPointerException是最让新手头疼的它说明某个引用变量的值是null却直接调用了它的方法或属性。排查时机是先找到报错行看看哪个对象可能是null再往上追踪它是在哪里被赋值的。空指针的根源往往不是报错那一行而是前面某个方法返回了null或者某个对象没有初始化。所以排查时要往上游看不能只盯着报错行改。6.3 内存报错OutOfMemoryError如果看到java.lang.OutOfMemoryError: Java heap space说明堆内存不够。可能原因有三个程序里有大量对象没有释放、一次性加载了过大的数据、真的把内存配得太小。排查思路是先用小数据量复现再看是不是代码里有循环创建对象最后才考虑调JVM参数-Xmx。不要一看到OOM就去调大内存很多OOM是代码问题比如把整个大文件读进内存、集合里无限添加元素、递归没有终止条件。先把代码查一遍再考虑调参。6.4 依赖相关的Lombok警告搜索热词里有一条“you arent using a compiler supported by lombok, so lombok will not work”这也是实际项目里常见的警告。它通常出现在IDE的注解处理配置不对或者JDK版本和Lombok版本不匹配的时候。解决办法是升级Lombok到支持当前JDK的版本并确认IDE里Annotation Processing已经开启。这类问题不算语法错误但会直接影响编译出现了要及时处理。6.5 排查顺序建议遇到Java问题我一般按这个顺序查先看完整报错栈定位到自己的代码行再看输入数据是否符合预期再看环境版本是否一致最后才怀疑框架和工具本身。很多问题不是Java语言的问题是路径、编码、依赖版本或者数据格式的问题。把报错信息完整贴到搜索引擎里通常比直接改代码更有效。7. 学习路线从基础语法到能写项目、能面试7.1 基础语法阶段要练到什么程度基础语法阶段的目标不是“看懂了”而是“不看文档能写出来”。建议至少做到能独立写一个包含类、方法、数组、循环、判断的小程序能处理常见的编译报错和运行异常能用集合框架和String写出简单的数据处理逻辑。达到这个程度再往后学Spring Boot就不会被语法卡住。练习时可以做几道经典题比如冒泡排序、快速排序、求数组最大值、统计字符串里每个字符出现次数。这些题目既练语法又练逻辑也是面试里可能出现的手写题。做的时候别急着看答案先自己写哪怕写得不好再对照别人的写法改进。7.2 阶段划分和进阶方向基础语法学完后通常按这个方向推进先学MySQL再学JDBC然后学Maven和Git接着学Spring、Spring Boot、MyBatis最后做一两个完整的项目。这个顺序不是绝对的但大体上是“数据操作能力”和“工程构建能力”两条线并行。数据库不熟后端接口就写不完整Maven和Git不熟代码就没法多人协作。阶段目标主要任务阶段一基础语法熟练写小练习掌握类、集合、异常、枚举阶段二数据库和JDBC掌握SQL、事务、JDBC操作阶段三框架和项目Spring Boot、MyBatis、Maven、Git阶段四面试和进阶刷面试题、读源码、了解JVM和多线程7.3 关于面试题和八股文的建议很多初学者对“java面试题”“java八股文”这些词又爱又恨。我的建议是八股文适合在基础语法已经熟练、项目已经做过之后再用来复习不适合当作第一手学习材料。直接背HashMap原理、JVM内存模型却没有写过几个类面试官追问两句就会露馅。比较好的做法是学到哪个阶段就整理哪个阶段的问题。比如学完集合写一遍ArrayList和LinkedList的区别学完异常总结一下checked exception和unchecked exception的区别学完面向对象自己说说封装、继承、多态分别解决什么问题。这样形成的笔记是自己的比背别人的八股文有效得多。7.4 给入门者的一句话学习Java是一个前期枯燥、后期回报明显的过程。不用急着把所有版本特性都学会选一个LTS版本把核心语法练熟把一个简单项目跑通再逐步扩展。我见过很多人在收藏教程和安装环境之间反复横跳真正有效的方式只有一个打开IDE把代码一行一行敲出来跑起来改出几个错误再修好它们。踩过几次坑之后你会发现报错反而成了最好的学习材料。
返回列表