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()方法,第一个方法是作为程序入口的方法,其他两个方法是合法的普通方法,但不能作为程序入口。
提示:
在本书中,“合法”与“非法”是专有名词。“合法”是指程序代码正确,可以通过编译;“非法”是指程序代码有语法错误,无法通过编译。