第2章 从JDK到IDE
2.1 从Hello World开始
2.1.1 撰写Java源代码
在正式撰写程序之前,请先确定你可以看到文档的扩展名。在Windows下默认不显示扩展名,这会造成重新命名文件时的困扰,如果目前在“资源处理器”下无法看到扩展名,在文件夹与选项中进行修改。
图2.1 文件夹选项
接着选择一个文件夹来撰写Java源代码。本书都是在c:\workspace文件夹中撰写程序,请新创建一个“文本文件”,并重新命名文件为HelloWorld.java(默然说话:如果你是初学者,请严格按照大小写的规范在命名文件名,这是非常重要的!)。由于将文本文件的扩展名从.txt改为.java,系统会询问是否更改扩展名,请确定更改,接着在HelloWorld.java上右击,从弹出的快捷菜单中选择编辑命令,并开始写代码(默然说话:本人强烈推荐使用NotePad++,有缩进功能,有关键字变色功能,非常方便,目前国内各软件管理(如金山,360等的软件管理管家之类的软件)均可下载并安装,占用空间不大的。右击之后选择“NotePad++”就可以了)。
图2.2重命名的警告框
这个文件有几点必须注意:
扩展名是.java。
文件名与类名必须相同。类名是指class关键字后的名称,这个范例就是HelloWorld这个名称,这个名称必须与HelloWorld.java的文件名相同(默然说话:再次强调,大小写要一致)。
注意每个字母的大小写。Java程序区分大小写,System和system对Java程序来说是完全不一样的名称。
空格只能是半角空格或Tab字符。有些初学者可能不小心输入了全角空格符,这很不容易检查出来(默然说话:唉,我觉得如果你真是初学者,还是找个培训机构,那种有老师指导的,跟着学个一年半载的。因为计算机编程真的不是你可以买几本书,看几个视频就可以学会的,有个老师真人指导你,你的进步会很快)。
图2.3 第一个程序:Hello World
- 定义类
class是用来定义类的关键词,之后接上类名称(HelloWorld)。Java程序规定,所有程序代码都要定义在“类”中。Class前有个public关键词,表示HelloWorld类是公开类,就目前为止你只要知道,一个.java文件可定义多个类,但是只能有一个公开类,而且文件名必须与公开类名称相同。 - 定义区块(Block)
在程序中使用大括号“{”和“}”定义区块,大括号两两成对,目的在于区别程序代码范围。例如,程序中HelloWorld类的区块包括了main()方法,而main()方法的区块包括了一句显示信息的程序代码。 - 定义main()方法
程序执行的起点就是程序进入点,Java程序执行的起点是main()方法。规定main()方法的形式一定得是:
public static void main(String[] args)
虽然说main()
方法是规定,不过其实日后你理解每个关键词的意义,还是可以就每个元素加以解释。main()方法是public成员,表示可以被JVM公开执行;static表示JVM不用生成类实例就可以调用;Java程序执行过程的错误,都是以例外方式处理,所以main()不用传回值,声明为void即可;String[] args可以在执行程序时,取得用户指定的命令行参数。 - 编写代码(Statement)
来看main()中的一行代码:
System.out.println(“Hello World”);
代码是程序语言中的一行指令,简单地说,就是程序语言中的“一句话”。注意每句代码的结束要用分号(;),这句描述的作用,就是请系统的输出装置显示一行文字Hello World。
其实你使用了java.lang包中System类的public static成员out,out参考PrintStream实例,你使用PrintStream定义的println()方法,将指定的字符串(String)输出至文本模式上。println()表示输出字符串后换行,如果使用print(),输出字符串后不会换行。
其实我真正想说的是:一个基本的Java程序这么写就对了。一下子要接受如此多概念的确不容易,如果现阶段无法理解,就先当这些是Java语法的规定,相关概念在本书之后各章节还会详细解释,届时自然就会了解第一个Java程序是怎么一回事了。
2.1.2 PATH是什么
第1章谈过*.java必须编译为*.class才可以在JVM中执行,Java的编译工具程序是javac。装好JDK之后,javac就会放在JDK安装文件夹的bin文件夹中,我们转到“命令提示行”模式,然后执行相关命令。
图2.4 执行失败!
命令不对?为什么?这是操作系统Windows在报怨,它找不到javac。如果你告诉它javac放在哪里,它就能正常执行了。
图2.5 指定工具程序位置
javac如果编译成功,会静静的结束,所以没有看到信息就是好消息,但是这样下指令实在太麻烦了,每次都要指定路径。能不能让操作系统“记住”这个路径,然后每次只要输入javac命令,操作系统自已会去找到javac呢?
当你输入一个命令而没有指定路径信息时,操作系统会依照一个叫PATH的环境变量中设定的路径顺序,依次寻找各路径下是否有这个指令。可以执行echo %path%来查看目前系统PATH环境变量中包括哪些路径信息。PATH就是操作系统“记住”路径的变量。
图2.6 设定path环境变量
所以,要让操作系统“记住”路径,那就是把该路径添加到PATH变量中即可。在Windows中的命令就是set path=”c:\program files\java\jdk1.8.0_51\bin”;%path%(默然说话:注意在最后结束要加上分号(;)%path%,如果不加,以前的path会被全部丢失,这会是一个很严重的问题,因为你会发现你原来可以执行的各种命令全执行不了啦,搞不好,你得重装系统了。)
设定若是有多个路径,使用分号(;)进行分隔。
不过在“命令提示符”模式中设定,关掉“命令提示符”之后,下次还得重新设定。为了方便,可以在“用户环境变量”或“系统环境变量”中设定path。在windows7/8中可以右击“计算机”图标,在弹出的快捷菜单中选择“属性”,在打开的窗口中单击“高级系统设置”超链接,进入“系统属性”对话框,接着切换至“高级”选项卡,单击“环境变量”按钮,在“环境变量”对话框的“系统变量”列表中编辑PATH变量。(默然说话:最好在系统变量下面编辑,因为这里是一个全局变量,不会因为你换了个用户登录,然后又要重新设置一遍。)
图2.7设定系统变量
在完成相应的path设定之后,一定要记得重新启动“命令提示符”模式,这样刚做的设定才能生效。
另外建议将JDK的bin路径放在Path变量的最前方,因为系统搜索路径时,会从最前的路径开始找,如果找到就会直接执行。如果有重名的命令,放在不同的路径下,那先找到哪个就执行哪个。
2.1.3 JVM与CLASSPATH
完成编译HelloWorld.java之后,相同文件夹下就会出现HelloWorld.class。JVM的可执行文件就是.class,接下来要启动JVM,要求JVM执行HelloWorld。
启动JVM的命令是java,而要求JVM执行HelloWorld时,只要指定类名称就可以了,不用附加.class扩展名,附加.class反而报错。
然后,这里又涉及了一个问题:JVM如何找到所需要执行的class文件?JVM同样需要知道路径才能找到所需要执行的class文件。而JVM使用CLASSPATH这个环境变量来“记住”各种路径。画个表吧。
操作系统 | 搜索路径 | 可执行文件 |
---|---|---|
Windows | PATH | .exe、.bat |
JVM | CLASSPATH | .class |
如何在启动JVM时告知可执行文件(.class)的位置?可以使用-classpath(缩写-cp)参数来说明。多路径同样使用分号(;)分隔。路径搜索原则也是按先后顺序搜索,先找到先加载。
另外一个问题,就是JVM比较笨,如果你不提醒它,它是不会搜索当前路径下的类文件的,当前路径我们用点(.)表示。所以通常在classpath里,我们会在最前面写一个“.;”,以提醒JVM首先找下当前路径有没有我们要执行的类文件。
要执行Java程序,不可避免的一定会用到Java提供的类库,这也是Java方便的原因:不仅仅只有个简单的语法支持,还提供了功能丰富好用的类库(默然说话:这就是称Java为平台,而不仅仅把它叫语言的原因),Java的类库通常封装为JAR文件(默然说话:我叫它们“架包”),也就是扩展名为.jar的文件。这种文件使用ZIP格式压缩,里面都是.class文件(默然说话:对,自制jar包的方法就是把自己写的.class文件用zip压缩,然后把扩展名.zip直接重命名为.jar就完成了)。
如何在你的程序中指定这个jar文件的路径呢?其实很简单,使用classpath即可。例如,我们有tool.jar和rt.jar两个类库在c:\lib下面,可以这样写:
java –cp .;c:\lib\tool.jar;c:\lib\rs.jar HelloWorld
上面的这个路径几乎我们每运行一个程序时都是会使用到的classpath,如果每次都这样写实在是很麻烦的。我们还可以新增一个环境变量来设置。操作步骤和前面编辑path环境变量的步骤一样,只是path是Windows已默认存在的变量,我们需要找到它,并进行“编辑”,而classpath却是Windows原来不存在的,所以最后一步不是“编辑”,而是点“新建”按钮。然后增加一个叫classpath的环境变量(默然说话:同样强烈建议在系统变量那一部分去增加,以避免人品错误出现。)
2.1.4 编译程序(javac)与CLASSPATH
编译形成类文件与执行类文件一样需要classpath。如果你不告诉它去哪儿找到你的类文件里引用的别的类,那编译只会告诉你一堆找不到的错误信息。
http://openhome.cc/Gossip/JavaEssence/ChickenOrEggFirst.html
2.2 管理源代码与字节码文件
如果程序规模稍大,一堆.java和.class文件放在一起,将会十分混乱,你需要有效率地管理源代码和字节码文件。
2.2.1 编译程序与SOURCEPATH
首先必须解决源代码文件和字节码文件放一起的问题。通常我们总是把源代码文件放在一个叫src的文件夹里,而字节码文件放在一个叫classes的文件夹里。而javac的-sourcepath就是用来在编译程序时指定源代码文件在哪里的参数,-d参数就是用来指定字节码文件放在哪个文件夹里。如下:
javac –sourcepath src –d classes src/Main.java
指定了这样的路径,编译程序(javac)就会自动在src下面自动查找Main的源代码文件及所需要的源代码文件(.java),把编译好的字节码(.class)文件自动放到classes文件夹里了。
2.2.2 使用package管理类
上一节谈到使用sourcepath进行管理类和文件,比起不管理,的确好很多,但还不够好。因为这其实是对文件的管理,并非对类的管理。我们应该把类也分门别类的进行放置,这样使用的过程中才能更方便查找。
一个应用程序会有多很个类彼此合作,目前通常会让很多个团队共同分工,完成应用程序的各个功能,最后再组合在一起。那么若A部门写了个Util并编译为Util.class,B部门也写了个Util并编译为Util.class。整合时,就相互覆盖了,如果连源代码也要统一进行管理,那源代码文件也极有可能相互覆盖。
Java语法中,提供了一个package(包)关键词,可以协助你达到这个目的。
包通常会用组织或者单位的网址命名。举例来说,我的网址是speakermore.com.cn,包就会反过来命名为cn.com.speakermore,由于网址都是独一无二的,这样的命名方式,比较不会与其他组织或单位的包名称发生同名冲突。
当类文件开始使用package进行分类时,就会具有四种管理上的意义:
原代码文件要放在与package所定义名称层级相同的文件夹中。
package所定义名称与class所定义名称,共同组成完全限定名(Full Qualified Name)。
类文件要放置在与package所定义名称相同的文件夹中。
需要让包可以轻松使用的类或方法必须声明为public。
- 源代码文件与包管理
目前计划将所有源代码文档放在src文件夹中管理,由于没有工具,所以目前必须手动建立文件夹。
这样做的好处显而易见,日后若不同组织或单位的源码要放在一起管理,就不容易发生源码文件彼此覆盖的问题 - 完全限定名
在源代码中指定使用某个类时,如果是相同包中的类,只要使用类名即可,如果是不同的包,则必须使用完全限定名。
这样做的好处是,如果另一个组织或单位有同名的类,也不会出现重复的类名。名称冲突问题轻松解决。 - 类文件与包管理
(默然说话:此处无解释内容)
2.2.3 使用import偷懒
使用包管理,解决了类文件与编写程序时类名称冲突的问题,但若每次写程序时,都要输入完全限定名,会非常麻烦。所以Java提供了一个偷懒的关键字:import。
只要在文件的开头import编写程序时会用到的包名称,你在程序中只要直接写类名就可以了。import让你少打字符,让编译程序多做事情。你就可以偷懒了。“少干活,多挣钱”,真正的好办法。
如果同一个包下会使用到很多类,你可以这样写import:
import cn.com.speakermore.*
;
不过有一种情况需要注意。比如你写了一个Date类。
package cn.com.speakermore;
public class Date{
…
}
然后你在别的类里写了如下代码:
import cn.com.speakermore.*;
import java.util.*;
public class Test{
public static void main(String[] args){
Date today;
…
}
}
编译时,就会看到错误信息:
图2.8 编译错误:类引用不明确
当编译器分析Test.java时,他会记住,如果遇到不知名的类时,到cn.com.speakermore和java.uitl这两个包下面去找,但是结果它发现这两个包下面都有一个叫Date的类,于是,编译器,醉了。
如果我们遇到这种情况,就必须明确的写出Date是哪个类,也就是用前面提到的完全限定名来描述Date,具体的代码就象这样。
import cn.com.speakermore.*;
import java.util.*;
public class Test{
public static void main(String[] args){
//默然说话:带包名的类名称为完全限定名。
cn.com.speakermore.Date today=new cn.com.speakermore.Date();
…
}
}
这样就能过编译了。
在Java中有许多常用类,它们是放在java.lang包下的,所以编译会默认帮你导入这个包,所以我们无需专写个import语句来导入java.lang包(默然说话:当然,你如果你喜欢写,那就写吧,反正然并卵,写不写都一样的。)
类在同一个包,也不需要写import,因为编译器看到类名时,就会先在同包中寻找,找不到才会找别的import包。
2.3 使用IDE
通过前面的学习,大家一定已经感觉到了,写个Java程序是如何的麻烦呀,还是去吃碗杂酱面压压惊吧。呵呵~还是考虑使用IDE(integrated Development Environment)吧,IDE可以帮助你搞定这些七七八八的杂碎,让你集中精力去解决你应该重点去解决的问题。
2.3.1 IDE项目管理基础
在Java领域,有太多的IDE,其中有不少是优秀的开放源代码产品。最常见的有Eclipse、Jdeveloper等。不同的IDE可能会有不同的特色,但基本概念是一样的,最重要的是,只要你了解JDK与相关指令操作,就不容易被特定的IDE给限制。
我们将选择NetBeans IDE进行基本介绍,选择它的原因在于,NetBeans直接使用你安装的JDK,而它给予我的们帮助足够方便,更为重要的一点是,它是全中文的。
可以到NetBeans IDE下载页面获取, 它分为很多版本,就我们所范围来看,选择基本版(Java SE)就可以了,当然你也可以选择完全版(All)。(默然说话:我是下载的All)
网址:http://netbeans.org/downloads/
默然说话:不知道为何,我现在点开这个链接,打开非常慢,可能我们需要多点耐心等它打开。不着急,慢慢来,会比较快。
图2.9 NetBeans下载页面
下载之后安装,基本上就是点下一步就可以了。
在IDE中要写程序,第一步就是新建项目,在NetBeans下面,可以这样新建项目。
-
(1)选择文件|新建项目…命令,在弹出的”新建项目”对话框的“类别”列表中选择Java文件夹,在“项目”列表中选择“Java应用程序”,接着单击下一步。
图2.10 新建项目
-
(2)在“项目名称”文本框中输入项目名称Hello2,在“项目位置”文本框中输入c:\workspace,注意,“项目文件夹”会保存至”c:\workspace\hello2”。
图2.11 新建项目(点击下一步后)
- (3)在“创建主类”文本框中输入cn.com.speakermore.Main,这表示会有个Main类放在cn.com.speakermore包中,其中会自动建立main()入口方法,接着单击完成按钮建立新的项目。
图2.12 新建项目完成后NetBeans界面
项目建立后,IDE会在左边显示项目,方便你检视一些项目资源。在图2.13中可以看到“源包”中包含cn.com.speakermore,其中有Main.java,这方便你以包为单位查看源代码文件。“库”中看到使用了JDK1.8,里面有许多的jar文件(默然说话:我读做“驾”包,我还听到有人读作“炸”包,“抓”包的,呵呵,大家看着办吧,反正我是读“驾”包了。实在是不太知道怎么读,那就读做j-a-r包吧),这些表示IDE管理的CLASSPATH会包括这些JAR文件。
图2.13 NetBeansIDE的“项目”选项卡(新建项目后的左侧出现)
点击“项目”右侧的“文件”选项卡,你可以看到实际的文件情况。这是一个以文件夹形式显示的情况。
图2.14 NetBeans的“文件”选项卡
这个就是hello2文件夹里的内容,就目前来说,可先注意build/classes,与src文件夹。classes就是字节码文件(.class)的存放位置,而src就是源文件的存放位置。两个文件夹里都会按package的指定创建对应的文件夹结构。这都是IDE完成的,这就是IDE的作用,让我们少干活,多挣钱。
如果要运行这个项目,可以直接单击工具栏上的“运行”按钮(一个绿色的三角),也可以按F6。在IDE的下方就会弹出“输出”选项卡显示输出结果。
图2.15 NetBeans的“运行”选项卡
在IDE中编辑程序代码,若出现红色虚线,通常表示那是导致编译错误的语法。如果看到红色虚线就把光标移至红色虚线上,就会显示编译错误信息。
图2.16 红色虚线表示有编译错误
对于编译错误,如果按下Alt+Enter组合键,就会给出改错建议,当然你也可以点击左边行号上出现的小灯泡(默然说话:在这个改错提示上,我觉得还是Eclipse比较方便,因为你不需要按任何的快捷键,也不需要把鼠标移动到边上,直接放红虚线上,错误信息和改错建议同时出现)。
2.3.2 使用了哪个JRE
你的计算机中可能不只存在一套JRE。某些程度上,可以将一个java.exe就视作有一套JRE。
如果你在安装JDK时选择安装了JRE,那么你的计算机上就有了2套JRE。那计算机如何决定使用哪个JRE呢?
首先找到java.exe,然后再根据Java.exe的位置寻找可用的JRE。
是否在java.exe的文件夹下有链接库?
是否在上一层路径中存在jre文件?
在刚到一个新开发环境时(例如到客户那边去),先确认版本是很重要的一件事。cmd模式下若要确认JRE的版本,可以使用java –version查看。
如果要使用NetBeans来更换JRE,可以先在“工具”|“Java平台”命令,找开“Java平台管理器”对话框,单击“添加平台”按钮。
图2.17 工具菜单
第2步在打开的“添加Java平台”对话框中,选择想要的JDK目录,单击“下一步”按钮。
图2.18 Java平台管理器
第3步确认预设的“平台名称”“平台源”和“平台javadoc”是你想要的设定值后,单击“完成”按钮完成平台添加。
图2.19 确认选择正确,点“完成”按钮
完成平台的建立之后,可以在项目属性中进行更换。
2.3.3 类文件(.class)版本
如果使用新版本JDK编译出字节码文件(.class),在旧版JRE上执行,就会发生错误UnsupportedClassVersionError。
在cmd,可以使用JDK工具程序javap加上-v或-verbose参数,来确认类文件(.class)的版本号。
在Java程序中,可以使用System.getProperty(“java.class.version”)
取得JRE支持的类文件版本号。使用System.getProperty(“java.runtime.version”)
取得JRE运行时的版本号
图2.20 System.getProperty()的执行结果
默然说话:需要指出,Sun JDK1.0.2的JVM实现支持的类文件版本号为45.0-45.3。1.1.X支持45.0-45.65535(向前兼容),Java 2平台支持45.0-46.0,Java SE 5与6支持49.0-50.0,Java SE 7支持51.0,Java SE 8则支持52.0。
如果要在IDE中设定版本(-source与-target),NetBeans8.0可以在项目上右击,选择属性命令,打开“项目属性”对话框,在左边的“类别”中选择“源”,在右边的“源/二进制格式”列表框中选择JDK8。
图2.21 NetBeans项目属性
2.4 重点复习
在正式开始编写程序之前,请先确定你可以看到文件的扩展名(后缀)。写Java代码时有几点必须注意:
扩展名是.java。(默然说话:这是源代码文件的标志,不要问我为啥,大家都这么做,你也要一样。)
文件名必须与公有类的名称相同。(默然说话:同样是规范,没有为什么。而且这个如果不对,IDE会划到你天荒地老的红色波浪线)
注意每个字母的大小写。(默然说话:同样是规范,没有为什么。想用Java挣钱么?想就给我乖乖遵守!)
空格只能是英文空格。(默然说话:那边的同学,别挖鼻屎了,好好听着!只能是英文空格,你打个中文空格看我怎么修理你!!!)
main方法必须是:public static void main(String[] args)(默然说话:看好2件事,第一件事,这句英语的唯一大写字母是String的S,第二件,String后面有个中括号[],中括号,有木有!看到了有木有?!)
当然输入一个指令而同有指定路径时,计算机首先会在当前路径寻找该指令,如果找不到,计算机就会去path环境变量中指定的路径下去寻找该指令,直到找到第一个为止,如果找不到,就会报错,无法执行该指令。IDE也一样,只不过IDE可以自己设置路径,而不用去设置操作系统提供的path。
在JVM中执行某个类(.class)文件,就要告诉JVM该类应该在哪个路径下去寻找所用到的类文件,这是通过classpath来设置的,同样IDE也可以用可视化的方式进行设置。当前路径要使用点“.”明确指定。
Jar包实际就是使用ZIP格式压缩的文件,里面一堆.class。classpath只要指定到放有jar文件的文件夹即可。
源代码文件可以使用package关键字进行管理,把不同的源文件放到不同的文件夹中,形成文件夹层级。
package所定义的名称要与文件夹名称对应。
要跨包使用的类或方法必须声明为公有(public)
import只是偷懒的关键字,它可以让你不用使用完全限定名
2.5 课后练习
如果在hello.java中有如下代码:
public class Hello {
public static void main(String[] args) {
System.out.println("Hello World");
}
}
以下描述正确的是()
A.执行时显示Hello World
B.执行时出现NotClassDefFoundError
C.执行时出现找不到主要方法的错误
D.编译失败如果在Main.java中有如下代码:
public class Main {
public static void main(String[] args) {
System.out.println("Hello World");
}
}
以下描述正确的是()
A.执行时显示Hello World
B.执行时出现NotClassDefFoundError
C.执行时出现找不到主要方法的错误
D.编译失败如果在Main.java中有如下代码:
public class Main {
public static void main() {
System.out.println("Hello World");
}
}
A.执行时显示Hello World
B.执行时出现NotClassDefFoundError
C.执行时出现找不到主要方法的错误
D.编译失败如果在Main.java中有如下代码:
public class Main {
public static void main(string[] args) {
System.out.println("Hello World");
}
}
A.执行时显示Hello World
B.执行时出现NotClassDefFoundError
C.执行时出现找不到主要方法的错误
D.编译失败如果C:\workspace\Hello\classes中有以下源代码编译而成的Main.class
public class Main {
public static void main(String[] args) {
System.out.println("Hello World");
}
}
在“命令提示符”模式下你的工作路径是C:\workspace,那么执行Main类正确的是()
A.java C:\workspace\Hello\classes\Main
B.java Hello\classes Main
C.java –cp Hello\classes Main
D.以上皆非如果C:\workspace\Hello\classes中有以下源代码编译而成的Main.class
package com.speakermore
public class Main {
public static void main(String[] args) {
System.out.println("Hello World");
}
}
在“命令提示符”模式下你的工作路径是C:\workspace,那么执行Main类正确的是()
A.java C:\workspace\Hello\classes\Main
B.java Hello\classes Main
C.java –cp Hello\classes Main
D.以上皆非如果有个Console类的源代码开头定义如下:
package com.speakermore;
public class Console{
……
}
其完全限定名应该是()
A.com.speakermore.Console
B.package.com.speakermore.Console
C.com.speakermore.class.Console
D.以上皆非如果C:\workspace\Hello\src中有Main.java如下:
package com.speakermore;
public class Main{
public static void main(String[] args){
System.out.println(“Hello World”);
}
}
“命令提示符”模式下你的工作路径是C:\workspace\Hello,那么编译与执行Main类正确的是()
A. javac src\Main.java
java C:\workspace\Hello|classes\Main
B. javac –d classes src\Main.java
java –cp classes Main
C. javac –d classes src\Main.java
java –cp classes com.speakmore.Main
D. javac –d classes src\Main.java
java –cp classes/com/speakermore Main如果有个Console类的源代码开头定义如下:
package com.speakermore;
public class Console{
……
}
在另一个类中写import正确的是()
A.import com.speakermore.Console;
B.import com.speakermore;
C.import com.speakermore.*;
D.import Console;关于包以下描述正确的是()
A.要使用Java SE API的System类必须import java.lang.System;
B.在程序中import java.lang.System;会发生编译错误,因为java.lang中的类不用import
C.import 并不影响执行效能
D.程序中import com.speakermore.Main,执行java指令时只要写下java Main就可以了。