首页 > 代码库 > (翻译)《一》面向对象编程思想

(翻译)《一》面向对象编程思想

原文 链接:http://docs.oracle.com/javase/tutorial/java/concepts/package.html

前言

如果你还没有接触过面向对象编程,在你动手敲代码之前需要学习一些基本的概念。本节会为你介绍对象、类、继承、接口和包。每一部分的讨论集中在这些概念是如何联系现实世界的。与此同时,还介绍一下java的语法。

什么是对象?

对象表示软件中一系列相关的状态和行为。软件对象被常常用来对日常生活中的真实世界的对象建模。本节将讲解如何在对象中表示状态和行为,介绍数据封装的概念,并解释用这些方法设计你的软件的好处。

什么是类?

类是创建对象的蓝图或原型。本节定义一个类模拟真实世界中对象的状态和行为。这个类着重基础,展示一个简单的类如何清晰的对状态和行为建模。

什么是继承?

继承提供了强大并且自然的机制来组织和构造你的软件。本节解释了类如何从他们的父类中继承状态和行为,以及使用java如何继承一个类。

什么是接口?

接口是一个类与外界的协议。如果一个类实现了一个接口,它必须提供由接口对外发布的行为。本节定义了一个简单的接口,解释一个类要实现它所做的必要修改。

什么是包?

 包是逻辑上组织类和接口的命名空间。把代码放入包中使大型软件易于管理。本节解释为什么使用包有好处,并为你介绍java平台提供的api。

正文

1,什么是对象?

对象是理解面向对象技术的关键。看看周围,你会发现很多对象在真实世界中的例子:你的狗、你的桌子、你的电视机、你的自行车。

真实世界中的对象共有两个特性:他们的状态和行为。狗有状态(名字、颜色、品种、饿否)和行为(叫、抓、摇尾巴)。自行车有状态(当前档位、当前踩踏节奏、当前速率)和行为(换挡、改变踩踏节奏、踩刹车)。辨别真实世界中对象的状态和行为是开始思考面向对象编程的一个非常有效的方法。

现在花一分钟观察你周围真实世界中的对象。对你看到的每个对象问两个问题:这个对象可能处于一个什么状态?和这个对象可能会有什么行为?务必写下你的观察结果。随之,你会发现真实世界中的对象变化无常。你的笔记本电脑可能有两个状态(开机和关机状态)和两个行为(打开电脑、关闭电脑),而你的收音机可能多一些的状态(开、关、音量、频道)和行为(打开、关闭、调大、调小、搜索频道、扫描频道)。你同时还会发现一些对象还包含其他的对象。而面向对象编程就是对这些真实世界中的对象进行解释。

软件中的对象在概念上近似真实世界中的对象:他们都有状态和相关的行为。对象将状态保存在域中(也是软件中的变量),并通过方法暴露其行为。方法操作对象内部的状态并作为服务于对象之间通信的主要机制。隐藏对象内部的状态并要求对象间所有的交互都通过方法执行被称为数据的封装,这也是面向对象编程的基本原则。

比如把自行车作为一个对象:

通过属性状态(当前速度、当前踏频、当前档位)和改变这些状态的方法,外界按照真实世界的方式控制着这些对象。好像自行车一共有6档,改变档位的方法就会拒绝其他的档位。

将代码约束成一个个软件对象会提供如下好处:

1,模块化:根据对象编写的代码可以保持编写和维护的独立。一旦创建,很容易在系统内部传递。

2,隐藏不必要的信息:通过对象的方法对外交互,对外隐藏内部的实现细节。

3,代码复用:如果一个对象已经存在(被其他开发者开发),你可以直接使用。这样专家开发、测试、调试一些复杂、功能化的对象后,你可以在你的代码中直接调用。

4,可插拔和易于调试:如果一个对象出现了问题,你可以简单的移除它并插入一个可以替代的对象。这是模拟解决真实世界中机械方面的问题。如果一个螺丝坏了,你可以替换它,而不是替换整个机器。

2,什么是类?

在真实的世界中,你会发现很多个体属于同一个类型。会有另外一千辆自行车存在,都是使用同样的制作方式和同样的模型。每一辆自行车都是根据相同的蓝图制造,因此有相同的部件。根据面向对象的说法,你的自行车就是自行车这个对象类的一个实例。一个类就是一个蓝图,根据这个蓝图创建每一个个体。

下面这个自行车类就是自行车的一个实现:

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代表自行车的状态,方法(changeSpeed、changeGear等)定义了与外部世界的交互。

你也许注意到自行车类没有包含main方法。因为它并不是一个完整的类。它仅仅是一个应用中可能用到的自行车的设计蓝图。你需要在应用中其他的类中创建和使用一个新的自行车对象。

下面是BicycleDemo类创建两个自行车对象并调用其方法。

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

3,什么是继承?

即使不同类型的对象常常也有一些共性。比如山地自行车、公路自行车、双人自行车统统都有自行车的特征(当前速度、当前档位、当前踏频)。同时又拥有自己的特点:双人自行车有两个座位和两个手把,公路自行车有下沉的手把,山地自行车有额外的链条可以调更低的档位。

面向对象编程允许各个类继承一个类中公共使用的状态和行为。本例中,自行车是山地、公路、双人自行车的父类。在java中,每个类都允许有一个直接父类,而每一个父类不限制有多少个子类。

创建子类的语法很简单。在类的声明中使用extends关键字,后跟父类的名称。

class MountainBike extends Bicycle {

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

}
这使得MountainBike拥有与Bicycle相同的域和方法,就可以让MountainBike关注于其他的特性使它与众不同。这让你的子类易于维护。但是,你要注意注释父类的属性和方法,因为子类是没有显示这些的。

 4,什么是接口?

 就像你已经学到的,对象通过他们暴露的方法定义他们与外界交互的方式。方法对外界构成对象的接口。比如电视机前面的按钮,就是连接你和电视机的接口。你按下开关就会打开或关闭电视机。

通常,接口定义一组相关的方法。如果一个自行车的行为定义成一个接口,应该像下面的样子:

interface Bicycle {

    //  wheel revolutions per minute
    void changeCadence(int newValue);

    void changeGear(int newValue);

    void speedUp(int increment);

    void applyBrakes(int decrement);
}

为了实现这个接口,你要起一个类名(比如一个品牌的自行车,JantBicycle),然后声明类时使用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);
    }
}

实现一个接口让类需要提供的行为看起来更正规。接口在类和外界之间形成协议,而这个协议在编译器工作时会强制执行。如果你的类实现了一个接口,这个接口定义的所有方法必须出现在你的类中,才能让这个类成功编译。

 5,什么是包?

包是组织一系列相关的类和接口的命名空间。理论上,你可以把包当作电脑上一个个文件夹。你会把html文件保存在一个目录,图片一个目录,脚本或应用一个目录。因为一个java编写的软件可能有成百上千个类组成,所以为了便于管理,将相关的类和接口放入对应包中。

java平台提供了大量的库类套件让你在应用中使用,这些库类称为api。他们的包完成了平日编程中绝大部分公共的任务。比如一个String对象包含字符串的状态和行为,一个文件对象让程序员很容易创建、删除、检查、比较、修改文件系统中的文件,一个socket对象可以创建和使用网络套接字,大量的gui对象控制着按钮、勾选框和其他一些图形用户接口。简直有上千的类可以选择。这就让你可以关注于你的应用,而不是一些底层的基础建设。

 

(翻译)《一》面向对象编程思想