1.2 面向对象

1.2.1 面向对象语言的诞生

编程本质上是和计算机打交道,用程序去控制计算机的行为,从而解决现实世界中的各种问题。但计算机是个极其复杂的系统,并不是每个编写程序的人都需要打开电脑机箱,搞清楚它的内部结构和工作原理(如图1-3所示)。

图1-3 计算机与程序员

将计算机的机器细节变成人脑容易理解和记忆的形式,将计算机的世界和人类日常生活的世界联系起来,这就是编程语言所要完成的任务。编程语言的发展就是从计算机世界向现实世界,从计算机思维向人类思维不断靠拢的过程。

计算机的世界中只有1和0两个数字,最早的“编程语言”是在长长的纸带上用打孔和不打孔来表示1和0,以此来操纵计算机的。这样的方法费时费力费资源,一个简单的程序需要的纸带就多到令人发指的地步。此外,它还很容易出错,一个孔打错就意味着一整条纸带的报废,让人欲哭无泪。

纸带时代之后,汇编语言出现了,写程序不再等于打孔,写程序的人不必再用0和1思考,一条条的汇编指令代替了让人抓狂的纸带。这是一个巨大的进步。

汇编语言之后,出现了BASIC和C等高级语言,复杂的汇编指令消失了,程序代码在可读性、可维护性等方面都有了很大提升。可是,程序语言仍然是贴近计算机逻辑的东西,离人类思考问题的模式尚有很大的距离。

从打孔纸带到汇编指令,再到高级语言中的函数,接下来,面向对象语言出现了,Java就是其中的典型代表,它的口号是:一切都是对象(如图1-4所示)。

图1-4 语言的发展

1.2.2 建立“一切都是对象”的观念

“面向对象”的英文原名叫“Object-Oriented”,简称OO,根据翻译的不同,它也有其他不同的称谓,如台湾地区惯用“物件导向”这种叫法。在 Java 的世界中,所有的东西都有一个统一的称谓——对象。对象是什么呢?简单说来,对象=属性+方法(如图1-5所示)。

图1-5 对象

属性也可以称为特性,它从静态上描述了该对象的各种特性;方法也可以称做行为,它从动态上描述了该对象能够做的事情。例如,一个人的属性可以包括姓名、年龄、性别等,一个人的行为可以包括思考、说话、吃饭、睡觉等。

理论上,人们脑海中的任何东西都能成为程序中的对象。小到一粒沙,大到一个宇宙都可以是对象;不仅包括实实在在的东西,就连“思想”和“灵魂”这些抽象的概念也可以变成对象——总之,只要能用属性+方法的形式来描述的东西,都可以成为对象(如图1-6所示)。

图1-6 面向对象的Java

了解了对象的概念之后。在面向对象的世界里,所谓的“程序”就不再是一条条的命令,而是成堆的对象组合在一起,通过彼此间传递消息互相协作,从而完成特定的任务。例如“上课”这个简单的事情,便可以转化为“学生”对象和“老师”对象之间的关系。这和现实世界是一致的。与BASIC、C这些高级语言相比,Java这样的面向对象语言更加符合人类认识问题、思考问题的模式。

1.2.3 认识对象的模具——类

以“上课”为例,这个例子中同班的学生们除了姓名、年龄、性别等属性不同之外,其他属性是完全相同的,所以他们都属于同一“类”。

“类”是面向对象程序设计中一个极其重要的概念(如图1-7所示)。读者已经知道,对象包含了属性及行为。“类”便是有着共同属性及共同行为对象的总称。在面向对象的Java程序设计中,所有的个体都是对象,每个对象都属于特定的类,类定义了属于该类对象的属性及行为。例如属于“学生”这个类的对象,都具有姓名、年龄、性别等属性,只是这些属性的值不一样。除了属性之外,他们还都具有“记笔记”等“学生”类所定义的行为。

图1-7 类和对象

类就像是对象的模具,程序员只要设置好了类,那么属于该类的对象想产生多少就产生多少。这个产生的过程称为类的“实例化”,所产生出来的对象,称做类的实例。

在Java里面,用关键字Class来表示类。前面所说的“学生”类名字是Student,它有3个属性:

(1)name:姓名,字符串类型。

(2)age:年龄,整数类型。

(3)sex:性别,字符串类型。

因此,这个“学生”类——Student,可以用Java代码描述如下(参见清单1-1)。

清单1-1

    class Student {
        String name;    // 姓名
        int   age;      // 年龄
        String sex;     // 性别
        /**
        * 学生上课记笔记
        */
        void takeNote(){
            System.out.println("我是" + name);
            System.out.println("今年" + age + "岁" );
            System.out.println("性别" + sex);
            System.out.println("我开始记笔记了");
        }
    }

还没有为这个类创建构造函数(这种情况下,Java 编译器会自动为其创建一个无参数的构造函数),它只有一个叫做takeNote的方法,表示上课记笔记这个行为。方法中使用了System.out对象,调用它的println方法,向控制台输出信息。

Java命名规范

关于类、属性和方法的命名,满足以下两点的名字都是合法的:

(1)以字母、下画线及美元符号“$”开头,随后是字母和数字的任意组合。

(2)非Java的保留字(如class、void等)。

按照Java的命名规范,通常情况下,类名的第一个单词以大写字母开头,属性名、方法名的第一个单词以小写字母开头,其后单词——如果有的话,均以大写字母开头。类名和属性名应该是一个名词,方法名应该是一个动词或动宾短语。在清楚表达意思的前提下尽量简短。

为了测试这个类,读者需要为它加上一个main方法。main方法是每个Java应用程序都必须有的,每一个Java应用程序都是由main方法开始的,而main方法执行完毕就意味着该应用程序的结束。

添加了main方法之后,Student类变成了下面这个模样(参见清单1-2)。

清单1-2

在main方法中,读者可以看到,这里通过关键字new创建了一个叫做zhouxingxing的Student类型的对象,然后对它的各项属性进行赋值,姓名设为“JavaWeb爱好者”,年龄设为20岁,性别设为男。最后,调用他的takeNote方法,让这个学生记笔记。

运行这个简单的程序,就可以在控制台上看到如下输出:

    我是JavaWeb爱好者
    今年20岁
    性别男
    我开始记笔记了

以上通过代码展示了一个简单类的创建以及使用——与其说简单,不如说它非常的简陋。如果读者具备Java编程的基础知识,可以很容易地指出其中的问题:比如,类的属性应该是对外部隐藏的,对属性的访问和修改应该通过标准的get和set方法;类及其属性、方法等应有明确的访问修饰符;等等。本书的重点在于讲解应用开发,但是牢固的基础知识和严格的编程规范是极为重要的,一些读者写了很多的代码,编写了很多的程序,但对一些基础的知识却不甚了解,这是本末倒置的做法,对提高自己的水平是不利的。“万丈高楼平地起”,扎实的基本功是写出好程序的基础。在今后的知识讲解中,笔者将会把重要的基础知识融入其中,请读者牢记它们。即使曾经学习过,也请再温习一遍,说不定会发现以前不曾注意到的东西。

有些没有使用过 Java 开发工具的读者可能会无法去比对,不过不用着急,这里主要是向读者示范。在下一节,笔者会详细介绍开发工具的使用。