当前位置: 首页 > news >正文

面向对象编程的四大特性详解:封装、继承、多态与抽象

🎯 面向对象编程的四大特性(OOP 特性)

特性中文名关键词简述
Encapsulation封装数据隐藏、对外提供方法把数据和操作绑定在一起,对外隐藏实现细节
Inheritance继承代码复用、层次结构子类继承父类,获得其属性和方法
Polymorphism多态一个接口,多种实现同一方法调用表现出不同的行为
Abstraction抽象忽略具体细节,关注行为提炼共性特征,定义标准操作

🧩 一、封装(Encapsulation)

✅ 概念

数据(属性)操作这些数据的方法(行为)绑定在一起,并对外隐藏内部实现细节,只暴露必要接口,形成一个独立的对象 (类的实例)

🎯 现实类比

  • 电饭煲:外部只需要按“煮饭”,不用关心内部如何加热、控温。
  • Java 中:通过 private 修饰属性,public 提供访问方法(getter/setter)

📦 Java 示例

public class Person {private String name;  // 封装属性private int age;public String getName() {return name;      // 提供外部访问}public void setName(String name) {this.name = name;}public void setAge(int age) {this.age = age;}
}

可以看得出,Person 类对外没有提供 age 的 getter 方法,因为 Person 的年龄要保密。
所以,封装是把一个对象的属性私有化,同时提供一些可以被外界访问的方法。

❗ 面试陷阱

  • **封装 = 只加 private 吗?**不是。封装 = 数据隐藏 + 提供控制访问的方式。
  • **为什么要封装?**保证对象内部状态安全,避免被随意更改。

🧬 二、继承(Inheritance)

✅ 概念

子类继承父类的属性和方法,实现代码复用和体系结构扩展

同时,子类还可以重写或者扩展从父类继承来的属性和方法,从而实现多态。

🎯 现实类比

  • BirdAnimal 的一种,继承了动物的行为如“吃、睡”。
  • Java 中使用 extends 实现继承。

📦 Java 示例

class Animal {protected String name;protected int age;void eat() {System.out.println("动物在吃东西");}
}class Dog extends Animal {private String master;void bark() {System.out.println("狗在叫");}
}

Dog 类继承了 Animal 类的属性(name、age)和方法(eat),同时还有自己的属性(master)和方法(bark)。

❗ 面试陷阱

  • Java 是单继承语言,一个类只能继承一个类。
  • 接口(interface)可以多继承,类可以实现多个接口。

为什么Java里面要多组合少继承?

继承适合描述“is-a”的关系,但继承容易导致类之间的强耦合,一旦父类发生改变,子类也要随之改变,违背了开闭原则(尽量不修改现有代码,而是添加新的代码来实现)。

组合适合描述“has-a”或“can-do”的关系,通过在类中组合其他类,能够更灵活地扩展功能。组合避免了复杂的类继承体系,同时遵循了开闭原则和松耦合的设计原则。

举个例子,假设采用继承,每种形状和样式的组合都会导致类的急剧增加:

// 基类
class Shape {public void draw() {System.out.println("Drawing a shape");}
}// 圆形
class Circle extends Shape {@Overridepublic void draw() {System.out.println("Drawing a circle");}
}// 带红色的圆形
class RedCircle extends Circle {@Overridepublic void draw() {System.out.println("Drawing a red circle");}
}// 带绿色的圆形
class GreenCircle extends Circle {@Overridepublic void draw() {System.out.println("Drawing a green circle");}
}// 类似的,对于矩形也要创建多个类
class Rectangle extends Shape {@Overridepublic void draw() {System.out.println("Drawing a rectangle");}
}class RedRectangle extends Rectangle {@Overridepublic void draw() {System.out.println("Drawing a red rectangle");}
}

组合模式更加灵活,可以将形状和颜色分开,松耦合。

// 形状接口
interface Shape {void draw();
}// 颜色接口
interface Color {void applyColor();
}

形状干形状的事情。

// 圆形的实现
class Circle implements Shape {private Color color;  // 通过组合的方式持有颜色对象public Circle(Color color) {this.color = color;}@Overridepublic void draw() {System.out.print("Drawing a circle with ");color.applyColor();  // 调用颜色的逻辑}
}// 矩形的实现
class Rectangle implements Shape {private Color color;public Rectangle(Color color) {this.color = color;}@Overridepublic void draw() {System.out.print("Drawing a rectangle with ");color.applyColor();}
}

颜色干颜色的事情

// 红色的实现
class RedColor implements Color {@Overridepublic void applyColor() {System.out.println("red color");}
}// 绿色的实现
class GreenColor implements Color {@Overridepublic void applyColor() {System.out.println("green color");}
}

🎭 三、多态(Polymorphism)

✅ 概念

同一个行为在不同类的对象上可以产生不同的实现效果

多态其实是一种能力——同一个行为具有不同的表现形式;换句话说就是,执行一段代码,Java 在运行时能根据对象类型的不同产生不同的结果。

🎯 多态的三个必要前置条件

类型描述示例
编译时多态方法重载(Overload)同类中方法名相同,参数不同
运行时多态方法重写(Override)子类重写父类方法
接口多态父类引用指向子类对象Animal a = new Dog();

📦 Java 示例

class Animal {void makeSound() {System.out.println("动物在叫");}
}class Dog extends Animal {void makeSound() {System.out.println("狗在汪汪叫");}
}Animal a = new Dog();
a.makeSound();  // 输出:狗在汪汪叫

❗ 面试陷阱

  • **多态的前提?**必须有继承或接口 + 方法重写 + 父类引用指向子类对象。
  • 多态不适用于 static、private、构造器方法。

多态的实现原理是什么?

多态通过动态绑定实现,Java 使用虚方法表存储方法指针,方法调用时根据对象实际类型从虚方法表查找具体实现。


🧱 四、抽象(Abstraction)

✅ 概念

抽象是指从一类事物中提取共性特征,隐藏实现细节,仅保留对外功能定义

🎯 类比理解

  • “人会说话”是抽象概念,至于“说中文/说英语”是具体实现。
  • Java 中通过 abstract classinterface 实现抽象。

📦 Java 示例

abstract class Animal {abstract void makeSound();  // 抽象方法
}class Cat extends Animal {void makeSound() {System.out.println("猫在喵喵叫");}
}
// 定义一个接口,相当于完全抽象类
interface Animal {void makeSound();  // 抽象方法(默认 public abstract)
}// 实现类必须实现接口中的所有方法
class Dog implements Animal {@Overridepublic void makeSound() {System.out.println("狗在汪汪叫");}
}

📊 总结图:面向对象四大特性

面向对象特性 OOP
封装 Encapsulation
继承 Inheritance
多态 Polymorphism
抽象 Abstraction
隐藏实现细节
通过方法对外访问数据
子类复用父类功能
代码更少更清晰
同一接口多种实现
父类引用指向子类对象
定义共性行为
使用 abstract/interface 实现

✅ 一句话总结记忆法:

OOP 就是封装行为、继承结构、抽象共性、多态运行 —— 让程序像现实世界一样灵活、可维护、易扩展。

相关文章:

  • React 自定义Hook之usePrevious
  • 数字孪生废气处理工艺流程
  • ES6 第一讲 变量定义 堆与栈 字符串的扩展和数值型的扩展
  • 【读书笔记·VLSI电路设计方法解密】问题64:什么是芯片的功耗分析
  • 【C++基本算法】背包问题——完全背包
  • 大数定理(LLN)习题集 · 答案与解析篇
  • 慧通编程——k的幂(课程7)
  • jQuery介绍+使用jQuery实现音乐播放
  • Spring中Bean的作用域和生命周期
  • 51c大模型~合集119
  • win11离线安装donet3.5
  • Linux中的信号量
  • 【python】deepcopy深拷贝浅拷贝(结合例子理解)
  • 3分钟极速部署MySQL:brew/apt/yum全平台一条龙实战
  • 【计算机网络 | 第三篇】常见的网络协议(二)
  • 数据结构实验7.1:二叉树的遍历
  • WIN10重启开机不用登录,直接进入桌面
  • Mysql insert一条数据的详细过程
  • C语言求执行次数
  • 【牛客练习赛137 C】题解
  • 广州一男子早高峰爬上猎德大桥顶部疑似要跳桥,路段一度拥堵
  • 美国土安全部长餐厅遇窃,重要证件被盗走
  • 四川苍溪警方通报一男子离家出走:遗体被打捞上岸,排除刑案
  • 市场监管部门完成全国保健食品生产企业体系检查首轮全覆盖
  • 画廊主韦尔:是喜是伤的一生
  • 马上评|古籍书店焕新归来,“故纸陈香”滋养依旧