大话Java:程序设计从入门到精通
上QQ阅读APP看本书,新人免费读10天
设备和账号都新为新人

1.3 编写面向对象的Java源程序

悟空经过一番认真学习,掌握了Java语言的基本语法,接着就猴急猴急地要在儿孙们面前演示Java语言的神奇妙用了。有一天,悟空把智多星叫过来,故作神秘地对智多星说:“请你如实回答我的以下问题。”

悟空:“你属于猫类、鸡类、狗类,还是猴类啊?”

智多星:“当然是猴类啦。”

悟空:“你叫什么名字?”

智多星:“智多星呀。”

悟空:“你能做哪些事?”

智多星:“吃饭、说话、睡觉、爬树、杂耍……”

悟空接下来得意地对智多星说:“我要把你搬到计算机里。”智多星惊讶地瞪大了眼睛:“孙爷爷啊,您神通广大,能把金箍棒变成针眼般大小,再把它塞到耳朵里。莫非您也要把孩儿变成芝麻般大小,再把孩儿塞到这计算机里?”悟空哈哈大笑:“你想歪啦。我要在计算机里创建一个虚拟的智多星,它也能像你一样说话。”智多星兴奋得跳了起来:“太好了,孩儿以前在计算机里看电视剧《西游记》,看到有您、唐僧和猪八戒等,还有白骨精呢,唯独没有我。这回我终于也能在计算机里露个脸了。”

1.3.1 定义Monkey类

悟空打开文本编辑器(例如Windows中的记事本程序),用Java语言编写了一个如例程1-1所示的Java源程序,文件名为Monkey.java。

例程1-1 Monkey.java

public class Monkey{ //定义代表花果山猴类的Monkey类

String name; //定义名字属性

public Monkey(){} //不带参数的构造方法

public Monkey(String name){ //带参数的构造方法

this.name=name; //设置Monkey对象的name属性

}

public void speak(){ //定义模拟猴子说话的speak()方法

//猴子给大家打招呼

System.out.println("大家好,我是"+name);

}

}

在这个Monkey.java文件中定义了一个 Monkey类,它代表花果山上的猴类。Monkey.java文件主要由以下内容构成:

(1)类的声明语句:

public class Monkey{…}

以上代码指明类的名字为“Monkey”,public修饰符意味着这个类可以被公开访问。类的主体内容都位于大括号“{}”内。

提示:

在本书中,“声明”和“定义”有着相同的含义。例如,“声明Monkey类”和“定义Monkey类”的意思相同;“声明name变量”和“定义name变量”的意思也相同。

(2)类的属性(也称为成员变量)的声明语句:

String name;

所有的猴子都有名字,用Monkey类的name属性来表示。name属性为String字符串类型。

(3)方法的声明语句和方法主体:

public void speak(){

System.out.println("大家好,我是"+name);

}

所有的猴子都具有说话的行为,Monkey 类的 speak()方法就用来模拟猴子说话的行为。speak()方法的大括号中的内容称为方法主体,以上方法主体中程序代码的作用是打印“大家好,我是XXX”。

提示:

Java语言是区分大小写的。例如“Monkey”和“monkey”是两个不同的名字。如果读者要重新编写 monkey 类的源代码,要注意不要混淆代码中字符的大小写。

Monkey.java 文件中以“//”开头的文字代表注释,它不是程序代码,而是用于解释说明程序代码,从而便于编程人员理解程序代码。对于 Monkey.java 文件中 public和static等修饰符,暂且不用细究它们的用途。到目前为止,读者只要大致了解Monkey类主要由name属性和speak()方法构成就行了。

1.3.2 创建Monkey对象

在上一节,悟空已经定义了一个Monkey类。这个Monkey类是所有猴子的模板,每个猴子都是Monkey类的一个实例,例如猴子智多星就是Monkey类的一个具体实例。Monkey类具有name属性和speak()方法,那么依照Monkey类模板生成的所有Monkey实例也会具有name属性和speak()方法。例如猴子智多星的name属性的值为“智多星”, speak()方法的作用是打印字符串“大家好,我是智多星”。

类的实例也叫作对象,对象是对现实世界中各种实体的模拟。以下Java程序代码创建了一个代表智多星的Monkey对象:

//定义一个Monkey类型的引用变量m

Monkey m;

//创建一个代表智多星的Monkey对象,并且使引用变量m引用这个对象

m=new Monkey("智多星");

以上程序的第二行代码通过new语句创建了一个Monkey对象,并且使引用变量m引用这个对象。本书第4章的4.4.3节(用new关键字创建对象)进一步介绍了new语句的作用。如图1-7所示,当程序运行时,这个用new语句创建的Monkey对象位于计算机的内存中,它占用了一定的内存空间。变量m引用这个Monkey对象:

图1-7 变量m引用内存中的Monkey对象

提示:

内存用来存放计算机在执行程序时所处理的数据。例如计算机执行“100+200”的数学运算时,数据100、200,以及运算结果300都会先后存放在内存中。当程序运行结束时,与该程序相关的数据就会被全部清除,从而及时释放这些数据占用的内存空间。Java 作为面向对象的编程语言,所处理的数据主要以对象及其属性等形式存在。当Java程序运行时,对象存在于内存中。

new语句会调用Monkey类的构造方法,“new Monkey("智多星")”语句调用Monkey类的带参数的 Monkey(String name)构造方法,该构造方法把参数“智多星”赋值给Monkey对象的name属性:

public Monkey(String name){ //带参数的构造方法

this.name=name; //设置Monkey对象的name属性

}

Monkey类还有一个不带参数的构造方法:

public Monkey(){} //不带参数的构造方法

以下程序通过不带参数的构造方法创建Monkey对象:

m=new Monkey(); //通过不带参数的构造方法创建Monkey对象

m.name="智多星"; //设置Monkey对象的name属性

Monkey对象创建好以后,就可以调用它的方法。以下程序代码调用Monkey对象的speak()方法,来模拟智多星说话:

m.speak();

由于变量m引用代表智多星的Monkey对象,因此“m.speak()”就会调用代表智多星的Monkey对象的speak()方法。

以下程序代码创建了两个 Monkey 对象,分别代表猴子智多星和猴子小不点,然后再分别调用它们的speak()方法:

Monkey m1=new Monkey("智多星");

Monkey m2=new Monkey("小不点");

m1.speak(); //智多星说话:大家好,我是智多星

m2.speak(); //小不点说话:大家好,我是小不点

以上程序在内存中创建了如图1-8所示的两个Monkey对象,它们都依据Monkey类模板生成,分别具有不同的name属性。引用变量m1和m2分别引用这两个Monkey对象。

图1-8 依据Monkey类模板创建两个Monkey对象

1.3.3 程序入口main()方法

Java源程序中包含许多代码,当程序运行时,到底从哪一行代码开始运行呢?Java语言规定,以main()方法作为程序的入口。所有的Java程序都是从main()方法开始运行的。悟空在Monkey类的末尾增加了一个作为程序入口的main()方法:

public class Monkey{

public static void main(String[] args) {

Monkey m=new Monkey("智多星"); //创建代表智多星的Monkey对象

m.speak(); //智多星说话

}

}

以上args是main()方法的参数,它属于String数组类型(String[]),第17章的17.3节(创建数组对象)顺带介绍了这个方法参数的用法。

作为程序入口的main()方法必须同时符合以下4个条件:

必须使用public修饰符。

必须使用static修饰符。

必须有一个String数组类型的参数。

返回类型为void。void表示方法没有返回值。

在类中可以通过重载的方式提供多个不作为应用程序入口的main()方法。关于方法重载的概念参见本书第7章的7.2节(方法重载)。例如在以下例程1-2的Tester类中声明了多个main()方法。

例程1-2 Tester.java

例程1-2的Tester类中包含三个main()方法,第一个方法是作为程序入口的方法,其他两个方法是合法的普通方法,但不能作为程序入口。

提示:

在本书中,“合法”与“非法”是专有名词。“合法”是指程序代码正确,可以通过编译;“非法”是指程序代码有语法错误,无法通过编译。