跳转到内容

入门

100% developed
来自维基教科书,开放世界中的开放书籍

浏览 入门 主题: v  d  e )


理解系统

[编辑 | 编辑源代码]

我们用系统的概念来理解周围的世界。一个 **系统** 是一个相互连接的对象网络,它们协同工作。在 系统论 中,系统被设定为一个单一实体,位于被环境包围的世界中。系统通过两种不同类型的消息与其周围环境交互

  • **输入:** 从周围环境接收的消息;以及,
  • **输出:** 发回给周围环境的消息。


**图 1:** 一个简单的系统通过输入和输出消息与其环境交互。


生命是一个复杂而混乱的相互连接的对象网络,它们发送信号和消息。请参阅下图 2 中展示的单个公司的经济生态系统的复杂系统示例。想象一下,如果你要添加更多公司及其子系统,这个系统图会是什么样子。一般来说,计算机软件系统是一个更复杂的相互连接的 **子系统** 网络——其中每个子系统可能被进一步划分为子系统,也可能不被划分。每个子系统都使用 **反馈** 消息(即 *输入* 和 *输出*)与其他系统通信。


**图 2:** 具有多个子系统和交互的复杂系统的示例


抽象过程

[编辑 | 编辑源代码]

编程本质上是将现实生活中问题的解决方案视为一个系统。对于任何编程语言,您都需要了解如何将现实生活中的问题转化为能够在计算机系统中准确表示的内容。为了开始使用 Java 编程语言进行编程(或者实际上,使用任何编程语言),程序员首先必须了解抽象的基础知识。

**抽象** 是将现实生活中的问题和对象 *表示* 到程序中的过程。

假设一位小说家、一位画家和一位程序员被要求在其作品中 *抽象*(即 *表示*)一个现实生活中的对象。假设需要抽象的现实生活对象是 *动物*。对于小说家来说,抽象包括写出动物的描述,而画家则会画出动物的图片——那么计算机程序员呢?

Java 编程语言使用一种称为 面向对象编程 (OOP) 的编程范式,它向您展示了程序员需要做什么。根据 OOP,现实生活中每个对象或问题都可以转化为计算机系统中的虚拟对象。

以对象思维

[编辑 | 编辑源代码]

在 OOP 中,现实生活中每个对象的抽象在您的代码中被称为 **对象**。对象本质上是现实生活中的对象的计算机系统中最基本表示。由于 Java 是一种面向对象的语言,Java 中的一切都表示为对象。为了演示这种效果,如果您要定义动物的抽象,您将编写以下几行代码(就像您对任何其他抽象所做的那样)


Computer code
class Animal { }


上面的代码在您的代码中创建一个空间,您可以在其中开始 *定义* 对象;这个空间被称为 **类(或类型)定义**。所有对象都需要使用类定义来定义,才能在您的程序中使用它们。请注意花括号——您在这些括号中编写的任何内容都将用作对象的定义或规范。在上面的例子中,我们创建了一个名为 Animal 的类定义,用于表示现实生活中任何动物的抽象表示。Java 环境将此代码评估为类定义的方式是通过查看我们用于开始类定义的前缀词(即 class)。Java 语言中的这种预定义词被称为 **关键字**,它们构成了该语言的语法(称为 **编程语法**)。

注意
类定义在不同的语言中具有不同的名称。它们有时也被称为 **类型定义**、**对象规范** 或 **模板**

理解类定义和类型

[编辑 | 编辑源代码]

亚里士多德 也许是第一个思考抽象类型或对象类型学的人。他开始称它们为类——例如,鸟类,哺乳动物。因此,类定义很好地实现了定义您要创建的对象的共同特征或类型。在声明类定义后,您可以基于该定义创建对象。但是,为了做到这一点,您需要编写以下特殊语法

Computer code
Animal dog = new Animal();


上面的代码使用Animal类的定义,有效地创建了一个名为dog的对象。用非程序员的语言来说,上面的代码可以翻译成类似“创建一个名为dog,类型为Animal的新对象”。单个类定义允许您创建多个对象,如下面的代码所示

Computer code
Animal dog = new Animal();
Animal cat = new Animal();
Animal camel = new Animal();


基本上,您只需编写一次类或类型定义的代码,然后使用它根据该规范创建无数个对象。尽管您可能无法理解这样做的重要性,但这项小练习为您节省了大量时间(在 Java 出现之前的日子里,程序员无法轻易获得这种奢侈)。

扩展您的类定义

[编辑 | 编辑源代码]

虽然您从类定义创建的每个对象本质上都是相同的,但必须有一种方法来区分代码中的这些对象。对象字段(或简称字段)使您的对象与其他对象不同。让我们以我们目前的抽象为例。动物可以是狗、猫、骆驼或鸭子,但由于这种抽象非常通用,因此您需要定义对所有这些动物都通用的字段,同时又使这些动物彼此区分。例如,您可以有两个字段:name(给这些动物中的任何一只起的通用名称)和legs(这些动物中的任何一只行走所需的肢体数量)。当您开始定义对象时,它们开始看起来像这样


Computer code
class Animal {

  String name;
  int legs;
}


在上面的代码中,您定义了两个对象字段

  • 一个名为name,类型为String的字段;以及
  • 一个名为legs,类型为int的字段。

这些特殊预定义类型称为数据类型String数据类型用于可以保存文本值的字段,例如名称,而int(整数)数据类型用于可以保存数值值的字段

注意
在不同的语言中,字段被称为不同的名称。在其他编程语言语法中,它们可能被称为状态标识符属性成员变量。Java 在不同的上下文中使用“字段”和“属性”这两个词,正如接下来的部分所述。

图 3:为了将Animal对象表示为 Java 环境中的一个系统,
您将其呈现为这样。请注意字段是如何呈现的。


为了演示字段的工作原理,我们将继续从我们修改后的类定义版本中创建对象,如下所示

Computer code
Animal animal1 = new Animal();
Animal animal2 = new Animal();

animal1.name = "dog";
animal1.legs = 4;

animal2.name = "duck";
animal2.legs = 2;


您可以使用.(点)或成员运算符来访问已创建对象的字段。在上面的示例中,我们创建了两个类型为Animal的对象:animal1animal2。并且由于我们已经确定每个Animal都有两个字段,分别是namelegs,因此我们使用成员运算符访问并修改了每个对象的这些字段,以将它们区分开来。通过为不同的对象声明不同的值,我们可以操作它们当前的状态。因此,例如

  • animal1对象是"dog",有4条腿可以行走;而
  • animal2对象是"duck",有2条腿可以行走。

区分这两个对象的是它们当前的状态。这两个对象都具有不同的状态,因此即使它们是从同一个模板或类定义创建的,它们也作为两个不同的对象脱颖而出。

向对象添加行为

[编辑 | 编辑源代码]

此时,您的对象除了声明一堆字段之外,什么也不做。作为一个系统,您的对象应该能够与其环境和其他系统交互。要添加这种交互能力,您还需要向对象类定义添加交互行为。这种行为是使用称为方法的编程结构添加到类定义中的。

Animal为例,您需要让您的动物虚拟表示能够在环境中移动。让我们说,作为一种类比,您希望您的Animal对象能够在其环境中行走。因此,您需要向我们的对象添加一个名为walk的方法。为此,我们需要编写以下代码


Computer code
class Animal {

  String name;
  int legs;

  void walk() { }
}


当您编写此代码时,有一件事立即变得显而易见。就像类描述一样,方法也带有花括号。通常,花括号用于定义对象内的区域(或范围)。因此,第一组花括号定义了类定义的范围,称为类级范围。这组新的花括号以及方法定义了方法的进一步定义范围,称为方法级范围

在本例中,我们方法的名称为walk。但是请注意,我们方法的名称也包含一组圆括号。这些圆括号不仅仅是方法的可视标识符,它们还用于为我们的方法提供称为参数的额外输入信息。

因此,方法使对象能够

  1. 接受输入:接收一些参数;
  2. 处理信息:在其花括号内处理接收到的参数;以及
  3. 生成输出:有时,返回一些内容。

本质上,方法使对象的行为更像一个系统。

请注意方法名称之前的关键字void - 这告诉我们方法walk不返回任何内容。您可以将方法设置为返回任何数据类型 - 它也可以是Stringint

注意
在不同的编程语言中,方法被称为不同的名称。它们可能被称为函数过程例程行为

图 4:Animal对象现在可以表示为在 Java 环境中具有交互行为
如这里所示。请注意字段和方法表示之间的区别。


封装的过程

[编辑 | 编辑源代码]

到目前为止,我们已经彻底了解到任何对象都可以与其环境交互,并反过来受到环境的影响。在我们的示例中,Animal对象公开了一些字段 - namelegs,以及一个方法 - walk(),供环境使用来操作对象。这种暴露形式是隐式的。使用 Java 编程语言,程序员有能力定义其他对象和环境对特定对象的访问级别。

使用访问修饰符

[编辑 | 编辑源代码]

除了声明和定义对象、它们的字段和方法之外,程序员还可以定义对这些元素的访问级别。这是使用称为访问修饰符的关键字完成的。

让我们修改我们的示例来演示这种效果

Computer code
class Animal {

  public String name;
  public int legs;

  public void walk() { }
}


通过将所有字段和方法声明为public,我们确保它们可以在Animal类的范围之外使用。这意味着任何其他对象(除了Animal)都可以访问这些成员元素。但是,要限制对类中某些成员元素的访问,我们始终可以使用private访问修饰符(如下所示)。

Computer code
class Animal {

  private String name;
  private int legs;

  public void walk() { }
}


在本示例中,namelegs字段只能在Animal类的范围内访问。此范围之外的任何对象都无法访问这两个字段。但是,由于walk()方法仍然具有public访问权限,因此它可以被此范围之外的参与者和对象操作。访问修饰符不仅限于字段或方法,它们也可以用于类定义(如下所示)。

Computer code
public class Animal {

  private String name;
  private int legs;

  public void walk() { }
}


以下关键字列表显示了可以与 Java 程序一起使用的有效访问修饰符

关键字 描述
public 打开对特定字段或方法的访问,以便在类的范围之外使用。
private 限制对特定字段或方法的访问,使其只能在类的范围内使用。
protected 对特定字段或方法的访问保留给继承当前类的类。
有关这方面的更多内容将在继承部分中讨论。


华夏公益教科书