哈喽,各位宝子们!今天咱们要一起深入探索Java面向对象编程这个看似高深实则超有趣的领域! 如果你还在为那些抽象概念头大,那就对啦,这篇文章就是为你量身定制的平替款学习指南!不需要啃那些枯燥的教材,跟着我一起,用最接地气的方式把OOP(面向对象编程)这个知识点拿下!
宝子们,想象一下:类就像是汽车设计图,而对象就是根据图纸生产出来的实际汽车。 是不是一下子就清晰了?
// 这是我们的汽车设计图(类)
public class Car {
// 属性:汽车的特征
private String brand; // 品牌
private String color; // 颜色
private int speed; // 速度
// 方法:汽车能做什么
public void accelerate() {
speed += 10;
System.out.println("嘎嘎加速,当前速度:" + speed);
}
public void brake() {
speed -= 10;
System.out.println("急刹车,当前速度:" + speed);
}
}
// 创建两辆不同的汽车(对象)
Car benz = new Car(); // 奔驰下线
Car bmw = new Car(); // 宝马下线
这不就是我们平时看到的汽车工厂吗?设计图纸(类)只有一份,但可以生产出无数辆汽车(对象)!每辆车虽然都按照同一个图纸制造,但可以有不同的颜色、配置等属性。这就是面向对象的第一个核心概念:类是模板,对象是实例
宝子们,这部分可能有点绕,但超级重要!咱们继续用汽车工厂的例子来理解~
// 抽象类:定义了汽车的基本框架,但有些部分没实现
public abstract class Vehicle {
protected int wheels;
// 已实现的方法
public void honk() {
System.out.println("滴滴!让让!");
}
// 抽象方法:必须由子类实现
public abstract void drive();
}
// 接口:纯粹的规范,没有任何实现
public interface ElectricVehicle {
void charge(); // 充电方法
int getBatteryLevel(); // 获取电量
}
特性 | 抽象类 | 接口 |
---|---|---|
继承 | 单继承 | 多实现 |
方法 | 可以有实现和抽象方法 | 只能有抽象方法(Java 8+可有默认方法) |
属性 | 可以有成员变量 | 只能有常量 |
构造器 | 可以有构造器 | 不能有构造器 |
适用场景 | 表示"是什么"的关系 | 表示"能做什么"的关系 |
简单来说:
宝子们,记住这个黄金法则:当你思考"是什么"关系时用抽象类,思考"能做什么"关系时用接口
好了,理论知识已经安排上了,现在咱们来点实战!假设我们要开发一个学生管理系统,最初的代码是这样的:
public class StudentSystem {
public void addUndergraduate(String name, int age, String major) {
// 添加本科生的代码
System.out.println("添加本科生:" + name);
}
public void addGraduate(String name, int age, String researchArea) {
// 添加研究生的代码
System.out.println("添加研究生:" + name);
}
public void addPhD(String name, int age, String thesis) {
// 添加博士生的代码
System.out.println("添加博士生:" + name);
}
}
这代码也太难维护了吧!每次添加新的学生类型,都要修改这个类,违反了开闭原则!宝子们,是时候卷起来,用工厂模式重构它!
首先,定义学生接口和具体实现:
// 学生接口
public interface Student {
void study();
String getInfo();
}
// 本科生实现
public class Undergraduate implements Student {
private String name;
private int age;
private String major;
public Undergraduate(String name, int age, String major) {
this.name = name;
this.age = age;
this.major = major;
}
@Override
public void study() {
System.out.println(name + "正在学习专业课程:" + major);
}
@Override
public String getInfo() {
return "本科生:" + name + ",年龄:" + age + ",专业:" + major;
}
}
// 研究生实现(类似,省略代码)
// 博士生实现(类似,省略代码)
然后,创建学生工厂:
// 学生工厂接口
public interface StudentFactory {
Student createStudent(String name, int age, String speciality);
}
// 本科生工厂
public class UndergraduateFactory implements StudentFactory {
@Override
public Student createStudent(String name, int age, String major) {
return new Undergraduate(name, age, major);
}
}
// 研究生工厂(类似,省略代码)
// 博士生工厂(类似,省略代码)
最后,重构学生管理系统:
public class StudentSystem {
public Student addStudent(StudentFactory factory, String name, int age, String speciality) {
Student student = factory.createStudent(name, age, speciality);
System.out.println("成功添加学生:" + student.getInfo());
return student;
}
}
public class Main {
public static void main(String[] args) {
StudentSystem system = new StudentSystem();
// 添加本科生
StudentFactory undergradFactory = new UndergraduateFactory();
Student undergrad = system.addStudent(undergradFactory, "小明", 20, "计算机科学");
undergrad.study();
// 添加研究生
StudentFactory gradFactory = new GraduateFactory();
Student grad = system.addStudent(gradFactory, "小红", 24, "人工智能");
grad.study();
}
}
宝子们,看到没?这就是工厂模式的魅力!现在如果要添加新的学生类型(比如交换生),只需要:
完全不需要修改原有代码,这就是所谓的对扩展开放,对修改关闭的开闭原则!
好啦宝子们,今天我们学习了Java面向对象的三大核心内容:
关注我的更多技术内容
如果你喜欢这篇文章,别忘了点赞、收藏和分享!有任何问题,欢迎在评论区留言讨论!