几点Java程序必须满足的基本规则

管理员账号

2018-02-05

小编说:万事开头难,Java编程的初学者常常会遇到各种各样的问题,本文介绍一些基本规则,希望减少读者在学习中的障碍。本文选自《疯狂Java讲义(第四版)》

1 Java程序的组织形式

Java程序是一种纯粹的面向对象的程序设计语言,因此Java程序必须以类(class)的形式存在,类(class)是Java程序的最小程序单位。Java程序不允许可执行性语句、方法等成分独立存在,所有的程序部分都必须放在类定义里。

上面的HelloWorld.java程序是一个简单的程序,但还不是最简单的Java程序,最简单的Java程序是只包含一个空类定义的程序。下面将编写一个最简单的Java程序。

程序清单:codes\01\1.5\Test.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:\Java\jdk-9\lib\dt.jar;D:\Java\jdk-9\lib\tools.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讲义(第四版)》

经典Java读物基于Java 9抢先升级面世,赠送包含1500分钟课程讲解的视频、源代码、电子书、课件、面试题,提供微信+QQ答疑群,配套学习交流网站

李刚 编著

ISBN 978-7-121-33108-4

2018年1月出版

定价:109.00元

读者评论

相关专题

相关博文

  • (三)spring cloud云服务架构代码结构详细讲解

    Omaye 2017-11-28

    上一篇我们介绍了spring cloud云服务架构 - particle云架构代码结构,简单的按照几个大的部分去构建代码模块,让我们来回顾一下: 第一部分: 针对于普通服务的基础框架封装(entity、dao、service、co...

    Omaye 2017-11-28
    382 1 4 4
  • Spring Cloud构建微服务架构—服务消费基础

    醜人 2017-11-14

    使用LoadBalancerClient 在Spring Cloud Commons中提供了大量的与服务治理相关的抽象接口,包括DiscoveryClient、这里我们即将介绍的LoadBalancerClient等。对于这些接口的...

    醜人 2017-11-14
    47 1 2 2
  • Spring Cloud构建微服务架构—配置中心

    醜人 2017-11-17

    Spring Cloud Config是Spring Cloud团队创建的一个全新项目,用来为分布式系统中的基础设施和微服务应用提供集中化的外部配置支持,它分为服务端与客户端两个部分。其中服务端也称为分布式配置中心,它是一个独立的微服务...

    醜人 2017-11-17
    152 2 2 2