若是你之前从未使用过面向对象的编程语言,那么在开始编写任何代码以前,你须要学习一些基本概念,本课将向你介绍对象、类、继承、接口和包,每一个讨论都关注这些概念如何与现实世界相关,同时介绍Java编程语言的语法。html
对象是理解面向对象技术的关键,环顾四周,你会发现许多现实世界中的东西:你的狗,你的桌子,你的电视机,你的自行车。java
真实世界的对象有两个特征:它们都有状态和行为,狗有状态(名字,颜色,品种,饥饿)和行为(吠叫,挑逗,摇尾巴),自行车也有状态(当前齿轮,当前踏板节奏,当前速度)和行为(换档,改变踏板节奏,踩刹车),识别真实对象的状态和行为是开始考虑面向对象编程的好方法。程序员
如今花一分钟观察你周围的真实世界,对于你看到的每个物体,问本身两个问题:“这个对象可能处于什么状态?”和“这个对象可能执行什么行为?”,必定要写下你的观察结果,正如你所作的,你会注意到现实世界中的对象在复杂性上是不一样的;你的台灯可能只有两个可能的状态(打开和关闭)和两个可能的行为(打开和关闭),可是你的桌面收音机可能有其余状态(打开、关闭、当前音量、当前站)和行为(打开、关闭、增长音量、减小音量、查找、扫描和调优)。你可能还注意到,一些对象反过来也将包含其余对象,这些实际的观察结果都转化为面向对象编程的世界。编程
软件对象在概念上与真实世界的对象类似:它们也包括状态和相关的行为,对象将其状态存储在字段中(某些编程语言中的变量),并经过方法(某些编程语言中的函数)公开其行为,方法对对象的内部状态进行操做,并做为对象到对象通讯的主要机制,隐藏内部状态并要求经过对象的方法执行全部交互称为数据封装 — 面向对象编程的基本原则。segmentfault
以自行车为例:api
经过归因于状态(当前速度,当前踏板节奏和当前档位)并提供改变该状态的方法,该对象仍然控制外部世界如何被容许使用它,例如,若是自行车仅具备6个档位,则换档的方法能够拒绝小于1或大于6的任何值。浏览器
将代码打包到单独的软件对象中能够带来不少好处,包括:网络
在现实世界中,你常常会发现许多单独的物体都是同样的,可能还有成千上万的其余自行车存在,全部的制造和模型都是同样的,每一辆自行车都是用一样一套蓝图建造的,所以包含了一样的部件,在面向对象的术语中,咱们说你的自行车是称为自行车的对象类的实例,类是建立单个对象的蓝图。oracle
下面的Bicycle
类是自行车的一种可能实现:app
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
等)定义了它与外部世界的交互。
你可能已经注意到,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
,speed
和gear
:
cadence:50 speed:10 gear:2 cadence:40 speed:20 gear:3
不一样种类的物体之间每每有必定的共同之处,例如山地自行车、公路自行车和双人自行车,都有自行车的特色(目前的速度,目前的踏板节奏,目前的档位),然而,每一个还定义了使它们不一样的其余功能:双人自行车有两个座位和两套车把;公路自行车有弯车把;一些山地自行车有一个额外的链环,使它们的齿轮比更低。
面向对象编程容许类从其余类继承共同的状态和行为,在这个例子中,Bicycle
如今成为了MountainBike
、RoadBike
和TandemBike
的超类,在Java编程语言中,每一个类都容许有一个直接的超类,每一个超类均可能有无限数量的子类:
建立子类的语法很简单,在类声明的开头,使用extend
关键字,后跟要继承的类的名称:
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
对象容许建立和使用网络sockets;各类GUI对象控制按钮和复选框以及与图形用户界面相关的任何其余内容。实际上有成千上万个类可供选择,这容许程序员关注特定应用程序的设计,而不是使其工做所需的基础设施。
Java平台API规范包含Java SE平台提供的全部包、接口、类、字段和方法的完整清单,在浏览器中加载该页面并将其添加到书签,做为程序员,它将成为你最重要的参考文档。