第一个简单程序

让我们从编译并㣽下面这个简单程序开始:
package javaTest;
/**
 * @author liulibo
 */
public class test
{
    /**
     * @param args
     */
    public static void main(String args[])
    {
        System.out.println("haha1");
    }
}
我们需要遵循三个步骤:
1.输入程序
2.编译程序
3.运行程序
1.输入程序
对于大多数计算机语言而言,存储程序源代码的文件名称是任意的,然而Java却不是这样.你要了解的关于Java的第一点就是源文件的命名极为重要.对于本例,源文件的名称因为Test.java,下面我们来看看为什么要这样做.
在Java中,源文件的正式名称是编译单元(compilation unit).他是一个包含一个或多个类定义的文本文件(现在我们只包含一个类的源文件).Java编译器要求源文件使用.java为文件扩展名.查看程序即可发现,程序定义的类的名称也是test.这并不是巧合.在Java中,所有的代码都必须驻留于一个类中.根据规则,类名应该与存储程序的文件名称相符,而且应该确保文件名的大小写与类名相符.这样做是因为Java区分大小写.此时文件名与类名的一致规则看似有些武断,然而正是这样的规则使得程序的维护与组织更为轻松了.
2.编译程序
为了编译test程序,执行编译器javac,这需要在命令行指定源文件的名称,如下所示:
javac test.java
编译器javac创建一个包含程序字节码的名为test.class的文件.切记,字节码不是可执行代码.字节码必须由Java虚拟机来执行.因此,javac输出的代码是不可以直接执行的.
要真正运行程序,必须使用Java解释器java,为此,需要将类名Test作为一个命令行实参来传递:
java Test
当程序运行时,输入如下所示:
haha1
编译Java源代码时,每一个类都放入文件名与该类类名相同的输出文件中,并以.class为扩展名.这就是使Java源文件的名称与他们所包含的类名一致的原因.源文件的名称会与.class文件名匹配.当执行如前所示的Java解释器时,实际上要指定希望解释器执行的类名.解释器会自动寻找一个与该类名相同,且以.class为扩展名的文件.如果他找到文件,就会执行包含在里面的特定类的代码.
注意:假设你正确安装了JDK.如果在尝试编译程序时,计算机找不到javac,就需要指定命令行工具的路径.例如,在windows中,这意味着需要在PATH环境变量定义的路径中添加命令行工具的路径.
3.逐行分析第一个程序
尽管程序test.java非常短,但是他却包含了所有Java程序共有的几个特点,下面,我们仔细研究一下程序的各个部分:
/**
 * @author liulibo
 */
这是一个注释(comment),与其他多数程序设计语言一样,Java允许在程序源代码中输入注释.编译器会忽略注释的内容.而注释可以向任何阅读程序源代码的人员描述或解释程序的操作.本例中,注释描述了程序,并且提醒你源文件应该以test.java命名.当然,在实际的应用程序中,注释一般用来解释程序的某些部分如何工作,或对特定的功能进行解释.
Java支持三种形式的注释.在这个例子中,位于程序最上面的是多行注释(multiline comment).这种类型的注释以/*开始*/结尾.这两个注释符号中间的任何内容都将被编译器忽略.顾名思义,多行注释可以有若干行.
程序的下一行如下所示:
public class test
该行代码使用关键字class声明创建一个新类.如前所示,类是Java的基本封装单元.
test是类的名称.类的定时以左花括号{开始,以右花括号}结束.两个花括号间的元素是类的成员.此时不必过于担心类的细节,只要知道Java所有的程序活动发生在一个类中即可.这也就是Java程序都(至少有一点)具有面向对象性的原因之一.
如下所示,这是一行单行注释(single-line comment)
// @param args
这是Java支持的第二种注释方式.单行注释以//开始,以行末结尾.作为一项基本规则,程序员使用多行注释进行较长的描述,用单行注释进行简要的逐行描述.
public static void main(String args[])
本行是main()方法的开始.如前所述,在Java中,子例程称为方法(method),正如他之前的注释所提示的那样,程序从这一行开始执行.所有Java应用程序的执行都是以调用main()
开始的.虽然对于本行各部分的意思现在不能一一尽述,因为这需要深入理解其他几个Java特性.
关键字public是一个访问修饰符(access modifier),访问修饰符用以决定程序其他部分如何访问类的成员.当类的成员前面有public时,该成员就可以被声明他的类以外的代码访问(与public相反的是private,他用来防止类以为的代码使用成员).本例中,main()必须被声明为public,因为他要在程序开始时被他的类以外的代码调用.关键字static允许main()类的对象被创建之前调用.这一点是必须的,因为JVM要在任何对象被创建之前调用 main().关键字void只告知编译器main()不返回值.正如你说看到的,方法也可以返回值.
如前所述,main()是在Java应用程序开始时调用的方法.需要传递给方法的任何信息都将被方法名后面一对圆括号中指定的变量所接收.这些变量称为形参(parameter).如果给定的方法不需要形参,那么还需要包括一对空的圆括号.main()中只有一个形参String args[],他用来声明一个名为args的形参.这是一个String类型的对象数组(数组是相似对象的集合).String类型的对象用于存储字符序列.本例中,args接收执行程序时出现的任何命令行实参.这个程序没有用到这一信息.
System.out.println("haha1");
本行输出字符串”haha1″,而且在屏幕上显示字符串后另起一行.输出实际上是由内置的println()方法完成的.本例中,println()显示传递给他的字符串.如你所见,println()也可以用于显示其他类型的信息.本行以system.out开始.虽然此时详细解释System还有些复杂,但简单讲,System是一个预定义类,他提供对系统的访问,而out是与控制台相连的输出流.因此,system.out是一个封装控制台输出的对象.Java使用对象来定义控制台输出这一事实是其面向对象本质的又一佐证.
控制台输出/输入在实际的Java程序中并不常用.因为多数现代计算机环境是窗口化,图形化的,所以控制台I/O多用于简单的工具程序和演示程序,以及服务器端代码.
注意println语句以分号结束.Java中的所有语句都要以分号结束.程序中其他喊不以分号结尾是因为从技术上讲他们不是语句.
最后提醒一点:Java是区分大小写的,忘记这一点会给你带来很大的麻烦,例如,如果你偶尔将main输入成Main,或者将println输入成PrintLn,那么前面的程序就不正确了.而且,尽管Java编译器会编译不包含main()方法的类,但他却无法执行他们.因此,如果你输错了main,编译器虽然还会编译程序,但是Java解释器会报告一个错误,因为他找不到main()方法.