这是因为我们已经在目录sky2098.shiyanjun.keller内部了,所以访问不到MyPackage类了。
然而,如果我们拥有成千上万的类,要在磁盘上创建目录,工作量会很大,Java提供了自动生成目录的命令,我们可以这样做:
java源文件为:
package aa.bb.cc.test;
class Test...{
public static void main(String[] args)...{
System.out.println("Test a package!!!");
}
}在D:\javae\Lesson3目录下,编译后运行命令:
javac -d . Test.java
亦即 javac空格横d空格点空格Test点java
编译成功:

这样,就可以自动在我们的磁盘上创建目录D:\javae\Lesson3\aa\bb\cc\test:

这样,在比较大的项目开发中可以节省相当大的工作量。
关于javac的用法,可以查看DOS下的帮助:

通过帮助,我们也可以指定存放生成的类文件的路径,比如,在在D:\javae\Lesson3目录下,执行命令:
javac -d e:\java Test.java
亦即 javac空格横d空格e:\java空格Test点java
编译成功:

则在e:\java\目录下生成了目录aa\bb\cc\test,并且类文件Test.class存放在e:\java\aa\bb\cc\test目录下:

如果我们想要访问执行D:\java\aa\bb\cc\test目录下的Test.class文件,可以先设置classpath,在通过包访问:

但是这个运行的并不是我们实际想要运行的e:\java\aa\bb\cc\test目录下的Test.class文件。
因为我们设置classpath时%classpath%;表明了是当前目录,在当前目录下就已经找到Test.class文件,并成功运行了。
如果把当前目录d:\java\aa\bb\cc\test下的Test.class文件删除掉,就会出错:

也就是d:\java\aa\bb\cc\test目录下的不存在Test.class文件,所以无法访问。
因为在java文件中aa.bb.cc.test.Test是一个类,必须指明aa.bb.cc.test.Test的路径,即为E:\java,然后才能通过E:\javae\Lesson3>java aa.bb.cc.test.Test执行E:\java\aa\bb\cc\test目录下的Test.class文件。
设置classpath的命令为:
set classpath=%classpath%;e:\java;d:\java\aa\bb\cc\test;
编译运行:

如果我们切换到目录e:\java\aa下,然后运行命令:
set classpath=.
java aa.bb.cc.test.Test
则会出错:

这是因为我们已经在aa目录下了,通过java aa.bb.cc.test.Test执行e:\java\aa\bb\cc\test目录下的Test.class文件会失败。
我们想要访问到e:\java\aa\bb\cc\test目录下的Test.class文件,必须退回到a/bb/cc/test/的上一级目录后运行:

这样才能访问到e:\java\aa\bb\cc\test目录下的Test.class文件。
【疑问】如果我们想在e:\java\aa目录下访问执行e:\java\aa\bb\cc\test目录下的Test.class文件,应该如何访问呢?
我们可以通过D:\jdk1.5.0_06\jre\lib目录下的rt.jar文件,用WinRAR打开可以看到Sun公司为我们提供的包的组织形式:

其中有sunw,sun,org,META-INF,javax,java,com七个包,分别在这个七个目录下找到相应的类。
我们也可以反编译各个类文件(.class)查看java源文件(.java)。
■ 关于访问权限
同一个类中:public,protected,default,private修饰的方法都可以被访问;
同一个包中:public,protected,default修饰的方法都可以被访问,而private修饰的方法都不可以被访问;
类的子类中:public,protected修饰的方法都可以被访问,而default,private修饰的方法都不可以被访问;
不同的包中:public修饰的方法都可以被访问,而protected,default,private修饰的方法都不可以被访问。
■ 关于final
为了确保某个函数的行为在继承过程中保持不变,并且不能被覆盖(overridden),可以使用final方法。
为了效率上的考虑,将方法声明为final,让编译器对此方法的调用进行优化。要注意的是:编译器会自行对final方法进行判断,并决定是否进行优化。通常在方法的体积很小,而我们确实不希望它被覆盖时,才将它声明为final。
class中所有的private和static方法自然就是final。
■ 关于abstract
在类中没有方法体的方法,就是抽象方法。
含有抽象方法的类,即为抽象类。
如果一个子类没有实现抽象基类中所有的抽象方法,则子类也成为一个抽象类。
我们可以将一个没有任何抽象方法的类声明为abstract,避免由这个类产生任何的对象。
构造方法、静态方法、私有方法、final方法不能被声明为抽象的方法。
■ 关于native
native方法是用户在Java中可以使用,但不能编写的方法。
■ 关于JNI技术
JNI(Java Native Interface),它允许Java虚拟机(JVM)内部运行的Java代码能够与用其它编程语言(如C、C++、汇编语言)编写的应用程序和库进行互操作。

