java面向对象四大特性是封装、继承、多态、抽象:封装通过private+校验性getter/setter保护数据(如age≥0);继承实现代码复用与层次结构;多态依托父类引用调用子类重写方法,实现运行时动态绑定;抽象通过抽象类或接口定义规范,分离共性与实现。

直接学核心概念,别堆题海。重点不是背答案,而是理解每条特性在真实代码里怎么起作用、为什么这么设计。
从四大特性出发,每个都配一个可运行的小例子
封装不是“用private+getter/setter”就完事,要明白它解决什么问题:比如防止年龄被设成-5,或字符串被意外截断。写个User类,把age设为private,setAge()里加校验逻辑,运行时故意传-1,看抛异常——这才是封装的实感。
继承要动手试初始化顺序:父类静态块→子类静态块→父类普通块→父类构造→子类普通块→子类构造。写两行System.out.println就能看清执行链。
多态必须亲手验证运行时绑定:用Animal a = new Dog(); a.sound();,再把sound()改成static,结果立刻不同——这比背“动态绑定”三个字管用十倍。
抽象类和接口的区别,光看表格容易混。不如建两个项目结构:一个用抽象类Vehicle统一油量计算,一个用接口Drivable和Flyable让直升机同时实现——场景一摆,适用边界自然清晰。
== 和 equals 必须动手调试
别只记结论。打开IDE,写四行代码:
Java JDK 25 来自 OpenJDK 官方归档,版本为 JDK 25,本条下载地址已指向官方 Windows x64 zip 安装包直链,适合调试旧项目或兼容旧版 Java 运行环境。
-
String s1 = "abc"; String s2 = "abc";→s1 == s2是 true(字符串常量池) -
String s3 = new String("abc"); String s4 = new String("abc");→s3 == s4是 false,但s3.equals(s4)是 true -
Integer i1 = 127; Integer i2 = 127;→i1 == i2是 true(缓存) -
Integer i3 = 128; Integer i4 = 128;→i3 == i4是 false
逐行Debug看内存地址和值,比读十遍解析更牢靠。
结合集合和JVM加深理解
HashMap底层为什么用红黑树?不是为了炫技。写个测试:往HashMap里put 1000个相同hash值的对象(比如重写hashCode()始终返回1),观察链表变长后是否自动转红黑树(JDK 1.8+)。这会逼你去看源码里的treeifyBin()逻辑。
谈到多态和内存,顺手验证JVM堆栈分工:在方法里new一个大数组,观察堆内存增长;在方法里定义一堆int变量,看栈帧变化。用VisualVM连上进程,实时看区域占用——抽象概念立刻落地。
自己出题,再自己拆解
别等别人问。合上资料,问自己:
- 如果我要设计一个配置中心客户端,哪些地方该用接口?哪些该用抽象类?
- 用户登录失败三次要锁定,这个“锁定状态”该存在对象属性里,还是用单独的LockService管理?为什么?
- ArrayList和LinkedList插入头节点,时间复杂度差在哪?写个循环测10万次,用
System.nanoTime()计时对比。
能讲清楚取舍理由,才算真掌握。
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南










