面向编程概念

面向编程概念

假如之前你从未使用过一门面向对象编程语言,在编写代码之前,学习一些基本的面向对象编程概念是很有必要的。本课程会向你介绍对象继承。在讨论这些概念如何与现实对象相联系的同时,介绍Java的语法。

什么是对象?

对象是了解面向对象技术的关键。看看周围,你会发现很多真实世界的对象:你的宠物狗、你的桌子,你的电视、你的单车等等。

所有的真实世界对象共享两种特征:它们都有状态(state)行为(behavior)

例如:
1. 如狗的状态有名称、颜色、集合、种类;行为有吠、摇尾巴、捡东西给主人(fetching)。
2. 单车状态有当前速度、当前档位、当前踏板节奏;行为有换挡、改变踏板节奏、刹车。

识别真实世界对象的状态和行为有助于我们思考面向对象编程这个专业术语。

软件世界中的对象

软件世界中的对象和现实世界中的对象概念相似:它们都包含状态和相关的行为。对象将它的状态保存在成员变量中,通过方法暴露它的行为。方法操作对象内部状态,并作为对象之间进行通信的主要机制。隐藏内部状态以及通过方法进行交互即是我们所熟知的封装——面向对象程序设计的基本原理
作为软件对象建模的自行车

通过赋予状态(当前速度、当前踏板节奏,当前档位)以及提供更改状态的方法,自行车对象控制着外部世界对其的使用。例如,假如自行车有6个档位,那么改变档位的方法对传入非法的档位值(小于1 or 大于 6)时将拒绝执行。

将代码(state、behavior)捆绑在一个软件世界的对象内有很多好处:
1. 模块化。对象的源代码编写、维护可独立地、无关地进行。一旦创建,在系统内传递对象将轻而易举。
2. 信息隐藏。通过方法进行通信,可以对外部世界隐藏内部的实现。
3. 代码复用。存在的对象可以在你自个儿的程序中使用。
4. 插件化以及易于调试。如果系统中一个对象有问题,用好的对象替换掉它即可,这和现实世界中的机械修复很类似,如车胎爆了,只需要更轮车胎即可,不需要更换掉整量汽车。


什么是类?

在现实世界中,你经常看到同一种类的很多个性化对象。例如成百上千的自行车都是通过一个模型制造出来,引起包含相同的模型。在面向对象术语中,我们说自行车是某一类对象的实例。类是创建对象的蓝图

以下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语法对你来说很陌生,但是Bicycle类的设计是基于之前自行车对象的讨论。fields cadence, speed, 以及 gear 代表对象的状态,方法 (changeCadence, changeGear, speedUp 等等)定义了与外界进行交互的方式。

也许你发现了Bicycle类没有包含入口函数(main)。因为这不是一个完成的程序,这仅仅是一个可能被某个系统用到的蓝图。创建并使用Bicycle对象的责任属于程序中其它类的责任。

下面BicycleDemo类的例子将创建两个Bicycle对象,并执行它们各自的方法:

class BicycleDemo {
    public static void main(String[] args) {

        // Create two different 
        // Bicycle objects
        Bicycle bike1 = new Bicycle();
        Bicycle bike2 = new Bicycle();

        // Invoke methods on 
        // those objects
        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对象的pedal cadence, speed, 和 gear

cadence:50 speed:10 gear:2
cadence:40 speed:20 gear:3

什么是继承?

不同的对象间会有共性的东西。山地自行车,公路自行车和双人自行车都有自行车的特征(current speed, current pedal cadence, current gear)。每种自行车可以定义额外的特征以和其他自行车区分开来:双人自行车有两个座位和两个手把;公路自行车有下垂的车把;有些山地自行车有额外的链环等。

面向对象编程允许类从其它类哪里继承共有的状态和行为。在这个例子中,Bicycle是MountainBike, RoadBike, 和 TandemBike的基类(父类)。在Java编程语言中,每一个类允许有一个直接父类,每一个父类允许有任意个子类(派生类).
自行车的层次结构

创建子类的语法非常简单,在类声明的起始使用关键字extends,然后是被继承的类的名称:

class MountainBike extends Bicycle {

    // new fields and methods defining 
    // a mountain bike would go here

}

MountainBike的状态和行为和Bicycle的一样,然而,允许它的代码专注于使它独特的特征上。继承使得子类易于阅读,但是要在父类加上适合的文档注释,因为父类的代码不会出现在子类的代码中。

什么是接口?

正如你之前已经学到的,对象通过暴露方法定义了它们与外界的交互。方法构成(form)与对象与外界的接口。例如,你眼前的*电视按钮是你和(电视的)塑料外壳另一端的电线的接口。你按下按钮使电视处于开或关的状态。

接口最普遍的形式是一组方法体为空的相关方法。一辆自行车的方法,如果指定为接口,看起来可能如下

interface Bicycle {

    //  wheel revolutions per minute
    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;

   // The compiler will now require that methods
   // changeCadence, changeGear, speedUp, and applyBrakes
   // all be implemented. Compilation will fail if those
   // methods are missing from this class.

    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);
    }
}

实现一个接口允许一个类对其提供的行为变得更加正式(more foraml)。接口构成了类和外部世界之间的条款(契约),这个契约在编译时由编译器执行。假如你的类实现了一个接口,则实现类的源码中必须出现该接口定义的所有方法,否则将编译不通过。

为了成功编译ACMEBicycle类,你须得在所有实现方法前加上public关键字,否则显示”类ACMEBicycle与类Bicycle冲突,因为尝试赋予更弱的权限,父类为public“。

英文提示为:’changeCadence()’ in ACMEBicycle clashes with ‘changeCadence()’ in Bicycle;attempting assign weaker access privileges(‘packageLocal’);was ‘public’.

说明:在接口中声明的属性方法只能用public 或者 不用访问权限修饰符修饰。不用访问权限修饰词修饰意思也是public,即是说接口内的成员总是public的。

什么是包?

包是组织一组相关类或接口的命名空间。概念上你可以认为包和计算机上的文件夹类似。你可能在一个文件夹中存放HTML页面,另一个文件夹存放图片,脚本文件或程序存另一个文件夹内。因为用Java编程语言编写的软件可能由成百上千个类组成,因此通过把相关类或者接口放在一起的方式使文件变得有条理是很有意义的。

Java平台提供了数量巨大的适合在你程序中使用的类库(一组包的集合)。这个库就是大家所熟知的应用编程接口(Application programming Interface),简称API。在编程目的(purpose)来看,包一般体现的是它的使命。比如,String对象包含字符串的状态和行为;在文件系统中,File对象可以使开发人员简化创建,删除,对比,修改文件操作;Socket对象允许操作和创建网络套接字;UGI对象控制GUI组件,如按钮,复选框。API有许多类可供选择,这允许编程者只关注应用的需求设计而不是使应用程序起作用的基础设施。

Java平台API规范包含了完整的接口、类、字段、方法列表。这些将是最重要的参考文档之一。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值