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