入门
浏览 入门 主题: ) |
我们用系统的概念来理解我们周围的世界。一个 系统 是一个相互连接的物体网络,它们协同工作。在 系统理论 中,一个系统被设定为一个被环境包围的世界中的一个单一实体。一个系统通过两种不同类型的消息与其周围的环境进行交互
- 输入:从周围环境接收到的消息;以及,
- 输出:反馈给周围环境的消息。
图 1:一个简单的系统通过输入和输出消息与其环境进行交互。
|
生命是一个复杂而混乱的相互连接的物体,它们发送信号和消息。请参阅下图 2 中的示例,该示例展示了单一公司经济生态圈的复杂系统。想象一下,如果要添加更多公司及其子系统,这个系统图会是什么样子。通常,计算机软件系统是更复杂相互连接的 子系统 的网络 - 其中每个子系统可能会被进一步划分为子系统,也可能不会被进一步划分。每个子系统使用 反馈 消息(即输入 和输出)与其他子系统进行通信。
图 2:具有多个子系统和交互的复杂系统的示例
|
编程本质上是将现实生活中的问题的解决方案视为一个系统。使用任何编程语言,您都需要了解如何将现实生活中的问题转化为可以在计算机系统中准确表示的内容。为了开始使用 Java 编程语言进行编程(或者实际上,使用任何编程语言),程序员首先必须了解抽象的基础知识。
抽象 是将现实生活中的问题和物体表示 为程序的过程。
假设一位小说家、一位画家和一位程序员被要求在他们的作品中抽象(即,表示)一个现实生活中的物体。假设,需要被抽象的现实生活中的物体是一种动物。对于小说家来说,抽象包括写下动物的描述,而画家会画出动物的图片 - 但是计算机程序员呢?
Java 编程语言使用一种称为 面向对象编程 (OOP) 的编程范式,它准确地展示了程序员需要做什么。根据 OOP,现实生活中的每个物体或问题都可以转换为计算机系统中的虚拟物体。
在 OOP 中,现实生活中的每个物体的抽象在您的代码中被称为 对象。对象本质上是现实生活中的物体作为计算机系统的一部分的最基本表示。由于 Java 是一种面向对象的语言,Java 中的一切都用对象来表示。为了演示这种效果,如果您要定义动物的抽象,您将编写以下代码行(就像您对任何其他抽象所做的那样)
class Animal { }
|
上面的代码在您的代码中创建了一个空间,您可以在其中开始定义 对象;这个空间称为 类(或类型)定义。所有对象都需要使用类定义来定义,以便它们可以在程序中使用。请注意花括号 - 您在这些括号中写入的任何内容都将作为您对象的定义或规范。在上面的示例中,我们创建了一个名为 Animal
的类定义,用于可以作为现实生活中任何动物的抽象表示的对象。Java 环境将此代码评估为类定义的方式是查看我们用来开始类定义的前缀词(即,class
)。Java 语言中这样的预定义词被称为 关键字,它们构成了语言的语法(称为 编程语法)。
亚里士多德 可能是第一个想到对象抽象类型或类型的。他开始称它们为类 - 例如,鸟类,哺乳动物。因此,类定义很好地用于定义您将要创建的对象的共同特征或类型。在声明类定义后,您可以根据该定义创建对象。但是,要做到这一点,您需要编写一个特殊的语法,如下所示
Animal dog = new Animal();
|
上面的代码实际上创建了一个名为 dog
的对象,它基于 Animal
的类定义。用非程序员的话来说,上面的代码可以翻译成类似“创建一个名为 dog
的 Animal
类型的对象”。一个类定义可以让你创建多个对象,如下面的代码所示
Animal dog = new Animal();
Animal cat = new Animal();
Animal camel = new Animal();
|
基本上,您只需编写一次类或类型定义的代码,然后使用它根据该规范创建无数个对象。尽管您可能无法理解这样做的重要性,但这个小小的练习可以节省您大量时间(这是在 Java 时代之前,程序员无法轻易获得的奢侈品)。
虽然你从一个类定义中创建的每个对象本质上都是一样的,但必须有一种方法可以在你的代码中区分这些对象。对象字段(或简称为**字段**)使你的对象与其他对象区别开来。让我们以我们现在的抽象为例。动物可以是狗、猫、骆驼或鸭子,但由于这种抽象非常通用,你需要定义一些对所有这些动物都通用的字段,但又使这些动物彼此区别开来。例如,你可以有两个字段:**name**(给这些动物中的任何一个的通用名称)和**legs**(这些动物中的任何一个行走所需的肢体数量)。当您开始定义您的对象时,它们会开始看起来像这样
class Animal {
String name;
int legs;
}
|
在上面的代码中,你定义了两个对象字段
- 一个名为
name
的字段,类型为String
;以及 - 一个名为
legs
的字段,类型为int
。
这些特殊的预定义类型称为**数据类型**。String
数据类型用于可以保存文本值的字段,例如名称,而int
(整数)数据类型用于可以保存数值值的字段
**图 3:**为了将
Animal 对象表示为 Java 环境中的一个系统,你将其表示为这样。请注意字段是如何呈现的。 |
为了演示字段是如何工作的,我们将继续从这个经过修改的类定义版本中创建对象,如下所示
Animal animal1 = new Animal();
Animal animal2 = new Animal();
animal1.name = "dog";
animal1.legs = 4;
animal2.name = "duck";
animal2.legs = 2;
|
你可以使用.
(点)或**成员运算符**访问你创建的对象的字段。在上面的示例中,我们创建了两个类型的Animal
对象:animal1
和animal2
。而且由于我们已经确定每个Animal
都有两个字段,分别是name
和legs
,我们使用成员运算符访问和修改了每个对象的这些字段,以将它们区分开来。通过为不同的对象声明不同的值,我们可以操纵它们当前的**状态**。因此,例如
animal1
对象是"dog"
,有4
条腿可以用来走路;而animal2
对象是"duck"
,有2
条腿可以用来走路。
将这两个对象区分开来的就是它们当前的状态。这两个对象具有不同的状态,因此即使它们是从同一个模板或类定义中创建的,它们也仍然是两个不同的对象。
为对象添加行为
[edit | edit source]此时,你的对象除了声明一堆字段外,什么也不做。作为一个系统,你的对象应该能够与其环境和其他系统交互。为了为交互添加这种能力,你需要在你的对象类定义中添加交互行为。这种行为是使用称为**方法**的编程结构添加到类定义中的。
在Animal
的情况下,你需要你的动物虚拟表示能够在其环境中移动。比方说,作为一种类比,你希望你的Animal
对象能够在其环境中行走。因此,你需要在我们的对象中添加一个名为walk
的方法。为此,我们需要编写以下代码
class Animal {
String name;
int legs;
void walk() { }
}
|
当你编写这段代码时,有一件事立刻变得显而易见。就像类描述一样,方法也有花括号。通常,花括号用于定义你的对象中的一个区域(或**范围**)。所以第一组花括号定义了一个类定义的范围,称为**类级范围**。这组新的花括号以及一个方法定义了一个方法的进一步定义的范围,称为**方法级范围**。
在本例中,我们方法的名称是walk
。但请注意,我们方法的名称也包含一组圆括号。这些圆括号不仅仅是方法的视觉标识符,它们还用于为我们的方法提供称为**参数**的额外输入信息。
因此,方法使对象能够
- 接受输入:接收一些参数;
- 处理信息:在它的花括号中处理接收到的参数;以及
- 生成输出:偶尔,返回一些东西。
本质上,方法是使对象更像系统的关键。
注意方法名称之前的void
关键字 - 这告诉我们方法walk
不返回值。你可以将方法设置为返回任何数据类型 - 它可以是**String**或**int**。
**图 4:**
Animal 对象现在可以表示为在 Java 环境中具有交互行为如这里所示。请注意字段和方法表示之间的区别。 |
封装的过程
[edit | edit source]现在,我们已经彻底理解了任何对象都可以与其环境交互,反过来也会受到环境的影响。在我们的示例中,Animal
对象公开了一些字段 - name
和legs
,以及一个方法 - walk()
,供环境用于操纵该对象。这种暴露形式是隐式的。使用 Java 编程语言,程序员有能力定义其他对象和环境对某个对象的访问级别。
使用访问修饰符
[edit | edit source]除了声明和定义对象、它们的字段和方法之外,程序员还可以定义对这些元素的访问级别。这是使用称为**访问修饰符**的关键字来完成的。
让我们修改我们的示例来演示这种效果
class Animal {
public String name;
public int legs;
public void walk() { }
}
|
通过将所有字段和方法声明为public
,我们确保它们可以在Animal
类的范围之外使用。这意味着任何其他对象(除了Animal
)都可以访问这些成员元素。但是,为了限制对类中某些成员元素的访问,我们始终可以使用private
访问修饰符(如下所示)。
class Animal {
private String name;
private int legs;
public void walk() { }
}
|
在这个示例中,name
和legs
字段只能在Animal
类的范围内访问。该类范围之外的任何对象都不能访问这两个字段。但是,由于walk()
方法仍然具有public
访问权限,因此它可以被该类范围之外的参与者和对象操纵。访问修饰符不局限于字段或方法,它们也可以用于类定义(如下所示)。
public class Animal {
private String name;
private int legs;
public void walk() { }
}
|
以下关键字列表显示了可以在 Java 程序中使用的有效访问修饰符
关键字 | 描述 |
---|---|
public
|
打开对某个字段或方法的访问权限,使其可以在类的范围之外使用。 |
private
|
限制对某个字段或方法的访问权限,使其只能在类的范围内使用。 |
protected
|
对某些字段或方法的访问权限保留给继承当前类的类。 有关这方面的更多信息将在继承部分讨论。 |