原文地址:docs.oracle.com/javase/tuto…html
若是你以前从未使用过面向对象编程语言,在编写代码前你将须要学习一些基本的概念。这个课程将介绍对象(Object),类(Class),继承(inheritance),接口(interface)和包(packages)。讨论的重点在于这些概念如何与现实世界相关联,同时介绍了Java编程语言的语法。java
对象是理解面向对象技术的关键。环顾四周,你会发现不少现实世界中的对象:小狗,桌子,电视机,自行车。 现实世界中的对象具备两个特征:它们都拥有状态和行为。小狗具体状态(名字,毛色,品种,饥饿情况)和行为(吠叫,挑逗,摇尾巴)。自行车也拥有状态(当前的齿轮,当前的踏板节奏、当前的速度)和行为(换齿轮,刹车,提速)。经过识别真实对象的状态和行为来学习面向对象编程不失为一种很好的方法。
如今就花一分钟观察一下你周围的现实世界,对于你看的到全部对象,问本身两个问题:这个对象可能处于什么状态?这个对象可能执行什么行为。必定要写下你的观察结果。你会注意到现实世界中的对象是很是复杂的;你的桌灯可能仅有两种状态(开和关)和两种行为(开灯和关灯),可是你的桌面收音机可能有更多的状态(开、关、当前音量、当前频段)和行为(开机,关机,增大音量,减少音量,调频等等)。你还可能注意到,有些对象甚至还包含其余对象。如今将这些现实世界的观察都转化为面向对象编程的世界。程序员
在真实世界中,你会发觉许多独立的对象属于同一种类。世界上可能还有成千上万辆自行车,它们的制造工艺和模型都同样。每辆自行车都是由一套相同的蓝图建造而成,所以包含相同的组件。从面向对象的角度出发:咱们认为自行车是自行车类的一个实例对象,类是建立单个对象的蓝图。编程
下面的自行车类是自行车的一种可能实现: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编程语言中,全部的类只容许有一个直接父类,而父类能够有无限的子类:
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关键字,其中原因会在以后的课程中讲述。
包是一个命名空间,包含一组相关的类和接口。从概念上讲,您能够认为包相似于计算机上的不一样文件夹。你可能将HTML页面放在一个文件夹,图片放在另一个文件夹,script脚本在另一个。由于Java编程语言编写的软件应用可能包含成千上万个独立的类,将相关的类和接口放在不一样的包中是有意义的。
Java平台提供一个庞大的类库(一组包)供您在本身的应用中使用,称之为API。这些包提供较为通用的功能,例如:String对象包含字符串的状态和行为,File对象容许程序更方便的建立、删除、查阅、比较或修改文件系统中的文件;Socket对象容许建立一个用于网络通讯的socket链接;不一样的GUI对象控制按钮、复选框和任何图形相关的组件。有成千上万的类可供选择。这些保证程序员关注特定应用程序的设计,而不是工做所需的基础设施
“Java平台API规范”包含Java SE平台提供的全部包、接口、类、字段、方法的完整清单。做为一个程序员,在浏览器中加载该页面并将其添加书签,它将成为您最重要的参考文档