【JAVA基础】—— 面向对象
Java面向对象核心:三大特性与类图关系详解
面向对象编程(OOP)是Java的核心思想,而封装、继承、多态作为OOP的三大核心特性,是编写模块化、可复用、易维护代码的基础;同时,UML类图作为可视化工具,能清晰描述类的结构及类间关系,是设计和沟通Java程序的重要手段。本文将从实战角度拆解三大特性的核心逻辑,再详解类图的组成与类间关系,帮你吃透Java面向对象的核心知识点。
一、OOP三大核心特性
1.1 封装:隐藏细节,暴露接口
封装是OOP的基础,核心思想是将对象的数据(属性) 和操作数据的方法 封装成一个独立实体,隐藏内部实现细节,仅通过对外暴露的接口与外部交互。
核心优势
封装之所以成为OOP的基石,在于它能解决代码耦合、维护、复用等核心问题:
- 降低耦合:每个封装的模块可独立开发、测试、修改,不影响其他模块;
- 简化维护:隐藏内部细节,程序员只需关注接口使用,调试时可精准定位问题;
- 性能可控:可针对性优化核心模块,不波及整体系统;
- 提升复用性:封装好的模块可直接复用在不同场景;
- 降低风险:即使系统部分模块故障,封装完善的模块仍可正常使用。
实战示例
以下Person类封装了name、gender、age属性,外界仅能通过指定接口访问属性,既保护了敏感数据(如age),又隐藏了gender的存储细节(用int存储,对外展示为字符串):
// 定义Person类,体现封装思想
public class Person {
// 私有属性:仅类内部可访问
private String name;
private int gender; // 0代表男性,1代表女性(内部实现细节)
private int age;
// 对外暴露接口:获取姓名
public String getName() {
return name;
}
// 对外暴露接口:获取性别(转换内部存储格式)
public String getGender() {
return gender == 0 ? "man" : "woman";
}
// 对外暴露接口:业务方法(内部使用age属性,外部无法直接访问)
public void work() {
if (18 <= age && age <= 50) {
System.out.println(name + " is working very hard!");
} else {
System.out.println(name + " can't work any more!");
}
}
// 可选:提供setter方法,控制属性赋值逻辑(如校验age合法性)
public void setAge(int age) {
if (age >= 0 && age <= 120) {
this.age = age;
} else {
throw new IllegalArgumentException("Age is invalid!");
}
}
}
1.2 继承:复用代码,扩展功能
继承是子类复用父类属性和方法,并扩展自身特有功能的机制,是实现代码复用的核心手段。
核心规则
- IS-A关系:继承本质是“是一个”的关系(如
Cat是Animal),子类可继承父类非private的属性和方法; - 里氏替换原则:子类对象必须能替换所有父类对象(即子类需兼容父类的行为);
- 向上转型:父类引用可指向子类对象,是多态的前提,语法为
父类类型 变量名 = new 子类类型();。
基础示例
// 父类:动物类(定义共性)
public class Animal {
protected String name;
public void eat() {
System.out.println(name + "在吃东西");
}
}
// 子类:猫类(继承Animal,复用eat方法,扩展特有方法)
public class Cat extends Animal {
public void catchMouse() {
System.out.println(name + "在抓老鼠");
}
}
// 向上转型:父类引用指向子类对象
Animal animal = new Cat();
animal.eat(); // 复用父类方法,输出“null在吃东西”(未赋值name)
1.3 多态:同一调用,不同效果
多态是OOP的灵活体现,分为编译时多态(方法重载)和运行时多态(方法重写+向上转型),其中运行时多态是开发中最核心的应用。
运行时多态的三个条件
- 存在继承关系;
- 子类重写父类方法;
- 父类引用指向子类对象(向上转型)。
实战示例
以下代码中,Instrument(乐器类)作为父类,Wind(管弦乐)和Percussion(打击乐)子类重写play()方法;通过父类引用管理子类对象,遍历调用play()时,运行时会执行实际子类的方法,体现“同一调用,不同效果”:
import java.util.ArrayList;
import java.util.List;
// 父类:乐器类
public class Instrument {
public void play() {
System.out.println("Instrument is playing...");
}
}
// 子类1:管弦乐(继承Instrument,重写play方法)
public class Wind extends Instrument {
@Override
public void play() {
System.out.println("Wind is playing...");
}
}
// 子类2:打击乐(继承Instrument,重写play方法)
public class Percussion extends Instrument {
@Override
public void play() {
System.out.println("Percussion is playing...");
}
}
// 测试类:演示运行时多态
public class Music {
public static void main(String[] args) {
// 创建父类类型的列表,存储子类对象(向上转型)
List<Instrument> instruments = new ArrayList<>();
instruments.add(new Wind());
instruments.add(new Percussion());
// 遍历调用play方法:编译时认为调用Instrument的play,运行时执行子类重写的方法
for (Instrument instrument : instruments) {
instrument.play();
}
}
}
输出结果:
Wind is playing...
Percussion is playing...
二、Java类图:可视化类结构与关系
Java类图是UML的核心组件,能将代码中的类、属性、方法及类间关系以图形化方式呈现,是设计、沟通、梳理代码结构的必备工具。
2.1 类图的核心组成
Java类在类图中以三层矩形框表示,每层对应类的核心要素,格式规范如下:
| 层级 | 内容 | 格式 / 说明 |
|---|---|---|
| 第一层 | 类名 | 居中显示,首字母大写;抽象类名需用斜体标注(如Animal)。 |
| 第二层 | 属性(成员变量) | 格式:访问修饰符 变量名: 数据类型;访问修饰符符号:+(public)、-(private)、#(protected)、~(默认/包访问) |
| 第三层 | 方法(含构造器) | 格式:访问修饰符 方法名(参数名:类型): 返回值类型;构造器无返回值,参数部分为空则表示无参构造器 |
直观示例
| 层级 | 内容示例 | 说明 |
|---|---|---|
| 第一层 | Person(普通类)Animal(抽象类) |
普通类大写居中,抽象类斜体 |
| 第二层 | - name: String+ age: int |
private的name属性,public的age属性 |
| 第三层 | + Person()# eat(food: String): void |
public无参构造器,protected的eat方法(接收String参数,无返回值) |
2.2 类与类之间的核心关系
类图的核心价值不仅是展示单个类的结构,更能清晰描述类间关系,以下是Java中最常用的6种类间关系:
| 关系类型 | 核心定义 | 语法/标识 | 示例 |
|---|---|---|---|
| 泛化关系 | 描述继承关系,子类继承父类的属性和方法 | extends关键字;类图用空心三角+实线 | Cat extends Animal |
| 实现关系 | 描述类实现接口的关系 | implements关键字;类图用空心三角+虚线 | Dog implements Runnable |
| 聚合关系 | 整体由部分组成,整体与部分弱依赖(整体消失,部分仍存在) | 类图用空心菱形+实线 | 公司(整体)-员工(部分) |
| 组合关系 | 整体由部分组成,整体与部分强依赖(整体消失,部分也消失) | 类图用实心菱形+实线 | 公司(整体)-部门(部分) |
| 关联关系 | 静态关系(运行前确定),描述不同类对象的关联(1对1、多对1、多对多) | 类图用实线(标注数量) | 学生(多)-学校(1) |
| 依赖关系 | 动态关系(运行时生效),A依赖B的场景:B是A的局部变量/方法参数/A调用B的方法 | 类图用虚线箭头 | 司机(A)-汽车(B):司机方法参数是汽车 |
关键关系对比(易混淆点)
- 聚合 vs 组合:核心看“部分是否依赖整体存在”。比如“电脑-键盘”是聚合(电脑坏了,键盘还能用),“电脑-主板”是组合(电脑拆了,主板失去原有意义);
- 关联 vs 依赖:关联是“长期静态关系”(如学生和学校),依赖是“临时动态关系”(如司机开车时依赖汽车,不开车时无依赖)。
三、核心总结
- 三大特性:封装是基础(隐藏细节、暴露接口),继承是手段(复用代码、扩展功能),多态是延伸(灵活调用、降低耦合),三者相辅相成构成OOP的核心逻辑;
- 类图核心:三层矩形框描述类的“名-属性-方法”,6种类间关系覆盖继承、实现、组合/聚合、关联/依赖,是可视化设计Java程序的关键;
- 实战要点:封装需遵循“私有属性+公共接口”,继承需满足里氏替换原则,多态依赖“继承+重写+向上转型”,类图需精准区分聚合/组合、关联/依赖的差异。
掌握这些知识点,既能写出符合OOP思想的高质量Java代码,又能通过类图清晰梳理程序结构,无论是日常开发还是团队协作,都是必备的核心能力。
更多推荐




所有评论(0)