面向对象编程概述
面向对象编程(Object-Oriented Programming,OOP)是一种编程范式,将数据和操作数据的方法封装在一起,以对象为基本单元进行程序设计。
OOP 核心概念
- 对象:现实世界实体的抽象,包含属性和行为
- 类:对象的模板或蓝图,定义对象的属性和方法
- 实例:类的具体实现,即对象
封装
封装是将数据(属性)和操作数据的方法(行为)绑定在一起,并对外部隐藏内部实现细节的机制。
封装的优点
- 数据安全性:防止外部直接访问和修改对象内部数据
- 代码复用:封装好的类可以在不同地方重复使用
- 模块化:每个类负责自己的功能,降低耦合度
- 可维护性:修改内部实现不影响外部使用
封装示例
public class Person {
private String name;
private int age;
private String gender;
public Person(String name, int age, String gender) {
this.name = name;
this.age = age;
this.gender = gender;
}
public String getName() {
return name;
}
public void setName(String name) {
if (name != null && !name.isEmpty()) {
this.name = name;
}
}
public int getAge() {
return age;
}
public void setAge(int age) {
if (age > 0 && age < 150) {
this.age = age;
}
}
public void introduce() {
System.out.println("我是" + name + ",今年" + age + "岁,性别" + gender);
}
}
继承
继承是一种机制,允许一个类(子类)获得另一个类(父类)的属性和方法。
继承的优点
- 代码复用:子类可以直接使用父类的属性和方法
- 层次结构:建立类之间的关系,使代码更有组织
- 扩展性:可以在子类中添加新的功能
继承示例
public class Animal {
protected String name;
protected int age;
public Animal(String name, int age) {
this.name = name;
this.age = age;
}
public void eat() {
System.out.println(name + "正在吃东西");
}
public void sleep() {
System.out.println(name + "正在睡觉");
}
}
public class Dog extends Animal {
private String breed;
public Dog(String name, int age, String breed) {
super(name, age);
this.breed = breed;
}
public void bark() {
System.out.println(name + "汪汪汪!");
}
@Override
public void eat() {
System.out.println(name + "正在吃狗粮");
}
}
public class Cat extends Animal {
private String color;
public Cat(String name, int age, String color) {
super(name, age);
this.color = color;
}
public void meow() {
System.out.println(name + "喵喵喵!");
}
@Override
public void sleep() {
System.out.println(name + "在沙发上睡觉");
}
}
多态
多态是指同一个方法在不同对象上有不同的行为表现。
多态的实现方式
- 方法重写(Override):子类重新定义父类的方法
- 方法重载(Overload):同一个类中定义多个同名方法,参数列表不同
- 接口:通过接口实现多态
多态示例
public interface Shape {
double getArea();
double getPerimeter();
}
public class Circle implements Shape {
private double radius;
public Circle(double radius) {
this.radius = radius;
}
@Override
public double getArea() {
return Math.PI * radius * radius;
}
@Override
public double getPerimeter() {
return 2 * Math.PI * radius;
}
}
public class Rectangle implements Shape {
private double width;
private double height;
public Rectangle(double width, double height) {
this.width = width;
this.height = height;
}
@Override
public double getArea() {
return width * height;
}
@Override
public double getPerimeter() {
return 2 * (width + height);
}
}
public class ShapeCalculator {
public static void printShapeInfo(Shape shape) {
System.out.println("面积: " + shape.getArea());
System.out.println("周长: " + shape.getPerimeter());
}
public static void main(String[] args) {
Shape circle = new Circle(5);
Shape rectangle = new Rectangle(4, 6);
printShapeInfo(circle);
printShapeInfo(rectangle);
}
}
设计模式
设计模式是解决特定问题的通用解决方案,是OOP思想的最佳实践。
常见设计模式
| 类别 | 模式名称 | 描述 |
|---|---|---|
| 创建型 | 单例模式 | 确保一个类只有一个实例 |
| 创建型 | 工厂模式 | 封装对象的创建过程 |
| 创建型 | 建造者模式 | 分步构建复杂对象 |
| 结构型 | 适配器模式 | 将一个接口转换为另一个接口 |
| 结构型 | 装饰器模式 | 动态添加功能 |
| 结构型 | 代理模式 | 为对象提供代理 |
| 行为型 | 观察者模式 | 一对多的依赖关系 |
| 行为型 | 策略模式 | 封装算法并使其可互换 |
| 行为型 | 模板方法模式 | 定义算法骨架 |
单例模式示例
public class Singleton {
private static volatile Singleton instance;
private Singleton() {
}
public static Singleton getInstance() {
if (instance == null) {
synchronized (Singleton.class) {
if (instance == null) {
instance = new Singleton();
}
}
}
return instance;
}
}
总结
面向对象编程的三大特性——封装、继承、多态——是构建高质量软件的基础。封装保证了数据安全,继承实现了代码复用,多态提高了代码的灵活性和可扩展性。掌握设计模式则能让你的代码更加优雅和可维护。