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

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

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

图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 在地址栏中显示完整路径

读者可以通过复制地址栏里的字符串来设置环境变量,而不是采用手动输入,从而减少出错的可能。

2.大小写问题

前面已经提到:Java语言是严格区分大小写的语言。但由于大部分读者都是Windows操作系统的忠实拥护者,因此对大小写问题往往都不够重视(Linux平台是区分大小写的)。

例如,有的读者编写的Java程序里的类是HelloWorld,但当他运行Java程序时,运行的则是java helloworld这种形式——这种错误的形式有很多种(对的道路只有一条,但错误的道路则有成千上万条)。总之,就是java命令后的类名没有严格按Java程序中编写的来写,可能引起系统提示如图3示的错误。
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_4_

李刚 编著

ISBN 978-7-121-33108-4

2018年1月出版

定价:109.00元

相关文章
|
2月前
|
Java 流计算
利用java8 的 CompletableFuture 优化 Flink 程序
本文探讨了Flink使用avatorscript脚本语言时遇到的性能瓶颈,并通过CompletableFuture优化代码,显著提升了Flink的QPS。文中详细介绍了avatorscript的使用方法,包括自定义函数、从Map中取值、使用Java工具类及AviatorScript函数等,帮助读者更好地理解和应用avatorscript。
利用java8 的 CompletableFuture 优化 Flink 程序
|
1月前
|
IDE Java 编译器
开发 Java 程序一定要安装 JDK 吗
开发Java程序通常需要安装JDK(Java Development Kit),因为它包含了编译、运行和调试Java程序所需的各种工具和环境。不过,某些集成开发环境(IDE)可能内置了JDK,或可使用在线Java编辑器,无需单独安装。
72 1
|
27天前
|
SQL 安全 Java
Java 异常处理:筑牢程序稳定性的 “安全网”
本文深入探讨Java异常处理,涵盖异常的基础分类、处理机制及最佳实践。从`Error`与`Exception`的区分,到`try-catch-finally`和`throws`的运用,再到自定义异常的设计,全面解析如何有效管理程序中的异常情况,提升代码的健壮性和可维护性。通过实例代码,帮助开发者掌握异常处理技巧,确保程序稳定运行。
40 0
|
2月前
|
Java Maven 数据安全/隐私保护
如何实现Java打包程序的加密代码混淆,避免被反编译?
【10月更文挑战第15天】如何实现Java打包程序的加密代码混淆,避免被反编译?
229 2
|
2月前
|
安全 Java Linux
java程序设置开机自启
java程序设置开机自启
159 1
|
2月前
|
运维 Java Linux
【运维基础知识】Linux服务器下手写启停Java程序脚本start.sh stop.sh及详细说明
### 启动Java程序脚本 `start.sh` 此脚本用于启动一个Java程序,设置JVM字符集为GBK,最大堆内存为3000M,并将程序的日志输出到`output.log`文件中,同时在后台运行。 ### 停止Java程序脚本 `stop.sh` 此脚本用于停止指定名称的服务(如`QuoteServer`),通过查找并终止该服务的Java进程,输出操作结果以确认是否成功。
75 1
|
2月前
|
Java Python
如何通过Java程序调用python脚本
如何通过Java程序调用python脚本
43 0
|
1天前
|
Java
Java—多线程实现生产消费者
本文介绍了多线程实现生产消费者模式的三个版本。Version1包含四个类:`Producer`(生产者)、`Consumer`(消费者)、`Resource`(公共资源)和`TestMain`(测试类)。通过`synchronized`和`wait/notify`机制控制线程同步,但存在多个生产者或消费者时可能出现多次生产和消费的问题。 Version2将`if`改为`while`,解决了多次生产和消费的问题,但仍可能因`notify()`随机唤醒线程而导致死锁。因此,引入了`notifyAll()`来唤醒所有等待线程,但这会带来性能问题。
Java—多线程实现生产消费者
|
3天前
|
安全 Java Kotlin
Java多线程——synchronized、volatile 保障可见性
Java多线程中,`synchronized` 和 `volatile` 关键字用于保障可见性。`synchronized` 保证原子性、可见性和有序性,通过锁机制确保线程安全;`volatile` 仅保证可见性和有序性,不保证原子性。代码示例展示了如何使用 `synchronized` 和 `volatile` 解决主线程无法感知子线程修改共享变量的问题。总结:`volatile` 确保不同线程对共享变量操作的可见性,使一个线程修改后,其他线程能立即看到最新值。
|
3天前
|
消息中间件 缓存 安全
Java多线程是什么
Java多线程简介:本文介绍了Java中常见的线程池类型,包括`newCachedThreadPool`(适用于短期异步任务)、`newFixedThreadPool`(适用于固定数量的长期任务)、`newScheduledThreadPool`(支持定时和周期性任务)以及`newSingleThreadExecutor`(保证任务顺序执行)。同时,文章还讲解了Java中的锁机制,如`synchronized`关键字、CAS操作及其实现方式,并详细描述了可重入锁`ReentrantLock`和读写锁`ReadWriteLock`的工作原理与应用场景。