Java官方教程翻译系列(一)(2020.12.14更)
日期: 2020-12-13 分类: 跨站数据测试 412次阅读
面向对象编程概念
对象 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可带来许多好处,包括
- 模块化:可以独立于其它对象的源代码编写和维护该对象的源代码。创建对象后,可以轻松地在系统内部传递对象。
- 信息隐藏:仅通过methods与对象进行交互,其内部实现的细节仍对外部隐藏。
- 如果某个object已经存在(或许由其他开发人员编写),你可以在你的程序中使用该对象。这使得可以由专员实现/测试/调试特定的复杂对象,然后你可以放心地使用它们。
- 可插拔性和调试简便性:如果一个特定的object有问题,则只需将其从应用程序中移除,然后替换为另一个即可。这类似于现实世界中的机械问题,如果螺栓断裂,仅需替换螺栓即可。
类 class
A class 是创建对象的蓝图或者原型。本节定义了 a class 用于对实际对象的state和behavior进行建模。它特意注重基础知识,展示一个简单的class是怎样清晰地建模state和behavior。
在现实世界中,你经常会发现许多同类的object。可能有成千上万的自行车,都有相同的品牌和型号。每辆自行车都是根据相同的蓝图制造的,所以包含相同的组件。在面向对象的术语中,我们把你的自行车称为自行车类的一个实例。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中其它类的责任。
这是一个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。在浏览器中加载它并添加书签。作为程序员,他将作为你最重要的参考文档。
练一练
- Real-world objects contain ___ and ___.
- A software object’s state is stored in ___.
- A software object’s behavior is exposed through ___.
- Hiding internal data from the outside world, and accessing it only through publicly exposed methods is known as data ___.
- A blueprint for a software object is called a ___.
- Common behavior can be defined in a ___ and inherited into a ___ using the ___ keyword.
- A collection of methods with no implementation is called an ___.
- A namespace that organizes classes and interfaces by functionality is called a ___.
- The term API stands for ___?
答案
说明
本文是橙子出于兴趣爱好对Java官方教程的尝试翻译,会利用闲暇时间不定期更新,感兴趣的朋友可以关注一下橙子,翻译过程中尽量的对一些关键词保留了英文原文,欢迎大家留言讨论
年轻人不要不讲武德,进来了点个赞再走啊!
除特别声明,本站所有文章均为原创,如需转载请以超级链接形式注明出处:SmartCat's Blog
上一篇: 用pygame做一个简单的python小游戏---七彩同心圆
下一篇: 第一次总结
精华推荐