Java逍遥游记
上QQ阅读APP看本书,新人免费读10天
设备和账号都新为新人

1.3 创建面向对象的Java源程序

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

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

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

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

智多星:“智多星呀。”

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

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

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

1.3.1 定义Monkey类

悟空打开文本编辑器(如Windows中的记事本程序),编写了一个如例程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修饰符意味着这个类可以被公开访问。类的主体内容都位于大扩号“{}”内。

Tips

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

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

            String name;

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

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

            public void speak(){
              System.out.println("大家好,我是"+name);
            }

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

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对象

Tips

内存用来存放电脑在执行程序时所处理的数据。例如电脑执行“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.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

            public class Tester {
              /** 程序入口main方法 */
                  public static void main(String args[]){……}

                  /** 非程序入口main方法 */
                  public static void main(String arg) {……}
                  private int main(int arg) {……}
                }

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

Tips

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