当类文件很多时,我们按类的功能划分,放到不同的文件夹里。此时类之间的互相调用涉及到包互访的问题。包,就是文件夹。比如我在C盘根目录有个带主函数的Test文件,一个External文件,一个internal文件夹,在文件夹里有个Internal文件。我要从Test中调用External,在External中调用Internal。如下,
Test.java文件:
class Test
{
public static void main(String[] args)
{
System.out.println("Test调用外部类Ext");
External e=new External();
e.show();
}
}
External.java文件:
import internal.Internal; //导入和本类同级目录下的类
public class External
{
public voidshow()
{
System.out.println("这是外部Ext,调用内部的Int");
Internal i=new Internal();
i.show();
}
}
Internal.java文件:
package internal; //需要指定所在包,才能被和此包同级的类访问到
public class Internal
{
public voidshow()
{
System.out.println("内部Int,被外部Ext调用");
}
}
现在我想在Test中调用Internal,从Internal调用External,但是因为Java对于默认包的限制,不能从Internal中直接调用默认包中的External.class。所以我们需要给External一个包。
External文件:
package external;
public class External
{
public void show()
{
System.out.println("这是外部Ext,调用内部的Int");
}
}
Internal文件:
package internal; //需要指定所在包,才能被和此包同级的类访问到
import external.External; //导入需要的类
public class Internal
{
public void show()
{
System.out.println("内部Int,被外部Ext调用");
External e=new External();
e.show();
}
}
要想编译Test,须要首先存在Internal,要想编译Internal,须要首先存在External。
如果我们事先在根目录新建个external文件夹,在其中放入External.java文件是最容易理解的。我们不这样做,直接将External.java反正根目录,通过一个带参的编译命令也很容易完成这个动作。
这里我将默认包设为了e:\javatest。使用带-d参数的javac命令可以自动创建目录并将编译成的class文件放入。点空格和目录名空格的效果是一样的。
然后编译Internal文件,
再编译运行Test文件,
关于访问默认包下的类,整的我很凌乱。查找多方资料,说从 J2SE 1.4 开始,Java 编译器不再支持 import 进未命包(默认包)名的类、接口。非默认包(子包)中的类调用默认包里的类要用到反射。
我们修改三个文件,
编译中出现标注,略过,