1 Java程序的组织形式
Java程序是一种纯粹的面向对象的程序设计语言,因此Java程序必须以类(class)的形式存在,类(class)是Java程序的最小程序单位。Java程序不允许可执行性语句、方法等成分独立存在,所有的程序部分都必须放在类定义里。
上面的HelloWorld.java程序是一个简单的程序,但还不是最简单的Java程序,最简单的Java程序是只包含一个空类定义的程序。下面将编写一个最简单的Java程序。
程序清单:codes011.5Test.java
class Test
{
}
这是一个最简单的Java程序,这个程序定义了一个Test类,这个类里没有任何的类成分,是一个空类,但这个Java程序是绝对正确的,如果使用javac命令来编译这个程序,就知道这个程序可以通过编译,没有任何问题。
但如果使用java命令来运行上面的Test类,则会得到如下错误提示:
错误: 在类 Test 中找不到 main 方法, 请将 main 方法定义为:
public static void main(String[] args)
上面的错误提示仅仅表明:这个类不能被java命令解释执行,并不表示这个类是错误的。实际上,Java解释器规定:如需某个类能被解释器直接解释执行,则这个类里必须包含main方法,而且main方法必须使用public static void来修饰,且main方法的形参必须是字符串数组类型(String[] args是字符串数组的形式)。也就是说,main方法的写法几乎是固定的。Java虚拟机就从这个main方法开始解释执行,因此,main方法是Java程序的入口。至于main方法为何要采用这么“复杂”的写法,后面章节会有更详细的解释,读者现在只能把这个方法死记下来。
对于那些不包含main方法的类,也是有用的类。对于一个大型的Java程序而言,往往只需要一个入口,也就是只有一个类包含main方法,而其他类都是用于被main方法直接或间接调用的。
2 Java源文件的命名规则
Java程序源文件的命名不是随意的,Java文件的命名必须满足如下规则。
Java程序源文件的扩展名必须是.java,不能是其他文件扩展名。
在通常情况下,Java程序源文件的主文件名可以是任意的。但有一种情况例外:如果Java程序源代码里定义了一个public类,则该源文件的主文件名必须与该public类(也就是该类定义使用了public关键字修饰)的类名相同。
由于Java程序源文件的文件名必须与public类的类名相同,因此,一个Java源文件里最多只能定义一个public类。
注意:一个Java源文件可以包含多个类定义,但最多只能包含一个public类定义;如果Java源文件里包含public类定义,则该源文件的文件名必须与这个public类的类名相同。
虽然Java源文件里没有包含public类定义时,这个源文件的文件名可以是随意的,但推荐让Java源文件的主文件名与类名相同,这可以提供更好的可读性。通常有如下建议:
一个Java源文件只定义一个类,不同的类使用不同的源文件定义。
让Java源文件的主文件名与该源文件中定义的public类同名。
在疯狂软件的教学过程中,发现很多学员经常犯一个错误,他们在保存一个Java文件时,常常保存成形如.java.txt的文件名,而且这种文件名看起来非常像是.java。这是Windows的默认设置所引起的,Windows默认会“隐藏已知文件类型的扩展名”。为了避免这个问题,通常推荐关闭Windows的“隐藏已知文件类型的扩展名”功能。
为了关闭“隐藏已知文件类型的扩展名”功能,在Windows的资源管理器窗口打开“组织”菜单,然后单击“文件夹和搜索选项”菜单项,将弹出“文件夹选项”对话框,单击该对话框里的“查看”Tab页,看到如图1所示的对话框。
图1 “文件夹选项”对话框
去掉“隐藏已知文件类型的扩展名”选项之前的钩,则可以让所有文件显示真实的文件名,从而避免HelloWorld.java.txt这样的错误。
另外,图1中还显示勾选了“在标题栏显示完整路径(仅限经典主题)”选项,这对于开发中准确定位Java源文件也很有帮助。
3 初学者容易犯的错误
万事开头难,Java编程的初学者常常会遇到各种各样的问题,对于在学校跟着老师学习的读者而言,可以直接通过询问老师来解决这些问题;但对于自学的读者而言,则需要花更多时间、精力来解决这些问题,而且一旦遇到的问题几天都得不到解决,往往会带给他们很大的挫败感。
下面介绍一些初学者经常出现的错误,希望减少读者在学习中的障碍。
1.CLASSPATH环境变量的问题
由于历史原因,几乎所有的图书和资料中都介绍必须设置这个环境变量。实际上,正如前面所介绍的,如果使用1.5以上版本的JDK,完全可以不用设置这个环境变量。如果不设置这个环境变量,将可以正常编译和运行Java程序。
相反,如果有的读者看过其他Java入门书籍,或者参考过网上的各种资料(网络是一个最大的资源库,但网络上的资料又是鱼龙混杂、良莠不齐的。网络上的资料很多都是转载的,只要一个人提出一个错误的说法,这个错误的说法可能被成千上万的人转载,从而看到成千上万的错误说法),可能总是习惯设置CLASSPATH环境变量。
设置CLASSPATH环境变量没有错,关键是设置错了就比较麻烦了。正如前面所介绍的,如果没有设置CLASSPATH环境变量,Java解释器将会在当前路径下搜索Java类,因此在HelloWorld.class文件所在的路径运行java HelloWorld将没有任何问题;但如果设置了CLASSPATH环境变量,Java解释器将只在CLASSPATH环境变量所指定的系列路径中搜索Java类,这样就容易出现问题了。
由于很多资料上提到CLASSPATH环境变量中应该添加dt.jar和tools.jar两个文件,因此很多读者会设置CLASSPATH环境变量的值为:D:Javajdk-9libdt.jar;D:Javajdk-9libtools.jar(实际上JDK 9已经删除了这两个文件),这将导致Java解释器不在当前路径下搜索Java类。如果此时在HelloWorld.class文件所在的路径运行java HelloWorld,将出现如下错误提示:
错误: 找不到或无法加载主类 HelloWorld
上面的错误是一个典型错误:找不到类定义的错误,通常都是由CLASSPATH环境变量设置不正确造成的。因此,如果读者要设置CLASSPATH环境变量,一定不要忘记在CLASSPATH环境变量中增加点(.),强制Java解释器在当前路径下搜索Java类。
提醒:定了CLASSPATH环境变量,一定不要忘记在CLASSPATH环境变量中增加点(.),点代表当前路径,用以强制Java解释器在当前路径下搜索Java类。
除此之外,有的读者在设置CLASSPATH环境变量时总是仗着自己记忆很好,往往选择手动输入CLASSPATH环境变量的值,这非常容易引起错误:偶然的手误,或者多一个空格,或者少一个空格,都有可能引起错误。
实际上,有更好的方法来解决这个错误,完全可以在文件夹的地址栏里看到某个文件或文件夹的完整路径,就可以直接通过复制、粘贴来设置CLASSPATH环境变量了。
通过资源管理器打开JDK安装路径,将可以看到如图2所示的界面。
图2 在地址栏中显示完整路径
读者可以通过复制地址栏里的字符串来设置环境变量,而不是采用手动输入,从而减少出错的可能。
2.大小写问题
前面已经提到:Java语言是严格区分大小写的语言。但由于大部分读者都是Windows操作系统的忠实拥护者,因此对大小写问题往往都不够重视(Linux平台是区分大小写的)。
例如,有的读者编写的Java程序里的类是HelloWorld,但当他运行Java程序时,运行的则是java helloworld这种形式——这种错误的形式有很多种(对的道路只有一条,但错误的道路则有成千上万条)。总之,就是java命令后的类名没有严格按Java程序中编写的来写,可能引起系统提示如图3示的错误。
图3类名大小写不正确的提示
因此必须提醒读者注意:在Java程序里,HelloWorld和helloworld是完全不同的,必须严格注意Java程序里的大小写问题。
不仅如此,读者按书中所示的程序编写Java程序时,必须严格注意Java程序中每个单词的大小写,不要随意编写。例如class和Class是不同的两个词,class是正确的,但如果写成Class,则程序无法编译通过。实际上,Java程序中的关键字全部是小写的,无须大写任何字母。
3.路径里包含空格的问题
这是一个更容易引起错误的问题。由于Windows系统的很多路径都包含了空格,典型的例如Program Files文件夹,而且这个文件夹是JDK的默认安装路径。
如果CLASSPATH环境变量里包含的路径中存在空格,则可能引发错误。因此,推荐大家安装JDK以及Java相关程序、工具时,不要安装在包含空格的路径下,否则可能引发错误。
4.main方法的问题
如果需要用java命令直接运行一个Java类,这个Java类必须包含main方法,这个main方法必须使用public和static来修饰,必须使用void声明该方法的返回值,而且该方法的参数类型只能是一个字符串数组,而不能是其他形式的参数。对于这个main方法而言,前面的 public和static修饰符的位置可以互换,但其他部分则是固定的。
定义main方法时,不要写成Main方法,如果不小心把方法名的首字母写成了大写,编译时不会出现任何问题,但运行该程序时将给出如下错误提示:
错误: 在类 Xxx 中找不到 main 方法, 请将 main 方法定义为:
public static void main(String[] args)
这个错误提示找不到main方法,因为Java虚拟机只会选择从main方法开始执行;对于Main方法,Java虚拟机会把该方法当成一个普通方法,而不是程序的入口。
main方法里可以放置程序员需要执行的可执行性语句,例如System.out.println(“Hello Java!”),这行语句是Java里的输出语句,用于向控制台输出”Hello Java!”这个字符串内容,输出结束后还输出一个换行符。
在Java程序里执行输出有两种简单的方式:System.out.print(需要输出的内容)和System.out.println (需要输出的内容),其中前者在输出结束后不会换行,而后者在输出结束后会换行。后面会有关于这两个方法更详细的解释,此处读者只能把这两个方法先记下来。
本文选自《疯狂Java讲义(第四版)》
李刚 编著
ISBN 978-7-121-33108-4
2018年1月出版
定价:109.00元