在 Java 中使用完全限定名称和导入之间的区别

Difference between using fully qualified name and import in Java

在 Java 中使用 "inline import"(完全限定名称)和正常导入在性能、内存、编译时间等方面是否存在差异?

chooser.setCurrentDirectory(new java.io.File("."));

import java.io.File;
...
   chooser.setCurrentDirectory(new File("."));

不,两者在性能、内存、编译时间方面完全相同。它们之间的唯一区别是普通导入节省了您的输入工作,而且它更具可读性。

如果您在 一个 class 中导入 同名 的 class,您可以明确告诉在哪里使用哪个(完整 class 名称):

import java.io.File;
...
chooser.setCurrentDirectory(new File(".")); // java.io.File

new org.yourpackage.File("sdfsdf");         // org.yourpackage.File

不,它不会影响代码的性能。 导入语句使您的代码更具可读性,因为您没有写下所有包名。 但有时,您会遇到类名冲突,那么建议使用限定名称。

您应该关注的主要是可读性。我发现第二个更具可读性。

在极少数情况下,我更喜欢第二种方法。让我们考虑以下场景:出于某种原因,我写了一个 class 并将其命名为 File。我输入了 File file = new File(...),我的 IDE 自动为我导入了 java.io.File。但是我不要那种对象,我要myFileclass。因此,我更喜欢内联导入而不是导入正确的 class,只是其他用户不会与 Java 的 File class.

关于性能,它们完全相同,这就是证据 -

这是为第一个片段生成的字节码:

public class java8.tests.General {
  public java8.tests.General();
    Code:
       0: aload_0
       1: invokespecial #1                  // Method java/lang/Object."<init>":()V
       4: return

  public static void main(java.lang.String[]);
    Code:
       0: new           #2                  // class javax/swing/JFileChooser
       3: dup
       4: invokespecial #3                  // Method javax/swing/JFileChooser."<init>":()V
       7: astore_1
       8: aload_1
       9: new           #4                  // class java/io/File
      12: dup
      13: ldc           #5                  // String .
      15: invokespecial #6                  // Method java/io/File."<init>":(Ljava/lang/String;)V
      18: invokevirtual #7                  // Method javax/swing/JFileChooser.setCurrentDirectory:(Ljava/io/File;)V
      21: return
}

这是第二个字节码:

public class java8.tests.General {
  public java8.tests.General();
    Code:
       0: aload_0
       1: invokespecial #1                  // Method java/lang/Object."<init>":()V
       4: return

  public static void main(java.lang.String[]);
    Code:
       0: new           #2                  // class javax/swing/JFileChooser
       3: dup
       4: invokespecial #3                  // Method javax/swing/JFileChooser."<init>":()V
       7: astore_1
       8: aload_1
       9: new           #4                  // class java/io/File
      12: dup
      13: ldc           #5                  // String .
      15: invokespecial #6                  // Method java/io/File."<init>":(Ljava/lang/String;)V
      18: invokevirtual #7                  // Method javax/swing/JFileChooser.setCurrentDirectory:(Ljava/io/File;)V
      21: return
}

In java classes 在最终字节码中总是由它们的完全限定名称引用。它发生在第一次创建 class 的对象(或访问 class 的静态成员时)。

也就是说,import 被编译器用来通过非限定名称访问 classes(MyClass 而不是 mypackage.MyClass)。

因此,导入 class 或显式写入完全限定名称之间存在 0 差异 - 这只是可读性问题,节省了一些输入并有助于防止 class 与同名。

仅在以下情况下才重要,

如果您想使用 class,它可以在多个包中使用。 即日期 class 在 java.util 和 java.sql

中可用

您可以在程序开始时导入上述 class 之一,并对另一个使用限定语法。