在Java中 - “默认包的静态成员无法导入” - 有人可以解释这个声明吗?

2022-09-03 13:08:47

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


答案 1

这意味着,如果在默认包中定义了一个类(这意味着它没有任何包定义),则无法将其静态方法导入另一个类中。因此,以下代码将不起作用:

// 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();
  }
} 

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

这个错误报告有一些关于Java为什么这样做的讨论,它最终被关闭为“不是缺陷” - 这是Java被设计的行为方式。默认包只是有一些意外的行为,这是鼓励程序员永远不要使用默认包的原因之一。


答案 2

正如@kageb Brasee所提到的:确实,您无法对默认包中的类进行静态导入或非静态导入。

但是有一种情况,您可以在另一个类中使用(默认包的)类: -> 只有当并且仅当该类(您希望在其中使用默认包的类)也存在于默认包中时,才能执行此操作

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

例如。如果我想导入位于我的程序中的类(位于默认包中)temp.classHome/files/temp.classuse.java

然后只需在编译时设置,您可以通过两种方式进行设置:永久设置或临时设置(不使用技术术语)CLASSPATH )

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

所以在这种情况下:

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

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

注意:缺省情况下,类路径为 。(即表示同一目录)

在这种情况下:

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

希望它能帮助:)