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

在Java中使用完全限定名和导入之间的区别,java,import,inline,Java,Import,Inline,在Java中,使用“内联导入”(一个完全限定的名称)和普通导入在性能、内存、编译时等方面有什么区别吗 chooser.setCurrentDirectory(new java.io.File(".")); 及 不,两者在性能、内存和编译时间方面完全相同。它们之间唯一的区别是,普通导入可以节省您的键入工作,而且更具可读性。如果您在一个类中导入相同名称的类,则可以显式告诉您要在何处使用哪一个(完整类名): 不,它不会影响代码的性能。 Import语句使代码更具可读性,因为您没有编写所有的包名。 但

在Java中,使用“内联导入”(一个完全限定的名称)和普通导入在性能、内存、编译时等方面有什么区别吗

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


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

如果您在一个类中导入相同名称的类,则可以显式告诉您要在何处使用哪一个(完整类名):


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

您应该关注的主要问题是可读性。我觉得第二个更可读

在极少数情况下,我更喜欢第二种方法。让我们考虑下面的场景:由于某种原因,我编写了一个类,并命名为<代码>文件< /代码>。我键入了
File File=new File(…)
,我的IDE自动为我导入了
java.io.File
。但是我不想要那种对象,我想要我的
文件
类。因此,与导入正确的类相比,我更喜欢内联导入它,只是为了其他用户不会被Java的
文件
类所迷惑

关于性能,他们完全一样,这是证据-

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

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
}
公共类java8.tests.General{
public java8.tests.General();
代码:
0:aload_0
1:invokespecial#1//方法java/lang/Object。“:()V
4:返回
公共静态void main(java.lang.String[]);
代码:
0:new#2//classjavax/swing/JFileChooser
3:dup
4:invokespecial#3//methodjavax/swing/JFileChooser。”“:()V
7:astore_1
8:aload_1
9:new#4//类java/io/File
12:dup
13:ldc#5//String。
15:invokespecial#6//方法java/io/File.“:(Ljava/lang/String;)V
18:invokevirtual#7//Method javax/swing/JFileChooser.setCurrentDirectory:(Ljava/io/File;)V
21:返回
}
这是第二个字节码:

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
}
公共类java8.tests.General{
public java8.tests.General();
代码:
0:aload_0
1:invokespecial#1//方法java/lang/Object。“:()V
4:返回
公共静态void main(java.lang.String[]);
代码:
0:new#2//classjavax/swing/JFileChooser
3:dup
4:invokespecial#3//methodjavax/swing/JFileChooser。”“:()V
7:astore_1
8:aload_1
9:new#4//类java/io/File
12:dup
13:ldc#5//String。
15:invokespecial#6//方法java/io/File.“:(Ljava/lang/String;)V
18:invokevirtual#7//Method javax/swing/JFileChooser.setCurrentDirectory:(Ljava/io/File;)V
21:返回
}

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

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


因此,导入类或显式编写完全限定名之间的区别为0—这只是可读性的问题,节省了一些键入,并有助于防止同名类之间的冲突。

仅在以下情况下才有意义

如果要使用多个包中可用的类。 i、 日期类在java.util和java.sql中可用


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

没有区别,只有第二个解决方案更具可读性。只有在类冲突的情况下才应该使用
内联导入
,否则,我建议您使用第二个,以提高可读性。当你测量出性能不好的东西时,还要担心性能。
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
}