您的位置 首页 java

Java8官方教程(二):面向对象编程的概念

课程:面向对象编程的概念

如果你之前从未使用过面向对象编程语言,在编写代码前你将需要学习一些基本的概念。这个课程将介绍对象(Object),类(Class),继承(inheritance),接口(interface)和包(packages)。讨论的重点在于这些概念如何与现实世界相关联,同时介绍了Java编程语言的语法。

  • 何为对象?
  • 何为类?
  • 何为继承?
  • 何为接口?
  • 何为包?

何为对象(Object)?

对象是理解面向对象技术的关键。环顾四周,你会发现很多现实世界中的对象:小狗,桌子,电视机,自行车。 现实世界中的对象具有两个特征:它们都拥有状态和行为。小狗具体状态(名字,毛色,品种,饥饿状况)和行为(吠叫,挑逗,摇尾巴)。自行车也拥有状态(当前的齿轮,当前的踏板节奏、当前的速度)和行为(换齿轮,刹车,提速)。通过识别真实对象的状态和行为来学习面向对象编程不失为一种很好的方法。

现在就花一分钟观察一下你周围的现实世界,对于你看的到所有对象,问自己两个问题:这个对象可能处于什么状态?这个对象可能执行什么行为。一定要写下你的观察结果。你会注意到现实世界中的对象是非常复杂的;你的桌灯可能仅有两种状态(开和关)和两种行为(开灯和关灯),但是你的桌面收音机可能有更多的状态(开、关、当前音量、当前频段)和行为(开机,关机,增大音量,减小音量,调频等等)。你还可能注意到,有些对象甚至还包含其他对象。现在将这些现实世界的观察都转化为面向对象编程的世界。

软件对象在概念上类似于现实世界中的对象:它们都由状态和相关的行为组成。一个对象将它自身的状态存储在字段(fields)中(在一些语言中称之为变量),并通过方法(methods)公开其行为(一些语言中称之为函数)。

方法操作对象的内部状态,并作为对象到对象通信的主要机制。隐藏内部状态并要求所有交互都通过对象的方法来执行,这就是所谓的数据封装–面向对象编程的基本原则 举个关于自行车的例子:

通过指定状态(当前速度、当前齿轮型号等)并提供更改该状态的方法,对象仍然控制着外部世界如何使用它。举个例子:如果自行车仅有6个齿轮,改变齿轮的方法将拒绝任何小于1或者大于6的值。

将代码捆绑到单个软件对象中提供了许多好处,其中包括:

  • 模块性:对象的源代码可以独立于其他对象的源代码来编写和维护,一旦创建了对象,就可以在系统中轻松地传递对象
  • 封装性:通过只与对象的方法交互,其内部实现的细节对外部世界仍然是隐藏的
  • 代码易复用:如果已经存在一个对象(可能是其它开发人员编写的),则可以在你自己的程序中使用它。 这允许技术专家实现/测试/调试复杂的、特定任务的对象,然后您可以信任这些对象在您自己的代码中运行
  • 插件化并易于调试:如果某个特定对象出现问题,你可以方便的在应用中移除并用另外的对象来替代。这类似于解决现实世界中的机械问题,如果一个螺栓坏了,你仅需要更换螺栓,而不是整个机器

何为类(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编程语言的语法对于您来说可能略显生涩,但是这个类的设计是基于前面对自行车对象的讨论得来的。 字段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();
 }
}
复制代码
 

这个测试的输出打印出两辆自行车的踏板的节奏、速度和齿轮:

cadence:50 speed:10 gear:2

cadence:40 speed:20 gear:3

何为继承?

不同的对象往往有相同的组成部分。例如,山地自行车、 公路自行车 双人自行车 都具有自行车的特性(当前的速度、当前的踏板节奏、当前的齿轮)。然而各自又拥有不同的附加特性:

  • 双人自行车有两个座位和两组车把
  • 公路自行车有落地式车把
  • 一些山地自行车有一个额外的链环,给他们一个较低的传动比 、

面向对象编程允许类从其他类继承通用的状态和行为,在这个例子中,自行车成为了山地车、公路自行车和双人自行车的父类。在Java编程语言中,所有的类只允许有一个直接父类,而父类可以有无限的子类:

这个语法创建了一个简单的子类,在类声明的开头,使用extends关键字,后面指明要继承的类的名称

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);
 }
}
复制代码
 

实现接口允许类对其承诺提供的行为变得更加正式,接口成为类与外部世界之间的契约,编译器在构建时强制执行这个契约。如果某个类声明实现了某个接口,那么该接口定义的所有方法必须出现在其源代码中,然后该类才会成功编译。

何为包(Package)?

包是一个命名空间,包含一组相关的类和接口。从概念上讲,您可以认为包类似于计算机上的不同文件夹。你可能将HTML页面放在一个文件夹,图片放在另外一个文件夹,script脚本在另外一个。因为Java编程语言编写的软件应用可能包含成千上万个独立的类,将相关的类和接口放在不同的包中是有意义的。

Java平台提供一个庞大的类库(一组包)供您在自己的应用中使用,称之为API。这些包提供较为通用的功能,例如:String对象包含字符串的状态和行为,File对象允许程序更方便的创建、删除、查阅、比较或修改文件系统中的文件;Socket对象允许创建一个用于网络通信的socket连接;不同的GUI对象控制按钮、复选框和任何图形相关的组件。有成千上万的类可供选择。这些保证程序员关注特定应用程序的设计,而不是工作所需的基础设施

“Java平台API规范”包含Java SE平台提供的所有包、接口、类、字段、方法的完整清单。作为一个程序员,在浏览器中加载该页面并将其添加书签,它将成为您最重要的参考文档

文章来源:智云一二三科技

文章标题:Java8官方教程(二):面向对象编程的概念

文章地址:https://www.zhihuclub.com/183763.shtml

关于作者: 智云科技

热门文章

网站地图