//第一个java程序:HelloWorld.java
public class HelloWorld
{
public static void main(String[] args)
{
System.out.println("Hello Java!");
}
}
保存后,再编写第二个在包中的:
//HelloWorldInPackage.java在包中
package net.csdn.blog.antcsq;
public class HelloWorldInPackage
{
public static void main(String[] args)
{
System.out.println("Hello Java from antcsq.blog.163.com!");
}
}
二、编译和运行不在包中的HelloWorld
首先打开命令行窗口,进入到sources目录,可以看到刚才编写好的HelloWorld.java源文件,这时使用:javac HelloWorld.java命令会在当前目录下生成HelloWorld.class类文件,如果此时直接运行java HelloWorld是可以运行成功的。
但是如果想将class类文件直接生成在classes目录中,这样需要在JAVAC命令中使用-d参数,该参数指定编译后的类文件的存放目录。因此,需要使用:
javac -d ../classes HelloWorld.java
这样就可以将HelloWorld.class文件直接生成在classes目录下了。
此时在sources目录下运行java HelloWorld有几种情况:
一种是classes目录已经在当前环境的classpath变量中进行了配置,那么系统会到该目录中查找,找到HelloWorld.class后就能正常运行。
另一种情况 ,classes目录不在classpath变量中,那么系统在classpath变量所包含的所有目录中查找完后,也没有找到HelloWorld.class文件,那么就会出现“找不到或无法加载主类 HelloWorld”的错误提示。这时可以修改classpath变量值,添加classes目录,如果不想修改classpath变量值,可以在java命令中使用-classpath(-cp)参数来设置临时变量:
java -cp ../classes HelloWorld即可运行。
三、编译和运行在包中的HelloWorldInPackage
使用包可以有效的避免不人员开发的类因同名而产生冲突,同时还可以更好的组织和规划多个类之间的逻辑关系。
我们先按照在包中的方法进行编译,即在sources目录下使用:
javac HelloWorldInPackage.java命令,编译后可以看到在sources目录下生成了HelloWorldInPackage.class文件,这时继续在该目录下运行该文件:
java HelloWorldInPackage,这时系统会出现”找不到或无法加载主类HelloWorldInPackage“的错误提示。
为什么会运行不成功呢?因为该JAVA程序处于包中,包名为net.csdn.blog.antcsq,
与没有使用包的程序有两点不同之处:
一是在使用java运行时必须使用类的全名,即在类名前增加包名,因此HelloWorldInPakcage.class的全名就变成了net.csdn.blog.antcsq.HelloWorldInPackage.class。
二是在包中的类必须位于与包名对应的目录结构中,该HelloWorldInPackage.class必须位于net/csdn/blog/antcsq这样的目录结构中。
那么现在我们已经生成了HelloWorldInPackage.class文件,它在sources目录中,没有放置在相对应的目录结构中,因此现在可以依次在sources目录中新建net/csdn/blog/antcsq目录结构,并将HelloWorldInPackage.class移动至antcsq目录中。这时我们再在sources目录下运行刚才的命令:java HelloWorldInPackage,还是出现同样的错误提示,仍然找不到类,因此该命令中只使用了类名,没有使用全名。我们再使用如下命令:
java net.csdn.blog.antcsq.HelloWorldInPackage
可以看到运行成功了。
但是这样运行包中的类,每次都要进行如此繁琐的操作,不仅效率低下,还容易出错。因此我们可以修改javac和java命令,使其自动生成包结构:
因此,在sources目录下编译时,可使用-d参数,一旦使用了-d参数,javac命令会自动在参数指定的目录下自动生成包结构:
javac -d ../classes HelloWorldInPackage.java
编译后我们看到classes目录下生成了net目录,再往下看依次生成了csdn、blog、antcsq目录,在antcsq目录中生成了HelloWorldInPackage.class文件。这时运行
java -cp ../classes net.csdn.blog.antcsq.HelloWorldInPackage可成功运行。
如果想在当前目录下生成包结构,-d参数后必须加 ”.“代表当前目录:
javac -d . HelloWorldInPackage.java注意-d和”.“之间要有一个空格。
四、使用JAVAC有几点需要注意:
一是-d参数可放在编译文件之前,也可放置在后面,如下面的语句也可以:
javac HelloWorld.java -d ../classes
二是-d参数的路径分隔符可以使用/,也可以使用\
三是-d参数的路径名中可以出现中文目录
三是如果源代码文件不在当前目录下,可在文件前加上路径,如当前目录是F盘,要编译刚才的HelloWorld.java,可以使用如下命令:
javac -d d:/java/study/classes d:/java/study/sources/HelloWorld.java
四是路径名中如果有空格,必须将整个路径名用英文双引号"引起来,如:
javac -d "../classes/my class" "e:/javasources/my src/HelloWorld.java"
五是使用-d参数时,指定的目录必须存在,否则会报错,如:
javac -d e:/errdir HelloWorld.java,如果e盘下没有errdir目录,javac命令不会自动生成该目录,只会报错
六是javac命令不区分大小写,如下命令也可运行:
javac -d ../ClasseS heLLowOrld.java
七是如果类在包中,javac中-d参数或者classpath变量值中的类路径指向的最终路径,应该是该类的包的顶极目录,如对于net.csdn.blog.antcsq.HelloWorldInPackage类,它虽然存放在classes/net/csdn/blog/antcsq这样的多级目录下,但它的类路径仍是在classes下面,即-d参数和classpath类路径应指向d:/java/study/classes即可,如果指向antcsq目录,而该目录下又没有net/csdn/blog/antcsq这样的包结构,则会运行失败。
五、使用JAVA命令有几点要注意:
一是-cp参数只能放在运行的类前,下面的命令会报错:java HelloWorld -cp ../classes
二是-cp参数时可以使用相对路径,如前所示,也可以使用绝对路径:
java -cp d:/java/study/classes HelloWorld
三是-cp参数中的路径分隔符可以使用/,也可以使用\
四是-cp参数中如果有多个路径,其间用”;“分隔。