原文链接:http://docs.oracle.com/javase/tutorial/java/concepts/index.html
什么是对象?
对象是理解面向对象技术的关键。现在看看你的周围你会发现很多现实世界中对象的例子:你的狗,你的桌子,你的电视机,你的自行车。
现实世界中的对象有两个特点:他们都有状态和行为。狗狗的状态(名字,颜色,品种,饥饿)和行为(叫,抓取,摇尾巴)。自行车也有状态(当前档位,当前踏板节奏,当前速度)和行为(改变档位,改变踏板节奏,刹车)。识别现实世界对象的状态和行为是开始面向对象编程思考的好方法。
现在花一点时间来观察你周围的对象。对你看到的每个对象,问自己两个问题:“这个对象可能有什么状态?”和“这个对象可能有什么行为”。确认并写下你的见解。当你这样做了,你会注意到现实世界中的对象在复杂性上有所不同。你的台灯可能只有两种状态(开和关)和两种行为(打开和关闭),但你的收音机可能有其它的状态(开、关、当前音量、当前频道)和行为(打开、关闭、提高音量、降低音量,查找,浏览,调)。你还可能会注意到,一些对象反过来也将包含其他对象。这些在现实世界中的观察就可转化为面向对象编程的思想。
软件对象在概念上类似于现实世界的对象:它们也包括状态和行为。一个对象将其状态存储在字段中(一些编程语言中的变量)并且通过方法(一些编程语言中的方法)展示其行为。方法对对象内部状态进行操作并作为对象与对象通信的主要机制。隐藏内部状态并要求通过对象的方法执行所有交互被称为数据封装——面向对象编程的基本原理
以自行车为例:
通过归纳状态(当前速度,当前踏板速度和当前档位)和提供改变状态的方法,对象仍然可以控制外部如何使用它。例如:如果自行车只有6档,那么改变齿轮的方法可以拒绝小于1或大于6的任何值。
将代码绑定到单个对象有很多好处,包括:
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类没有包含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();
}
}
该测试输出两辆自行车最终的踏板节奏,速度,和档位。cadence:50 speed:10 gear:2
cadence:40 speed:20 gear:3
什么是继承?
不同类型的对象通常有一定量的重复。例如,山地自行车,公路自行车和双人自行车都具有自行车的特点(当前速度,当前踏板节奏,当前档位),当然每个都定义了不同的附加特征:双人自行车有两个座位和两套车把;公路自行车有低的车把;一些山地自行车有一个额外的链环,给他们较低的档位。
面向对象编程允许类继承其它类的常用状态和方法,在这个例子中。Bicycle现在是MountainBike,RoadBike和TandemBike的父类.在Java编程语言中,每个类允许有一个直接父类,每个父类具有无限的子类。
创建子类的语法很简单。在开始声明类的时候,用extends关键字,后面跟着继承的类的名称:
class MountainBike extends Bicycle {
// new fields and methods defining
// a mountain bike would go here
}
这样就使MountainBike具有了Bicycle所有的属性和方法,使其代码只专注于其独特的特征。这会使你的子类更易读。但是,您必须注意正确记录每个超类定义的状态和方法,因为该代码不会出现在每个子类的源文件中。什么是接口?
就像你已经学到的,对象通过他们公开的方法来定义与外部世界的交互。方法形成对象与外界的接口;比如电视机前的按钮,就是你和塑料壳另一面的线路之间的接口,你按“电源”按钮来开或关闭电视机。
在最常见的形式中,接口是一组相关联的空方法。自行车的行为如果定义为接口,可能展示如下:
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关键字,稍后您可以在“”类和对象“”和“”接口和继承“”的课程中了解原因。
什么是包?
一个包是组合一组相关类和接口的命名空间,从概念上,你可以理解包就像你电脑上的不同的文件夹。你可能把HTML文件放在一个文件夹,图片在另一个文件夹,脚本和应用程序又在其它文件夹。由于用Java编程语言编写的软件可能由数百或数千个单独的类组成,所以通过将相关的类和接口放入包中来管理是非常有意义的。
Java平台提供了一个适用于您自己的应用程序的庞大的类库(一组包)。这个库被称为“应用程序编程接口”或简称为“API”。这些包代表了与通用编程相关的任务。例如,String对象包含字符串的状态和行为; File对象使程序员轻松创建,删除,检查,比较或修改文件系统上的文件; Socket对象允许创建和使用网络套接字;各种GUI对象控制按钮和复选框以及与图形用户界面相关的内容。有几千个类可供选择。这使你、使程序员能更专注于特定应用程序的设计,而不是将精力放在使程序能运行所需的基础架构上。
Java Platform API规范包含Java SE平台提供的所有软件包,接口,类,字段和方法的完整列表。将页面加载到浏览器并将其加入书签。作为程序员,它将成为您最重要的参考文献文档。