面向对象编程概念

面向对象编程

什么是对象?

对象是相关状态和行为的软件包。软件对象通常用于对日常生活中找到真实对象进行建模。

对象是理解面向对象技术的关键。看看周围,你会发现有许多真实世界的对象的例子:你的狗、笔记本、桌子、显示器、自行车。

现实世界的对象有两个特征:状态和行为。狗有状态(名称,颜色,品种,饥饿)和行为(吠叫,跑,摇尾巴)。识别真实对象的状态和行为是开始思考面向对象的编程的一种很好的方法。

软件对象在概念上与真实对象相似:它们也由状态和行为组成。对象将其状态存储在字段中,并通过方法公开其行为。方法对对象的内部状态进行操作,并充当对象和对象通信的主要机制。隐藏内部状态并要求通过对象的方法执行所有交互称为数据封装,这是面试对象编程的基本原则。

对象

将代码捆绑到单个对象中提供了许多好处:

  1. 模块化:对象的源代码可以独立于其他对象的源代码编写和维护。创建后,可以在系统内轻松传递对象;
  2. 信息隐藏:仅通过与对象的方法交互,其内部实现的详细信息仍然隐藏在外部世界;
  3. 代码重新使用:如果一个对象已经存在,你可以在程序中使用该对象。这允许专家实现/测试/调试复杂的任务的特定对象,然后你可以信任这些对象在自己的代码中运行;
  4. 可插拔性和调试的易用性:如果特定对象出现问题,只需要将其从应用程序中删除,然后插入其他对象作为替换对象即可。这类似与在现实世界中修复机械问题,如果螺栓断裂,则更换螺栓,而不是更换整台机器。

什么是类?

类是创建对象的蓝图或原型。

在现实世界中,有许多同一种个体。比如成千上万自行车具有相同的品牌和型号。每辆自行车都是根据相同的设计图制造的,因此包含相同的组件。用面向对象的术语来说,您的自行车是称为自行车的一个类对象的实例。类是从中创建单个对象的蓝图。

例如一辆自行车的实现可能为:

class Bicycle {
    int cadence = 0;
    int speed = 0;
    int gear = 1;
    
    void changeCadence(int newValue) {
        cadence = newValue;
    }
    
    void changeGear(int newValue) {
        gear = newValue;
    }
    
    void speedUp(int increment) {
        speedUp = speed + increment;
    }
    
    void applyBrakes(int decrement) {
        speed = speed - decrement;
    }
    
    void printStates() {
        System.out.println("cadence:" + cadence + " speed:" + speed + " gear:" + gear);
    }
}

此类是基于上文对自行车对象的讨论。字段 cadence, speed, gear 表示该对象的状态,并且 changeCadence, changeGear,speedUp 等与外部进行交互。

此类不包含 main 方法,因为这不是一个完整的应用程序。它只是应用程序中可能使用的自行车的蓝图。创建和使用新 Bicycle 对象的责任属于应用程序中的其它一些类。

例如:

class BicycleDemo {
    Bicycle bike1 = new Bicycle();
    Bicycle bike2 = new Bicycle();
    
    bike1.changeCadence(50);
    bike1.speedUp(10);
    bike1.changeGear(2);
    bike1.printStates();

    bike2.changeCadence(50);
    bike2.speedUp(10);
    bike2.changeGear(2);
    bike2.changeCadence(40);
    bike2.speedUp(10);
    bike2.changeGear(3);
    bike2.printStates();
}

什么是继承

继承为组合和构造软件提供了强大而自然的机制。如何从其超类继承状态和行为?

不同类的对象之间有一些共同点。例如,山地自行车、公路自行车和双人自行车都具有自行车的特征(当前速度、踏板节奏、当前档位)。然而,每个自行车还定义了一些与众不同的功能:双人自行车有两个作为和两组车把;公路自行车有下降的车把;一些山地自行车有一个附加的链环,使他们的齿轮比更低。

面向对象的编程允许类从其他类继承常用的状态和行为。在这个例子中,Bicycle 现在变成了MountainBike、RoadBike、TandemBike的父类。在 Java 编程语言中,每个类都可以有一个直接的超类,并且每个超类都有无限数量的子类的可能:

自行车类层次结构

创建子类的语法很简单,在类声明的开头使用 extends 关键字,后跟要从其继承的类的名称:

class MountainBike extends Bicycle {
    //......
}

这为 MountainBike 提供了与 Bicycle 相同的字段和方法,但允许其代码仅专注于其独特的功能。这使子类的代码易于阅读。但是,你必须主义正确记录每个超类定义的状态和行为,因为该代码不会出现在每个子类的源文件中。

什么是接口

接口是类与外界之间的契约。当一个类实现一个接口时,它承若提供该接口发布的行为。

对象通过其公开的方法定义了它们与外界的交互。方法形成对象与外界的接口;例如,电视机正面的按钮是您与塑料外壳另一侧的电线之间的接口。按下电源按钮可以打开和关闭电视。

在常见的形式中,接口是一组具有空主体的相关方法。如果将自行车的行为指定为接口,则可能如下所示:

interface Bicycle {
    void changeCadence(int newValue);
    void changeGear(int newValue);
    void speedUp(int increment);
    void applyBrakes(int decrement);
}

要实现此接口,您的类名称前需要加上 implements 关键字,例如 ACMEBicycle :

class ACMEBicycle implements Bicycle {
    int cadence = 0; 
    int speed = 0;
    int gear = 1;
    
    void changeCadence(int newValue) {
        cadence = newValue;
    }
    
    void changeGear(int newValue) {
        gear = new Value;
    }
    
    void speedUp(int increment) {
        speed = speed + increment;
    }
    
    void applyBrakes(int decrement) {
        speed = speed - decrement;
    }
    
    void printStates() {
        System.out.println("cadence:" + cadence + " speed:" + speed + " gear:" + gear);
    }
}

实现接口可以使类对其承若提供的行为变得更加正式。接口在类和外部世界之间形成契约,并且该契约在编译时由编译器强制执行。如果你的类声明要实现一个接口,则在成功编译该类之前,该接口的所有方法都必须出现在其源代码中。

什么是包(package)

包是用于以逻辑方式组织类和接口的名称空间。将您的代码放入软件包可以使大型软件项目更易于管理。

包是一个命名空间,用于组织一组相关的类和接口。从概念上讲,你可以将软件包视为类似于计算机上的不同文件夹。您可以将 HTML 页面保存在一个文件夹中,将图片保存在另一个文件夹中,并将脚本或应用程序保存在另一个文件夹中。因为用 Java 编程语言编写的软件可以由成百上千个单独的类组成,所以通过将相关的类和接口放入包中来使事情井井有条是非常有意义的。

问题和练习:

  1. 实际对象包含状态行为
  2. 对象的状态存储在字段中;
  3. 对象的行为是通过方法公开的;
  4. 隐藏来自外部世界的内部数据,并仅通过公开的方法访问它,这被称为数据封装
  5. 对象的蓝图称为类;
  6. 共同行为可以在一个被定义的超类和继承到一个子类使用extends关键字;
  7. 没有实现方法的集合称为接口;
  8. 通过功能组织类和接口的名称空间称为package;
  9. API 代表应用程序编程接口。

猜你喜欢

转载自blog.csdn.net/dejunyang/article/details/109307138