首页 Java java教程 引入面向对象

引入面向对象

Dec 31, 2024 pm 06:04 PM

在本章中,我们将学习面向对象(OO)并探索它在软件系统开发过程中带来的好处。

为什么我们在软件开发中需要面向对象(OO)

为了回答这个问题,我们首先(简单地)看看如何使用结构化编程方法(也称为函数式编程)来设计软件系统。

1.结构化编程:

结构化编程中,一般方法是分析问题并将其分解为函数来执行特定任务。大多数这些函数都需要数据类型来处理。 功能系统中的数据通常存储在数据库中,或者可以作为全局变量.

保存在内存中

让我们举一个学校管理系统的简单示例。该系统存储学校所有学生和讲师的详细信息。同时,它还管理学校提供的课程信息,并跟踪哪些学生正在学习哪些课程。

系统需要存储学生老师考试课程的信息,设计有以下功能:

  • 添加学生
  • 参加考试
  • 检查考试标记
  • 颁发_证书
  • 开除学生

从那里,我们可以构建数据、函数和依赖关系的图表,如下所示:
Introduce Object Orientation

这种方法的问题是,如果我们要解决的问题变得过于复杂,系统将变得越来越难以维护。以上面的示例为例,如果请求改变了 Student 处理数据的方式,例如将 “出生年份” 从两个字数字转换为四位数字,该怎么办?只是这个小小的改变就可能导致不可预见的副作用并导致严重的问题。 考试课程老师的数据都依赖于学生的数据。此外,我们可能破坏了 add_student、enter_for_exams、issue_certificate 和 expel_student 函数。例如,add_student 肯定不再起作用,因为它需要两位数的“出生年份”数据,而不是四位数字。

从上面的例子中,我们可以看到结构化编程的一些缺点,包括函数和数据之间的相互依赖,导致难以维护难以扩展容易遇到意想不到的问题更改数据时。为了解决这些问题,我们需要一种新的方法,那就是面向对象(OO).

2.面向对象:

2.1。概念:

对象:可以理解为一个具体的实体,由2个主要组件组成:

  • 属性:是对象的信息和特征。

  • 方法:对象可以执行的操作和动作。

从上面的问题学校管理系统的例子中,我们可以有以下对象:
Introduce Object Orientation

类: 是一种数据类型,包括对象将具有的预定义属性和方法。我们可以将类理解为创建对象的模板。

例如:学生是所有学生的通用定义模板,包括共同的属性和方法,如姓名、出生年份和其他如入学等行为。对象是一个名为2004年出生的Nguyen Van A的特定学生,具有班级特征学生

2.2。 OOP的基本原则:

封装

封装就是将相关的属性和方法分组到同一个类中,以达到有效管理和使用的目的。这降低了复杂性并提高了安全性,同时也使代码易于维护和扩展。

public class Student {
    private String name;
    private String dateOfBirth;


    public void registerForCourse(Course course) {
        course.addStudent(this);
    }
}
登录后复制
登录后复制

学生信息将被封装在Student类中,与Student相关的动作将通过该类中的方法进行。

传承

继承允许子类继承父类的属性和方法,以最佳地重用源代码并轻松扩展功能。

public class Person {
    private String name;
    private String dateOfBirth;
}

public class Student extends Person {
    private double gpa;
}

public class Teacher extends Person {
    private String department;
}
登录后复制

StudentTeacher 都继承自 Person 类,有助于重用公共属性。每个子类都可以添加单独的属性或方法。

多态性

多态允许一个方法以多种不同的方式实现,即该方法可以在具有不同行为的子类中重新定义。

public class Person {
    public void introduce() {
        System.out.println("I am a person.");
    }
}

public class Student extends Person {
    @Override
    public void introduce() {
        System.out.println("I am a student.");
    }
}

public class Teacher extends Person {
    @Override
    public void introduce() {
        System.out.println("I am a teacher.");
    }
}

public class Main {
    public static void main(String[] args) {
        Person person = new Person();
        Person student = new Student();
        Person teacher = new Teacher();

        person.introduce(); // I am a person.
        student.introduce(); // I am a student.
        teacher.introduce(); // I am a teacher.
    }
}
登录后复制

introduce 方法在 Person 类中定义,并在 StudentTeacher 子类中重写。即使使用 Person 类型,当调用 introduce 方法时,系统将使用实际对象的适当方法(StudentTeacher ),表现出多态性。

抽象

抽象是一种处理一般概念的方法,而不需要过多关注具体的实现细节,从而提高灵活性并降低复杂性。

public class Student {
    private String name;
    private String dateOfBirth;


    public void registerForCourse(Course course) {
        course.addStudent(this);
    }
}
登录后复制
登录后复制

通过Abstraction,我们定义一个带有泛型方法(startCourse())的抽象类(Course)。 MathCourseScienceCourse 等子类详细实现了这些方法,使系统易于扩展和定制。

3.面向对象编程的优点:

  • 由于继承,类可以在不重复代码的情况下进行扩展,从而最大限度地减少冗余并提高效率。
  • 节省时间并提高生产力。
  • 类和对象的概念有助于在计算机上更自然、清晰地模拟现实世界的实体,同时克服面向结构编程的局限性。

以上是引入面向对象的详细内容。更多信息请关注PHP中文网其他相关文章!

本站声明
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn

热AI工具

Undresser.AI Undress

Undresser.AI Undress

人工智能驱动的应用程序,用于创建逼真的裸体照片

AI Clothes Remover

AI Clothes Remover

用于从照片中去除衣服的在线人工智能工具。

Undress AI Tool

Undress AI Tool

免费脱衣服图片

Clothoff.io

Clothoff.io

AI脱衣机

Video Face Swap

Video Face Swap

使用我们完全免费的人工智能换脸工具轻松在任何视频中换脸!

热工具

记事本++7.3.1

记事本++7.3.1

好用且免费的代码编辑器

SublimeText3汉化版

SublimeText3汉化版

中文版,非常好用

禅工作室 13.0.1

禅工作室 13.0.1

功能强大的PHP集成开发环境

Dreamweaver CS6

Dreamweaver CS6

视觉化网页开发工具

SublimeText3 Mac版

SublimeText3 Mac版

神级代码编辑软件(SublimeText3)

公司安全软件导致应用无法运行?如何排查和解决? 公司安全软件导致应用无法运行?如何排查和解决? Apr 19, 2025 pm 04:51 PM

公司安全软件导致部分应用无法正常运行的排查与解决方法许多公司为了保障内部网络安全,会部署安全软件。...

如何使用MapStruct简化系统对接中的字段映射问题? 如何使用MapStruct简化系统对接中的字段映射问题? Apr 19, 2025 pm 06:21 PM

系统对接中的字段映射处理在进行系统对接时,常常会遇到一个棘手的问题:如何将A系统的接口字段有效地映�...

如何优雅地获取实体类变量名构建数据库查询条件? 如何优雅地获取实体类变量名构建数据库查询条件? Apr 19, 2025 pm 11:42 PM

在使用MyBatis-Plus或其他ORM框架进行数据库操作时,经常需要根据实体类的属性名构造查询条件。如果每次都手动...

如何将姓名转换为数字以实现排序并保持群组中的一致性? 如何将姓名转换为数字以实现排序并保持群组中的一致性? Apr 19, 2025 pm 11:30 PM

将姓名转换为数字以实现排序的解决方案在许多应用场景中,用户可能需要在群组中进行排序,尤其是在一个用...

IntelliJ IDEA是如何在不输出日志的情况下识别Spring Boot项目的端口号的? IntelliJ IDEA是如何在不输出日志的情况下识别Spring Boot项目的端口号的? Apr 19, 2025 pm 11:45 PM

在使用IntelliJIDEAUltimate版本启动Spring...

Java对象如何安全地转换为数组? Java对象如何安全地转换为数组? Apr 19, 2025 pm 11:33 PM

Java对象与数组的转换:深入探讨强制类型转换的风险与正确方法很多Java初学者会遇到将一个对象转换成数组的�...

电商平台SKU和SPU数据库设计:如何兼顾用户自定义属性和无属性商品? 电商平台SKU和SPU数据库设计:如何兼顾用户自定义属性和无属性商品? Apr 19, 2025 pm 11:27 PM

电商平台SKU和SPU表设计详解本文将探讨电商平台中SKU和SPU的数据库设计问题,特别是如何处理用户自定义销售属...

使用TKMyBatis进行数据库查询时,如何优雅地获取实体类变量名构建查询条件? 使用TKMyBatis进行数据库查询时,如何优雅地获取实体类变量名构建查询条件? Apr 19, 2025 pm 09:51 PM

在使用TKMyBatis进行数据库查询时,如何优雅地获取实体类变量名以构建查询条件,是一个常见的难题。本文将针...

See all articles