本文默认:您会使用cmd进行不带包的Java文件的编译和运行。(即javac **.java与java **)
1、一个带包的Java文件的编译与运行
首先编写了一个Main.java文件,注意代码中存在导包语句:package test;
在路径栏中输入cmd,从当前目录打开命令行
要知道,我们虽然写了package test; 但是我没不用自己手动创建test文件夹,而是使用如下命令进行编译,程序会自动产生test文件夹,并将class文件放在里面。
javac -d . *.java
那么如何运行呢?
java test.Main
便可运行
这里需要注意的是 java 命令 后面跟的参数是全类名,即带包名的类名,而不只是简写的类名。
(全类名:包名.类名)
2、辩证思考,如果反其道而行呢?
我们上面编译带包的Java文件是使用的 javac -d命令,如果我还是像编译不带包的Java文件那样编译呢,也就是使用javac命令,会发生什么?
实践是检验真理的唯一标准!
我们写一个简单的A.java文件
package test;
public class A {
String name;
int age;
public void setName(String _name){
this.name =_name;
}
public void setAge(int _age){
this.age = _age;
}
public String getName(){
return this.name;
}
public int getAge(){
return this.age;
}
public static void main(String[] args){
A a = new A();
//a.setName("zs");
a.name="zs";
a.setAge(18);
System.out.println(a.getName()+a.getAge());
}
}
我们直接用javac编译,看看会发生什么化学反应
我们发现编译通过了,并且在与Java文件同级目录下出现了对应的Class文件
接着我们运行一下
出现了这样的错误,原因是我们在 A.java 中有包声明,当执行 A.java 源文件时 java 虚拟机首先会在 A.java 当前目录寻找字节码文件,虽然这下找到了,但是因为在 A.java 中有包声明,java 虚拟机紧接着去包目录下寻找有没有 A.class 字节码文件,这下找到了才能够成功执行,不信我们做做实验!
这时我们发现执行还是不能通过??这时为什么呢?这里是许多新手遇到的问题,在这里大家必须谨记一点:Java 命令的参数是"类的完整类名",而不是"文件名"。
这个源程序的完整类名应该是 mypack.A,因此应该这么写:java test.A
这下就可以成功执行了!
3、包的导入创建编译
上面讲的这些都是一般情况,也就是类路径都是在当前目录下,当类路径不在当前目录下是否还能执行呢?又该如果执行呢?
如图我们把Main.java文件剪切到了上一级目录,Main的class文件在csdn/test下面
这时我们就需要自己设置 classpath 参数。例如:
运行成功