Java 基础核心知识

很多同学学 Java 是从"Hello World"开始的,但真正写项目时才发现,很多基础概念没理解透——比如值传递和引用传递的区别、重载和重写的本质、泛型擦除后发生了什么。

我自己刚入门的时候也踩过不少坑。比如以为 Java 是"引用传递"就到处传对象,结果导致数据被意外修改;比如泛型用了半天不知道编译器把类型信息全擦掉了;比如反射写过很多次但从来没想过 setAccessible(true) 到底在干什么。

这套内容,就是帮你把这些"似懂非懂"的概念彻底搞明白。

内容总览

Java 基础是整个 Java 技术栈的地基。地基不稳,上层框架学得再溜也是空中楼阁。

这一模块覆盖 Java 基础语法的核心特性:

主题核心内容解决什么问题
面向对象封装、继承、多态的本质理解类设计的核心思想
方法重载/重写编译时多态 vs 运行时多态分清楚"同名不同签"和"覆盖"
值传递Java 只有值传递,对象传的是引用值的副本解决"为什么改了参数不影响原对象"的困惑
equals vs ==基本类型比较值,引用类型比较地址String 为什么用 equals 比较内容
String 家族String/StringBuilder/StringBuffer 区别循环中拼接字符串选哪个
异常体系Error/Exception/RuntimeException什么时候该 catch,什么时候不该
异常分类checked vs unchecked 的使用场景现代 Java 项目为什么越来越偏向 unchecked
try-catch-finally执行顺序与 finally 的陷阱finally 里 return 会覆盖 try 里的返回值
反射运行时获取类信息、动态调用Spring 依赖注入的底层原理
泛型类型擦除、通配符、上下界PECS 原则怎么用
注解元注解、运行时注解处理器自定义注解怎么写、怎么用
内部类成员/静态/局部/匿名内部类什么时候用内部类,为什么

知识全景

面向对象三大特性 🔴

面向对象是 Java 的核心思想,三大特性——封装、继承、多态——贯穿整个 Java 生态。

面向对象三大特性(封装/继承/多态)

理解三大特性不能只背名字,要理解"为什么要有这些特性":

  • 封装:定义边界,控制谁能访问、谁能修改
  • 继承:复用代码,但要注意"组合优于继承"
  • 多态:同一段代码因对象类型不同产生不同行为

方法重载 vs 重写 🔴

重载 vs 重写

很多人把重载和重写搞混。重载是"同名不同参",发生在编译阶段;重写是"子类覆盖父类方法",发生在运行阶段。

值传递 vs 引用传递 🔴

值传递 vs 引用传递

这是 Java 面试的经典送命题。Java 实际上是值传递——基本类型传值,引用类型传引用值的副本。分清楚这一点,很多"诡异"现象就解释得通了。

equals vs == 🔴

== 与 equals 区别

== 对于基本类型比较值,对于引用类型比较地址。equals() 默认行为和 == 一样,但 String 等类重写了它来比较内容。重写 equals() 时必须同时重写 hashCode()

String 家族 🟡

String/StringBuilder/StringBuffer 对比

String 是不可变的,这在安全和线程安全场景下是优势。StringBuilder 非线程安全但最快,StringBuffer 线程安全但有 synchronized 开销。循环中拼接字符串一定不要用 +,要用 StringBuilder。

异常体系 🟡

异常体系(Error/Exception/RuntimeException)

checked vs unchecked 异常

Error 是 JVM 层面的错误,不应该捕获;Exception 是程序层面的异常,需要处理。RuntimeException(unchecked)不强制要求处理,现代项目越来越多地使用它。

try-catch-finally 执行顺序 🟡

try-catch-finally 执行顺序

finally 总是执行的,即使 try 或 catch 中有 return。有一个经典陷阱:如果 finally 里有 return,会覆盖 try/catch 中的返回值。

反射 🔴

反射原理与应用场景

反射是很多框架的底层支撑:Spring 的依赖注入、Hibernate 的 ORM、Jackson 的序列化,都离不开反射。理解反射,才能理解这些框架为什么"能动"你的代码。

泛型 🔴

泛型(类型擦除/通配符/上下界)

泛型在编译后被擦除,这是 Java 的设计选择——为了向后兼容 JDK 5 之前的代码。List<String>List<Integer> 在运行时都变成 List<Object>。理解这一点,才能理解为什么泛型不能直接用 instanceof 判断。

注解 🟡

注解(元注解/运行时注解)

@Override@Deprecated@FunctionalInterface 这些内置注解天天用,但元注解 @Target@Retention 的三个值分别是什么意思,很多人不清楚。Lombok 的原理也是编译时注解处理器——在 class 文件里插入了字节码。

内部类 🟡

内部类(成员/静态/局部/匿名)

内部类不是"多此一举",它是组织代码的强大工具。但要注意:成员内部类持有外部类引用,用不好会导致内存泄漏;局部内部类和匿名内部类只能访问 effectively final 的变量。

面试关联

Java 基础不是孤立的知识点,它和高级面试紧密相连:

阅读建议

|| 你的阶段 | 推荐顺序 | | --- | --- | | 查漏补缺 | 先找自己最模糊的知识点定向阅读 | | 系统学习 | 按目录顺序:面向对象 → 方法 → 值传递 → equals → String → 异常 → 反射 → 泛型 → 注解 → 内部类 | | 面试冲刺 | 重点看:值传递、重载/重写、equals/hashCode、泛型擦除、异常分类 |

记住:Java 基础没有花哨的框架,但它是一切上层建筑的根基。把每一个"会用"的点都追问到"为什么",才叫真正掌握。