在Java-“无法导入默认包的静态成员” – 有人可以解释一下这句话吗?

在Java-“无法导入默认包的静态成员” – 有人可以解释一下这句话吗? 如果它有一个例子会更好。 我不确定它是否有一个非常简单的答案,但后来我试图理解,但无法弄明白。

这意味着如果在默认包中定义了一个类(意味着它没有任何包定义),那么就不能在另一个类中导入它的静态方法。 所以下面的代码不起作用:

// Example1.java public class Example1 { public static void example1() { System.out.println("Example1"); } } // Example2.java import static Example1.*; // THIS IMPORT FAILS public class Example2 { public static void main(String... args) { example1(); } } 

导入失败,因为您无法从默认包中的类导入静态方法,这是Example1的情况。 实际上,您甚至无法使用非静态导入。

这个错误报告讨论了为什么Java以这种方式行事,它最终被关闭为“不是缺陷” – 这就是Java的行为方式。 默认包只是有一些意想不到的行为,这是鼓励程序员从不使用默认包的原因之一。

正如@kageb Brasee所提到的:确实你不能对默认包中的类进行静态导入或非静态导入。

但是有一种情况你可以在另一个类中使用类(默认包): – >这只能在且当且仅当类(在其中使用默认包的类)也存在时才能这样做在默认包中

如果这两个类都在默认包中(无论它们存在于哪个位置),那么你可以使用它们(注意:我们不使用它们导入它们)

例如。 如果我想将位于Home/files/temp.class的类temp.class (位于默认包中) Home/files/temp.class到我的程序use.java

然后在编译时设置CLASSPATH ,你可以用两种方式做到这一点:永久设置或临时设置( 不使用技术术语

永久集:通过设置CLASSPATH(这是一个环境变量)变量(为不同的操作系统执行不同的方法) – >对于mac – >> export CLASSPATH=Home/files/在此方法中,CLASSPATH环境变量设置为您的terminal是开放的

所以在这种情况下:

  export CLASSPATH=Home/files/ javac use.java java use 

临时集 :在这个方法中,我们使用为java和javac(java编译器)工具提供的两个选项中的任何一个,它们是-classpath-cp (这两个都做同样的工作,它只是-cp-classpath简称) ,在这种为其他文件设置类路径的方法中,主要区别在于,在此类型中,文件的地址(路径)仅在语句执行完成时执行该命令(操作)的时间段内设置CLASSPATH(环境)的值 – >再次到达与之前相同的路径,

注意:默认情况下,CLASSPATH是。 (即代表同一目录)

在这种情况下:

  java -cp .:Home/files use.java // Note: don't forget . and : is for separating the different paths java use 

希望它有帮助:)