JDK系列03:面向对象核心,类、对象、继承、多态、接口与抽象类深度剖析

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 件事:

  1. 加载 Person 类的元数据到方法区;

  2. 在堆内存开辟空间,创建对象实体,初始化默认属性值;

  3. 将堆内存对象地址赋值给栈中的引用变量 person。

四、OOP 三大核心特性(面试重中之重)

面向对象编程的核心优势,全部依托封装、继承、多态三大特性实现,三者层层递进、相互关联,是 Java 代码复用、解耦、扩展的核心底层。

4.1 封装(Encapsulation):安全性核心

4.1.1 核心定义

将类的 属性私有化,对外隐藏内部数据和实现细节,仅通过公开的方法暴露数据访问和修改入口。

4.1.2 实现方式
  • 使用 private 修饰成员变量,禁止外部直接访问;

  • 提供 public 修饰的 get/set 方法,控制数据读写权限;

  • 可在 set 方法中加入数据校验逻辑,保证数据合法性。

4.1.3 封装核心作用(面试高频)
  1. 安全性:避免外部随意篡改数据,防止非法数据赋值;

  2. 代码解耦:隐藏内部实现,外部只需要调用方法,无需关注细节;

  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 多态实现的三个必要条件(缺一不可)
  1. 必须存在继承/实现关系;

  2. 子类必须重写父类方法;

  3. 父类引用指向子类对象(向上转型)。

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 开发选型原则(实战必用)

  1. 需要复用代码、统一通用属性/方法 → 用抽象类;

  2. 需要定义行为规范、多扩展、解耦 → 用接口;

  3. 日常开发优先用接口,符合低耦合、开闭原则。

六、重载 VS 重写(面试高频易混点)

结合继承与多态,梳理两大核心方法特性,彻底解决混淆问题。

对比维度 重载(Overload) 重写(Override)
定义位置 同一个类中 父子类之间
方法特征 方法名相同,参数列表不同 方法名、参数、返回值完全一致
权限修饰符 无限制 子类权限 ≥ 父类
绑定时机 编译期静态绑定 运行期动态绑定(多态核心)
核心作用 方法同名多场景适配 子类个性化重写父类逻辑

七、OOP开发核心设计原则(进阶升华)

面向对象语法是基础,设计思想是核心,所有 Java 框架、源码均遵循以下原则:

  • 单一职责:一个类只负责一个功能,杜绝臃肿类;

  • 开闭原则:对扩展开放,对修改关闭(多态核心落地);

  • 里氏替换:子类可以完全替换父类,不破坏原有逻辑;

  • 依赖倒置:依赖抽象(接口/抽象类),不依赖具体实现类;

  • 组合复用优先:优先使用成员变量组合,避免滥用继承高耦合。

八、全文满分总结(面试直接背诵)

  1. 核心基石:类是抽象模板,对象是具体实例,万物皆对象是Java核心设计理念;

  2. 三大特性:封装(安全、隐藏细节)、继承(复用、搭建体系)、多态(扩展、动态绑定),层层递进支撑OOP设计;

  3. 重载重写:重载是同类多方法适配(静态绑定),重写是父子类个性化实现(动态绑定、多态基础);

  4. 接口与抽象类:抽象类做模板复用(单继承、有构造),接口做规范约束(多实现、低耦合),JDK8+接口支持默认/静态方法;

  5. 核心思想:面向对象本质是解耦、复用、扩展,所有语法最终服务于高可用、易维护的企业级代码设计。

九、下期预告

JDK系列04:JDK8 Lambda表达式与函数式接口,一行代码简化集合遍历

码字不易,点赞+收藏+关注,持续更新JDK底层、新特性、JVM调优、并发编程高质量干货!