【译】Java8官方教程(二):面向对象编程的概念

原文地址:docs.oracle.com/javase/tuto…html

课程:面向对象编程的概念

若是你以前从未使用过面向对象编程语言,在编写代码前你将须要学习一些基本的概念。这个课程将介绍对象(Object),类(Class),继承(inheritance),接口(interface)和包(packages)。讨论的重点在于这些概念如何与现实世界相关联,同时介绍了Java编程语言的语法。java

  • 何为对象?
  • 何为类?
  • 何为继承?
  • 何为接口?
  • 何为包?

何为对象(Object)?

对象是理解面向对象技术的关键。环顾四周,你会发现不少现实世界中的对象:小狗,桌子,电视机,自行车。 现实世界中的对象具备两个特征:它们都拥有状态和行为。小狗具体状态(名字,毛色,品种,饥饿情况)和行为(吠叫,挑逗,摇尾巴)。自行车也拥有状态(当前的齿轮,当前的踏板节奏、当前的速度)和行为(换齿轮,刹车,提速)。经过识别真实对象的状态和行为来学习面向对象编程不失为一种很好的方法。
如今就花一分钟观察一下你周围的现实世界,对于你看的到全部对象,问本身两个问题:这个对象可能处于什么状态?这个对象可能执行什么行为。必定要写下你的观察结果。你会注意到现实世界中的对象是很是复杂的;你的桌灯可能仅有两种状态(开和关)和两种行为(开灯和关灯),可是你的桌面收音机可能有更多的状态(开、关、当前音量、当前频段)和行为(开机,关机,增大音量,减少音量,调频等等)。你还可能注意到,有些对象甚至还包含其余对象。如今将这些现实世界的观察都转化为面向对象编程的世界。程序员

 

软件对象在概念上相似于现实世界中的对象:它们都由状态和相关的行为组成。一个对象将它自身的状态存储在字段(fields)中(在一些语言中称之为变量),并经过方法(methods)公开其行为(一些语言中称之为函数)。
方法操做对象的内部状态,并做为对象到对象通讯的主要机制。隐藏内部状态并要求全部交互都经过对象的方法来执行,这就是所谓的数据封装--面向对象编程的基本原则 举个关于自行车的例子:

 

 

经过指定状态(当前速度、当前齿轮型号等)并提供更改该状态的方法,对象仍然控制着外部世界如何使用它。举个例子:若是自行车仅有6个齿轮,改变齿轮的方法将拒绝任何小于1或者大于6的值。
将代码捆绑到单个软件对象中提供了许多好处,其中包括:

 

  • 模块性:对象的源代码能够独立于其余对象的源代码来编写和维护,一旦建立了对象,就能够在系统中轻松地传递对象
  • 封装性:经过只与对象的方法交互,其内部实现的细节对外部世界仍然是隐藏的
  • 代码易复用:若是已经存在一个对象(多是其它开发人员编写的),则能够在你本身的程序中使用它。 这容许技术专家实现/测试/调试复杂的、特定任务的对象,而后您能够信任这些对象在您本身的代码中运行
  • 插件化并易于调试:若是某个特定对象出现问题,你能够方便的在应用中移除并用另外的对象来替代。这相似于解决现实世界中的机械问题,若是一个螺栓坏了,你仅须要更换螺栓,而不是整个机器

何为类(Class)?

在真实世界中,你会发觉许多独立的对象属于同一种类。世界上可能还有成千上万辆自行车,它们的制造工艺和模型都同样。每辆自行车都是由一套相同的蓝图建造而成,所以包含相同的组件。从面向对象的角度出发:咱们认为自行车是自行车类的一个实例对象,类是建立单个对象的蓝图。编程

下面的自行车类是自行车的一种可能实现:api

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等)定义了它与外部世界的交互。
你可能注意到这个自行车类没有包含主方法。这是由于这不是一个完整的应用程序。建立和使用新自行车对象的职责属于应用程序中的其余类浏览器

下面是一个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();
    }
}
复制代码

这个测试的输出打印出两辆自行车的踏板的节奏、速度和齿轮:oracle

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

何为继承?

不一样的对象每每有相同的组成部分。例如,山地自行车、公路自行车和双人自行车都具备自行车的特性(当前的速度、当前的踏板节奏、当前的齿轮)。然而各自又拥有不一样的附加特性:socket

  • 双人自行车有两个座位和两组车把
  • 公路自行车有落地式车把
  • 一些山地自行车有一个额外的链环,给他们一个较低的传动比 、

面向对象编程容许类从其余类继承通用的状态和行为,在这个例子中,自行车成为了山地车、公路自行车和双人自行车的父类。在Java编程语言中,全部的类只容许有一个直接父类,而父类能够有无限的子类:

 

这个语法建立了一个简单的子类,在类声明的开头,使用extends关键字,后面指明要继承的类的名称

 

class MountainBike extends Bicycle {

    // new fields and methods defining 

}
复制代码

这赋予了山地车与自行车相同的字段和方法,同时容许它的代码只关注其自身独一无二的特性。这使得子类更易阅读。然而,你必须注意在父类中定义的的字段和方法,由于这部分代码不会出如今子类的源文件中

何为接口?

正如您已经了解到的,对象经过它们公开的方法定义它们与外部世界的交互;例如,电视机前面的按钮是你和塑料外壳另外一边的电线之间的接口。你按下电源键来开关电视机。

在其最多见的形式中,接口是一组没有方法体的相关方法,自行车的行为(若是指定为接口),可能为以下所示

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);
    }
}
复制代码

实现接口容许类对其承诺提供的行为变得更加正式,接口成为类与外部世界之间的契约,编译器在构建时强制执行这个契约。若是某个类声明实现了某个接口,那么该接口定义的全部方法必须出如今其源代码中,而后该类才会成功编译。

注意: 要实际编译ACMEBicycle类,须要在实现的接口方法的开头添加public关键字,其中原因会在以后的课程中讲述。

何为包(Package)?

包是一个命名空间,包含一组相关的类和接口。从概念上讲,您能够认为包相似于计算机上的不一样文件夹。你可能将HTML页面放在一个文件夹,图片放在另一个文件夹,script脚本在另一个。由于Java编程语言编写的软件应用可能包含成千上万个独立的类,将相关的类和接口放在不一样的包中是有意义的。

Java平台提供一个庞大的类库(一组包)供您在本身的应用中使用,称之为API。这些包提供较为通用的功能,例如:String对象包含字符串的状态和行为,File对象容许程序更方便的建立、删除、查阅、比较或修改文件系统中的文件;Socket对象容许建立一个用于网络通讯的socket链接;不一样的GUI对象控制按钮、复选框和任何图形相关的组件。有成千上万的类可供选择。这些保证程序员关注特定应用程序的设计,而不是工做所需的基础设施

“Java平台API规范”包含Java SE平台提供的全部包、接口、类、字段、方法的完整清单。做为一个程序员,在浏览器中加载该页面并将其添加书签,它将成为您最重要的参考文档

相关文章
相关标签/搜索