香雨站

 找回密码
 立即注册
搜索
热搜: 活动 交友 discuz
查看: 73|回复: 0

Java面向对象编程的概念

[复制链接]

4

主题

7

帖子

18

积分

新手上路

Rank: 1

积分
18
发表于 2022-11-29 15:25:54 | 显示全部楼层 |阅读模式
原文链接

面向对象编程的概念
对象(object)
类(class)  
继承(inheritance)
接口(interface)
包(package)  
面向对象编程的概念

面向对象编程的基本概念包括:
1. 对象:对象是相关状态和行为的软件包,软件对象通常用于模拟现实世界中的对象。
2. 类:类是创建对象的蓝图或原型。
3. 继承:继承为组织软件提供了强大的机制。
4. 接口:接口是类与外界之间的契约,一个类实现一个接口时,需要提供这个接口发布的所有行为。
5. 包:包是一个用逻辑方式来组织类和接口的命名空间,把代码放在包中更容易管理大型软件项目。
对象(object)

对象是理解面向对象技术的关键,现实世界中存在许多对象的例子:狗、桌子、电视机、自行车。

现实世界中的对象都具有状态和行为两种特性。狗具有名字、颜色、品种、饥饿等状态以及叫、抓、摇尾巴等行为。自行车具有档位、踏频、速度等状态以及换档、改变踏频、刹车等行为。识别现实世界中对象的状态和行为是理解面向对象编程术语的好方法。

观察一下现实世界中的对象,并思考一下这些对象:这些对象可能处于什么状态,这些对象可以执行什么行为,并把观察结果记录下来。现实世界中的对象具有不同的复杂性,台灯可能只有打开、关闭状态以及打开、关闭行为,而收音机可能具有打开、关闭、当前音量、当前电台状态以及打开、关闭、增大音量、减小音量、搜索、扫描、调频行为,有些对象还可能包含其他对象。现实世界中的这些观察结果都可以转换为面向对象编程。




软件对象

软件对象在概念上与现实世界中的对象类似:也具有状态和行为两种特性。对象把状态存储在成员变量(属性、字段)中,通过方法(函数)来暴露其行为。方法操纵对象的内部状态,并且是对象与对象之间进行通信的主要机制。隐藏内部状态并通过对象方法来执行所有的交互被称作数据封装,这是面向对象编程的基本原则。

以自行车为例:




作为软件对象模型的自行车

通过指定当前速度、当前踏频、当前档位状态,并提供修改这些状态的方法,对象控制着外界如何使用这个对象。例如,如果自行车只有6个档位,换档方法可以拒绝小于1或大于6的任何值。

把代码打包在单独的软件对象中具有以下好处:
1. 模块化:对象源代码的编写和维护不依赖于其他对象的源代码,对象一旦被创建,很容易在系统内部进行传递。
2. 隐藏信息:与对象的方法进行交互,对外界隐藏对象的内部实现细节。
3. 重用代码:在程序中可以使用已经存在的对象(可能是其他软件开发人员编写的)。专家可以实现、测试、调试复杂的、特定任务的对象,其他开发人员可以信任这些对象,并在代码中运行这些对象。
4. 可插拔且易于调试:发现某个对象存在问题时,可以简单地从应用程序中删除这个对象,并插入一个不同的替代对象。这类似于解决现实世界中的机械问题,如果一个螺丝坏了,只需要替换这个螺丝,而不是整个机器。
类(class)

现实世界中存在许多相同类型的独立对象。市面上可能存在成千上万具有相同品牌和型号的自行车,每辆自行车都是根据相同的设计制造出来的,因此它们具有相同的组件。在面向对象的术语中,自行车是自行车对象类的一个实例,类是创建单个对象的蓝图。

下面的Bicycle类是自行车的一种可能实现:
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) {
        speed = speed + increment;
    }

    void applyBrakes(int decrement) {
        speed = speed - decrement;
    }

    void printStates() {
        System.out.println("cadence:" + cadence + " speed:" + speed + " gear:" + gear);
    }

}Java编程语言的语法看起来很新,但是这个类的设计却基于前面讨论的自行车对象。cadence、speed和gear成员变量(属性、字段)表示对象的状态,changeCadence、changeGear、speedUp等方法定义了自行车与外界的交互。

Bicycle类中没有包含main方法,这是因为Bicycle类并不是一个完整的应用程序,它只是应用程序中可能会使用的自行车蓝图,创建和使用新的Bicycle对象是应用程序中其他类的事情。

下面的BicycleDemo类创建了两个独立的Bicycle对象,然后调用Bicycle对象的方法:
class BicycleDemo {

    public static void main(String[] args) {
        // 创建两个不同的Bicycle对象
        Bicycle bike1 = new Bicycle();
        Bicycle bike2 = new Bicycle();

        // 调用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();
    }

}这个测试类的输出打印了这两个自行车对象的cadence、speed和gear:
cadence:50 speed:10 gear:2
cadence:40 speed:20 gear:3继承(inheritance)

不同类型的对象之间通常具有一定的共同点。例如,山地自行车、公路自行车和双人自行车都具有自行车的特性:当前速度、当前踏频、当前档位。但是,每种自行车都具有不同的特性:双人自行车具有两个座位和两组车把;公路自行车具有赛车车把;山地自行车具有额外的链条环,使其齿轮传动比更低。

面向对象编程允许一个类从其他类继承通用状态和行为。这个例子中,Bicycle类变成了MountainBike、RoadBike、TandemBike类的父类(超类)。Java编程语言中,每个类只允许有一个直接父类,每个父类可以有无限个直接子类。




Bicycle类的层次结构

创建子类的语法很简单,声明类时,使用extends关键字,后面紧跟着需要继承的父类名:
class MountainBike extends Bicycle {

    // MountainBike类的成员变量(属性、字段)和方法(函数)

}MountainBike子类具有Bicycle父类的所有成员变量(属性、字段)和方法(函数),子类的代码只需要关注不同于其他自行车类的特性,这样子类的代码更易于阅读。但是,必须正确记录每个父类的状态和行为,这些代码并不会出现在每个子类的源文件中。
接口(interface)

对象通过其暴露的方法与外界进行交互,方法构成了对象与外界交互的接口。例如,电视机前面的按钮就是你和电视机塑料外壳另一侧的电线之间的接口,按下电源按钮就可以打开或关闭电视机。

通常,接口只是一组具有空方法体的方法。把自行车的行为定义为接口时,可能如下:
interface Bicycle {

    // 每分钟的转数
    void changeCadence(int newValue);

    void changeGear(int newValue);

    void speedUp(int increment);

    void applyBrakes(int decrement);

}要实现这个接口,可能需要修改类名(修改为特定品牌的自行车,例如,ACMEBicycle),然后在类声明中使用implements关键字:
class ACMEBicycle implements Bicycle {

    int cadence = 0;
    int speed = 0;
    int gear = 1;

    // 编译器要求实现这些方法:changeCadence、changeGear、speedUp、applyBrakes,
    // 如果这个类中缺少这些方法,编译将会失败

    public void changeCadence(int newValue) {
        cadence = newValue;
    }

    public void changeGear(int newValue) {
        gear = newValue;
    }

    public void speedUp(int increment) {
        speed = speed + increment;
    }

    public void applyBrakes(int decrement) {
        speed = speed - decrement;
    }

    public void printStates() {
        System.out.println("cadence:" + cadence + " speed:" + speed + " gear:" + gear);
    }

}实现一个接口使一个类在提供其承诺的行为时显得更加正式。接口在类和外界之间形成了一个契约,编译器在构建时会强制执行这个契约。如果一个类在声明时实现了一个接口,那么这个类在成功编译之前,其源代码中必须包含这个接口定义的所有方法。

注意:实际编译ACMEBicycle类时,需要在实现的接口方法前面添加public关键字,后续的类和对象、接口和继承中会说明这个原因。
包(package)

包是用于组织相关类和接口的命名空间,概念上可以把包看作是计算机中的不同文件夹。可以把HTML页面放在一个文件夹中,把图片放在另一个文件夹中,把脚本或应用程序放在另一个文件夹中。用Java编程语言编写的软件包含了成百上千个单独的类,因此把相关的类和接口放在包中可以保持事物的条理性。

Java平台提供了适用于应用程序的庞大类库(包),这个库被称作应用程序编程接口,简称API,这些包代表着与通用编程相关的常见任务。例如,String对象包含了字符串的状态和行为;File对象让程序员可以轻松地创建、删除、检查、比较或修改文件系统中的文件;Socket对象可以创建和使用网络套接字;各种GUI对象控制着按钮和复选框以及与图形用户界面相关的其他东西。这里有成千上万的类可供选择,让程序员可以专注于设计特定应用程序,而不是工作所需的基础设施。

Java平台API规范 中包含了Java SE平台提供的所有包、接口、类、成员变量和方法。在浏览器中加载并收藏这个页面,这是程序员最重要的参考文档。
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

Archiver|手机版|小黑屋|香雨站

GMT+8, 2025-3-15 05:05 , Processed in 0.386518 second(s), 23 queries .

Powered by Discuz! X3.4

© 2001-2013 Comsenz Inc.. 技术支持 by 巅峰设计

快速回复 返回顶部 返回列表