Java官方教程(一)面向对象编程概念(2020.12.15)

前言

本文是橙子出于兴趣爱好对Java官方教程的尝试翻译,几乎每日更新,感兴趣的朋友可以关注一下橙子;翻译过程中尽可能多的对一些关键词保留了英文原文,如果你想看最纯正的英文原版教材却又看不懂,可以试着来看一下橙子的翻译版啊,欢迎大家留言讨论,冲鸭!
更多相关文章点击阅读
Java官方教程目录2020最新版

面向对象编程概念

对象 object

An object是具有相关state和behavior的软件。Software objects通常用于对你在日常生活中发现的现实世界对象的建模。本课程将说明state和behavior如何在对象中表示,并说明这样设计软件的好处。

Object是理解面向对象技术的关键。现在环顾四周,你会发现许多现实世界中object的示例:你的狗,书桌,电视机和自行车。

现实世界中的object有两个特征:它们都有state和behavior。狗具有state(name, color, breed, hungry)和behavior(braking, fetching, wagging tail)。自行车也具有state(current gear, current pedal cadence, current speed)和behavior(changing gear, changing pedal, applying breaks)。识别现实世界的state和behavior是深入理解面向对象的好方法。

现在花一分钟时间观察你附近区域的真实对象。对于你看到的每一个对象,问自己两个问题:”该对象可能处于什么状态?“和”该对象可以执行什么行为?“ 写下你的观察结果。在执行操作的过程中你会发现真实对象的复杂度各不相同。你的台灯只有两种可能的state(on and off),和两种可能的behavior(turn on and turn off)。但是你的收音机可能有其他的state(on, off, current volume, current station)和behavior(turn on, turn off, increase volume, decrease volume, seek, scan, and tune)。你可能还会注意到,某些objects又将包含其他objects。这些真实的观察结果都将转化为面向对象编程的世界。
在这里插入图片描述
Software objects在概念上与现实世界中的objects相似。它们也有state和related behavior 。An object 将其state储存在fields中(一些编程语言中的variables),并通过methods(一些编程语言中的functions)暴露其behavior。Methords在对象的内部状态上运行,并作为objects间通信的主要机制。隐藏内部state并要求通过objects间的methods执行所有的交互被称为encapsulation(封装) — 一个面向对象编程的基本概念。
在这里插入图片描述
通过把state(current speed, current pedal, and current gear)分类和提供改变state的methords,the object 可以控制外部如何使用它。例如,如果自行车有6个挡位,则更改挡位的方法可能会拒绝小于1或大于6的其它值。

将代码绑定到独立的software objects可带来许多好处,包括

  1. 模块化:可以独立于其它object的源代码编写和维护该object的源代码。创建object后,可以轻松地在系统内部传递object。
  2. 信息隐藏:仅通过methods与object进行交互,其内部实现的细节仍对外部隐藏。
  3. 如果某个object已经存在(或许由其他开发人员编写),你可以在你的程序中使用该object。这使得可以由专员实现/测试/调试特定的复杂对象,然后你可以放心地使用它们。
  4. 可插拔性和调试简便性:如果一个特定的object有问题,则只需将其从应用程序中移除,然后替换为另一个即可。这类似于现实世界中的机械问题,如果螺栓断裂,仅需替换螺栓即可。

类 class

A class 是创建对象的蓝图或者原型。本节定义了 a class 用于对实际对象的state和behavior进行建模。它特意注重基础知识,展示一个简单的class是怎样清晰地建模state和behavior。

在现实世界中,你经常会发现许多同类的object。可能有成千上万的自行车,都有相同的品牌和型号。每辆自行车都是根据相同的蓝图制造的,所以包含相同的组件。在面向对象的术语中,我们把你的自行车称为自行车类的一个实例(instance )。A class 是创建individual objects的蓝图。

以下Bicycle class 是自行车的一种可能的实现:

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语法对你来说可能很新,但是这个class的设计是基于之前对自行车对象的讨论。The fields cadence, speed, and gear 代表对象的state, the methods(changeCadence, changeGear, speedUp etc.)定义了对象与外界的交互。

你可能注意到Bicycle class不包含mian 方法。那是因为它不是一个完整的application, 它只是application中可能用到的bicycle的蓝图。创建和使用Bicycle objects是application中其它class的责任。

这是一个BicycleDemo class,它创建了两个单独的Bicycle objects并调用它们的方法。

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

测试的输出显示两辆自行车的pedal cadence, speed, and gear。

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

继承 inheritance

继承为组织和构造软件提供了强大而自然的机制。本节解释了class 如何从其superclass继承state和behavior,并说明了如何使用Java编程语言提供的简单语法从一个class派生(derive)另一个class。

不同种类的objects通常彼此之间有一定数量的共同点。例如,山地自行车,公路自行车和双人自行车都具有自行车的特征(current speed, current pedal cadence, current gear)。然而每一种自行车还定义了使其与众不同的功能:双人自行车有两个座位和把手;公路自行车有下降的车把;一些山地自行车有额外的链条,使它们的变速比更低。

面向对象编程允许classes 从其他classes inherit 常用的state and behavior。在示例中,Bicycle成为MountainBike, RoadBike, TandemBike的superclass。在Java中,每一个class允许有一个 direct superclass;每一个superclass可以有无限的subclass。
在这里插入图片描述
创建subclass的语法很简单。在class声明(declaration)的开头,使用extends关键字,后跟要继承的class的名称:

class MountainBike extends Bicycle {
    
    

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

}

这使MountainBike有了所有Bicycle的feilds and methods,同时允许代码专注于其特殊功能。这使得subclass代码更容易阅读。但是你必须关注每个superclass中定义的state and behavior,因为该代码不会出现在每个subclass的源代码中。

接口 interface

interface是class和外界的契约。当a class实现a interface时,它承诺提供该接口发布的behavior。本节定义了一个简单的interface并且说明了实现该interface的任何class的必要改变。

正如你已经了解的那样,对象通过暴露的methods定义它们与外界的交互。Methods形成objects与外界的interface;例如,电视前面的按钮是你与塑料外壳另一侧电线之间交互的interface。你可以通过“power”键来开关电视。通常,interface是一组没有方法体的related methods。如果为自行车的behavior设计一个interface,可能如下所示:

interface Bicycle {
    
    

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

    void changeGear(int newValue);

    void speedUp(int increment);

    void applyBrakes(int decrement);
}

要实现此接口,class的名字必须改变(例如,改为一个特定品牌的bicycle),并在class declaration中使用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);
    }
}

Implementing an interface使得class提供的behavior更为正式。Interface在class和外部世界之间形成契约,该契约在编译时由编译器强制执行。如果a class 声称要implement an interface,则要想成功编译,该interface中定义的所有methods必须出现在其源代码中。

Note:要实际编译ACMEBicycle class,你必须在已实现接口方法开头添加public关键字。

包 package

包是逻辑上的组织class和interface的命名空间。将你的代码放入包里使得大型软件项目更易于管理。本节说明了这样做的好处,并向您介绍Java平台提供的应用程序编程接口(API)。

package是一个namespace,用于组织一组related classes and interface。从概念上,你可以把packages类比为计算机上不同的文件夹。你可以将html页面保存在一个文件夹,图片保存在一个,scripts或者application保存在另一个。因为Java project可以由成百上千个独立的class组成,所以将相关的classes和interfaces放入packages是有意义的。

Java平台提供了一组庞大的class library( a set of packages)去方便使用,该class library 被称为’'Application Programming Interface",简称“API”。它的packages代表了常用的内容。例如,a String object 包含字符串的state和behavior;a File object可以使程序员轻松地创建,删除,检查,比较或修改文件系统上的文件。A Socket object允许创建和使用网络套接字(sockets);各种GUI objects控制按钮和复选框以及其它与图形用户界面相关的内同。有数千种classes可以选择,这使得程序员可以专注于特定appliaction的设计,而不是使其工作的基础结构。

The Java Platform API Specification包含Java SE平台提供的所有packages, interface, classes, fields, and methods。在浏览器中加载它并添加书签。作为程序员,他将作为你最重要的参考文档。

练一练

  1. Real-world objects contain ___ and ___.
  2. A software object’s state is stored in ___.
  3. A software object’s behavior is exposed through ___.
  4. Hiding internal data from the outside world, and accessing it only through publicly exposed methods is known as data ___.
  5. A blueprint for a software object is called a ___.
  6. Common behavior can be defined in a ___ and inherited into a ___ using the ___ keyword.
  7. A collection of methods with no implementation is called an ___.
  8. A namespace that organizes classes and interfaces by functionality is called a ___.
  9. The term API stands for ___?

答案
在这里插入图片描述

年轻人不要不讲武德,进来了点个赞再走啊!

猜你喜欢

转载自blog.csdn.net/weixin_42509923/article/details/111084917
今日推荐