
JDK系列03:面向对象核心,类、对象、继承、多态、接口与抽象类深度剖析
专栏系列:JDK核心底层进阶系列(03)
阅读前置:零基础友好,无需深厚编程基础,从编程思想落地到代码实战,循序渐进吃透核心
核心收获:彻底弄懂 OOP 编程思想、类与对象本质、三大特性底层逻辑、接口与抽象类终极区别,解决 99% 面向对象面试题,规避开发常见误区
一、前言:面向对象为什么是Java的基石?
所有Java开发者入门的第一道门槛,也是面试必问、高频、深挖 的核心考点,就是面向对象编程(OOP,Object Oriented Programming)。
Java 是纯面向对象语言,万物皆对象 是Java的核心设计理念。相较于 C 语言的面向过程(侧重步骤、流程),面向对象彻底改变了编程思维:从"怎么做"转变为"谁来做"。
很多开发者工作多年,依然存在认知误区:
只会写类和对象代码,却不懂封装的真正意义、继承的设计规范、多态的底层实现,更是分不清抽象类与接口的核心差异,面试频频丢分、项目代码冗余混乱。
本文作为 JDK 系列核心基石文章,将从编程思想→核心概念→三大特性→核心组件对比→代码实战→面试避坑全方位深度拆解,打造满分干货博文,看完彻底吃透Java面向对象所有核心知识点。
二、编程思想:面向过程 VS 面向对象
2.1 面向过程(POP)
核心思想:聚焦流程、步骤,将业务拆分为一个个顺序执行的步骤,通过函数调用完成业务。
特点:流程清晰、耦合度高、复用性差、扩展性极差,适合简单小项目,代表语言:C语言。
通俗举例:做饭,必须严格按照「买菜 → 洗菜 → 切菜 → 炒菜 → 装盘」固定步骤执行,任意一步改动,整体流程都要调整。
2.2 面向对象(OOP)
核心思想:聚焦实体、行为,将现实事物抽象为程序中的对象,通过对象的属性和行为交互完成业务。
特点:高复用、低耦合、易扩展、易维护,适合大型企业级项目,代表语言:Java、Python、C++。
通俗举例:做饭,定义「厨师、食材、厨具」对象,厨师拥有做饭行为,无需关注具体流程细节,直接调用行为即可。
三、核心基础:类与对象(OOP 的最小单元)
面向对象的所有特性、语法、逻辑,全部基于**类(Class)和对象(Object)**实现,二者是 OOP 的核心基石。
3.1 类与对象的本质关系
-
类 :现实事物的抽象模板 ,是概念、定义、规则,不存在实体,包含属性(成员变量)和行为(成员方法);
-
对象 :类的具体实例,是真实存在的实体,根据类模板创建,拥有类定义的所有属性和行为。
经典结论 :类是对象的模板,对象是类的实例(面试必背)。
3.2 代码实战:定义类与创建对象
java
// 1. 定义类:人类(抽象模板)
public class Person {
// 属性(成员变量):描述事物特征
private String name;
private int age;
// 行为(成员方法):描述事物功能
public void study() {
System.out.println(name + "正在学习 Java 面向对象");
}
// getter/setter 方法
public String getName() { return name; }
public void setName(String name) { this.name = name; }
public int getAge() { return age; }
public void setAge(int age) { this.age = age; }
}
// 2. 创建对象(实例化)
public class OopTest {
public static void main(String[] args) {
// 根据Person类模板,创建具体对象
Person person = new Person();
// 给对象属性赋值
person.setName("张三");
person.setAge(20);
// 调用对象行为
person.study();
}
}
3.3 对象创建的底层细节
执行 new Person() 时,JVM 会完成 3 件事:
-
加载 Person 类的元数据到方法区;
-
在堆内存开辟空间,创建对象实体,初始化默认属性值;
-
将堆内存对象地址赋值给栈中的引用变量 person。
四、OOP 三大核心特性(面试重中之重)
面向对象编程的核心优势,全部依托封装、继承、多态三大特性实现,三者层层递进、相互关联,是 Java 代码复用、解耦、扩展的核心底层。
4.1 封装(Encapsulation):安全性核心
4.1.1 核心定义
将类的 属性私有化,对外隐藏内部数据和实现细节,仅通过公开的方法暴露数据访问和修改入口。
4.1.2 实现方式
-
使用
private修饰成员变量,禁止外部直接访问; -
提供
public修饰的 get/set 方法,控制数据读写权限; -
可在 set 方法中加入数据校验逻辑,保证数据合法性。
4.1.3 封装核心作用(面试高频)
-
安全性:避免外部随意篡改数据,防止非法数据赋值;
-
代码解耦:隐藏内部实现,外部只需要调用方法,无需关注细节;
-
便于维护:内部逻辑修改,无需改动外部调用代码。
4.1.4 封装进阶实战(数据校验)
java
public class Person {
private int age;
// 重写 set 方法,加入数据校验
public void setAge(int age) {
if (age > 0 && age < 150) {
this.age = age;
} else {
System.out.println("年龄不合法!");
}
}
public int getAge() {
return age;
}
}
4.2 继承(Inheritance):复用性核心
4.2.1 核心定义
子类(派生类)通过 extends 关键字,继承父类(超类)的非私有属性和方法,实现代码复用,同时子类可扩展自有功能。
4.2.2 Java继承核心规则(必考)
-
Java 单继承:一个子类只能有一个直接父类,避免多继承逻辑冲突;
-
支持多层继承:A 继承 B、B 继承 C,形成继承体系;
-
子类无法继承父类的 private 私有成员、构造方法;
-
所有类默认直接或间接继承
Object类(顶层父类)。
4.2.3 继承代码实战
java
// 父类:动物类(通用模板)
class Animal {
public void eat() {
System.out.println("动物需要进食");
}
}
// 子类:狗类,继承动物类,复用通用方法 + 扩展自有方法
class Dog extends Animal {
// 子类独有方法
public void bark() {
System.out.println("狗狗汪汪叫");
}
}
// 测试
public class ExtendTest {
public static void main(String[] args) {
Dog dog = new Dog();
dog.eat(); // 继承父类方法
dog.bark(); // 子类自有方法
}
}
4.2.4 方法重写(Override)
子类对父类已有的非私有、非final、非static方法进行重新实现,适配子类专属业务逻辑。
重写核心规则:方法名、参数列表、返回值完全一致;访问权限 >= 父类;不能抛出更宽泛异常。
4.2.5 继承核心作用与避坑
优势:极大减少重复代码、统一父类规范、为多态提供基础;
避坑点 :继承是强耦合关系,父类修改会影响所有子类,禁止滥用继承,优先使用组合(has-a)。
4.3 多态(Polymorphism):扩展性核心
多态是面向对象最核心、最难理解、面试深挖最多的特性,是 Java 程序高扩展的底层支撑。
4.3.1 核心定义
同一行为,不同子类实现不同效果。父类引用指向子类对象,程序运行时根据真实子类类型执行对应方法。
4.3.2 多态实现的三个必要条件(缺一不可)
-
必须存在继承/实现关系;
-
子类必须重写父类方法;
-
父类引用指向子类对象(向上转型)。
4.3.3 多态代码实战
java
// 父类
class Animal {
public void shout() {
System.out.println("动物发出叫声");
}
}
// 子类1:狗
class Dog extends Animal {
@Override
public void shout() {
System.out.println("汪汪汪");
}
}
// 子类2:猫
class Cat extends Animal {
@Override
public void shout() {
System.out.println("喵喵喵");
}
}
// 多态测试
public class PolymorphismTest {
public static void main(String[] args) {
// 父类引用指向不同子类对象,同一方法不同实现
Animal a1 = new Dog();
Animal a2 = new Cat();
a1.shout(); // 输出:汪汪汪
a2.shout(); // 输出:喵喵喵
}
}
4.3.4 多态底层原理(动态绑定)
编译看左边,运行看右边:
-
编译阶段:以父类类型为准,校验方法是否存在;
-
运行阶段:JVM 动态识别真实子类对象,执行子类重写后的方法,即动态绑定机制。
4.3.5 多态核心价值
彻底解耦,新增子类无需修改原有代码,符合开闭原则,是 Spring 多态注入、框架扩展的核心底层。
五、核心重难点:抽象类 VS 接口(终极对比)
抽象类和接口是面向对象抽象设计的核心,也是面试 最高频对比考题,90% 开发者无法说清本质区别。二者均用于定义规范、不能实例化,但设计思想、语法、场景完全不同。
5.1 抽象类(abstract class)
5.1.1 核心特点
-
使用
abstract修饰,不能实例化,可包含抽象方法和普通方法; -
有构造方法,用于子类初始化父类成员;
-
成员变量可私有、默认、protected,可包含静态变量;
-
Java 单继承:子类只能继承一个抽象类;
-
设计思想:模板复用,抽取子类通用属性和行为,做通用模板。
5.2 接口(interface)
JDK 8 前后接口语法差异极大,是核心考点!
5.2.1 JDK 7 及以前
只能包含全局常量、抽象方法,无构造方法、无普通方法,所有成员默认public修饰。
5.2.2 JDK8新特性
新增默认方法(default)、静态方法(static),解决接口升级兼容问题。
5.2.3 JDK9新特性
新增 私有方法,抽取接口内部重复逻辑。
5.2.4 接口核心特点
-
不能实例化,无构造方法;
-
支持多实现,一个类可实现多个接口,解决单继承局限;
-
设计思想:行为规范,定义类必须具备的功能,不关注属性;
-
极度解耦,只定义契约,不限制实现。
5.3 抽象类 & 接口 终极对比表
| 对比维度 | 抽象类(abstract class) | 接口(interface) |
|---|---|---|
| 核心定位 | 模板复用(是什么) | 行为规范(能做什么) |
| 继承/实现 | 单继承 extends | 多实现 implements |
| 构造方法 | 有 | 无 |
| 成员变量 | 支持所有修饰符,可可变 | 默认public static final(常量) |
| 方法类型 | 抽象方法、普通方法、静态方法 | 抽象、默认、静态、私有方法(JDK8+) |
| 耦合程度 | 高耦合(继承关系) | 低耦合(契约关系) |
| 使用场景 | 抽取通用代码、统一子类模板 | 定义功能规范、解耦扩展、多能力拓展 |
5.4 开发选型原则(实战必用)
-
需要复用代码、统一通用属性/方法 → 用抽象类;
-
需要定义行为规范、多扩展、解耦 → 用接口;
-
日常开发优先用接口,符合低耦合、开闭原则。
六、重载 VS 重写(面试高频易混点)
结合继承与多态,梳理两大核心方法特性,彻底解决混淆问题。
| 对比维度 | 重载(Overload) | 重写(Override) |
|---|---|---|
| 定义位置 | 同一个类中 | 父子类之间 |
| 方法特征 | 方法名相同,参数列表不同 | 方法名、参数、返回值完全一致 |
| 权限修饰符 | 无限制 | 子类权限 ≥ 父类 |
| 绑定时机 | 编译期静态绑定 | 运行期动态绑定(多态核心) |
| 核心作用 | 方法同名多场景适配 | 子类个性化重写父类逻辑 |
七、OOP开发核心设计原则(进阶升华)
面向对象语法是基础,设计思想是核心,所有 Java 框架、源码均遵循以下原则:
-
单一职责:一个类只负责一个功能,杜绝臃肿类;
-
开闭原则:对扩展开放,对修改关闭(多态核心落地);
-
里氏替换:子类可以完全替换父类,不破坏原有逻辑;
-
依赖倒置:依赖抽象(接口/抽象类),不依赖具体实现类;
-
组合复用优先:优先使用成员变量组合,避免滥用继承高耦合。
八、全文满分总结(面试直接背诵)
-
核心基石:类是抽象模板,对象是具体实例,万物皆对象是Java核心设计理念;
-
三大特性:封装(安全、隐藏细节)、继承(复用、搭建体系)、多态(扩展、动态绑定),层层递进支撑OOP设计;
-
重载重写:重载是同类多方法适配(静态绑定),重写是父子类个性化实现(动态绑定、多态基础);
-
接口与抽象类:抽象类做模板复用(单继承、有构造),接口做规范约束(多实现、低耦合),JDK8+接口支持默认/静态方法;
-
核心思想:面向对象本质是解耦、复用、扩展,所有语法最终服务于高可用、易维护的企业级代码设计。
九、下期预告
JDK系列04:JDK8 Lambda表达式与函数式接口,一行代码简化集合遍历
码字不易,点赞+收藏+关注,持续更新JDK底层、新特性、JVM调优、并发编程高质量干货!