import语句只在编译时有效

其实import了之后没用的话跟JVM啊classloader什么的完全没关系。
import语句只在编译时有效,编译过后不会带到class文件里的。所以import了之后用了的类的信息才会出现在编译出来的class文件里,没用的则不会出现。

有兴趣可以自己动手试试。

Java代码 复制代码  收藏代码
  1. //import java.util.regex.*;  
  2.   
  3. public class Test {  
  4.     public static void main(String[] args) {  
  5.         System.out.println("test");  
  6.     }  
  7. }  
//import java.util.regex.*;

public class Test {
    public static void main(String[] args) {
        System.out.println("test");
    }
}



那行import无论被注释掉还是没有被注释掉,编译出来的class文件的内容都是这样的:(javap -private -s -verbose Test)

Java代码 复制代码  收藏代码
  1. Compiled from "Test.java"  
  2. public class Test extends java.lang.Object  
  3.   SourceFile: "Test.java"  
  4.   minor version: 0  
  5.   major version: 50  
  6.   Constant pool:  
  7. const #1 = Method   #6.#15//  java/lang/Object."<init>":()V  
  8. const #2 = Field    #16.#17;    //  java/lang/System.out:Ljava/io/PrintStream;  
  9. const #3 = String   #18;    //  test  
  10. const #4 = Method   #19.#20;    //  java/io/PrintStream.println:(Ljava/lang/String;)V  
  11. const #5 = class    #21;    //  Test  
  12. const #6 = class    #22;    //  java/lang/Object  
  13. const #7 = Asciz    <init>;  
  14. const #8 = Asciz    ()V;  
  15. const #9 = Asciz    Code;  
  16. const #10 = Asciz   LineNumberTable;  
  17. const #11 = Asciz   main;  
  18. const #12 = Asciz   ([Ljava/lang/String;)V;  
  19. const #13 = Asciz   SourceFile;  
  20. const #14 = Asciz   Test.java;  
  21. const #15 = NameAndType #7:#8;//  "<init>":()V  
  22. const #16 = class   #23;    //  java/lang/System  
  23. const #17 = NameAndType #24:#25;//  out:Ljava/io/PrintStream;  
  24. const #18 = Asciz   test;  
  25. const #19 = class   #26;    //  java/io/PrintStream  
  26. const #20 = NameAndType #27:#28;//  println:(Ljava/lang/String;)V  
  27. const #21 = Asciz   Test;  
  28. const #22 = Asciz   java/lang/Object;  
  29. const #23 = Asciz   java/lang/System;  
  30. const #24 = Asciz   out;  
  31. const #25 = Asciz   Ljava/io/PrintStream;;  
  32. const #26 = Asciz   java/io/PrintStream;  
  33. const #27 = Asciz   println;  
  34. const #28 = Asciz   (Ljava/lang/String;)V;  
  35.   
  36. {  
  37. public Test();  
  38.   Signature: ()V  
  39.   Code:  
  40.    Stack=1, Locals=1, Args_size=1  
  41.    0:   aload_0  
  42.    1:   invokespecial   #1//Method java/lang/Object."<init>":()V  
  43.    4:   return  
  44.   LineNumberTable:   
  45.    line 30  
  46.   
  47.   
  48. public static void main(java.lang.String[]);  
  49.   Signature: ([Ljava/lang/String;)V  
  50.   Code:  
  51.    Stack=2, Locals=1, Args_size=1  
  52.    0:   getstatic   #2//Field java/lang/System.out:Ljava/io/PrintStream;  
  53.    3:   ldc #3//String test  
  54.    5:   invokevirtual   #4//Method java/io/PrintStream.println:(Ljava/lang/String;)V  
  55.    8:   return  
  56.   LineNumberTable:   
  57.    line 50  
  58.    line 68  
  59.   
  60.   
  61. }  
Compiled from "Test.java"
public class Test extends java.lang.Object
  SourceFile: "Test.java"
  minor version: 0
  major version: 50
  Constant pool:
const #1 = Method	#6.#15;	//  java/lang/Object."<init>":()V
const #2 = Field	#16.#17;	//  java/lang/System.out:Ljava/io/PrintStream;
const #3 = String	#18;	//  test
const #4 = Method	#19.#20;	//  java/io/PrintStream.println:(Ljava/lang/String;)V
const #5 = class	#21;	//  Test
const #6 = class	#22;	//  java/lang/Object
const #7 = Asciz	<init>;
const #8 = Asciz	()V;
const #9 = Asciz	Code;
const #10 = Asciz	LineNumberTable;
const #11 = Asciz	main;
const #12 = Asciz	([Ljava/lang/String;)V;
const #13 = Asciz	SourceFile;
const #14 = Asciz	Test.java;
const #15 = NameAndType	#7:#8;//  "<init>":()V
const #16 = class	#23;	//  java/lang/System
const #17 = NameAndType	#24:#25;//  out:Ljava/io/PrintStream;
const #18 = Asciz	test;
const #19 = class	#26;	//  java/io/PrintStream
const #20 = NameAndType	#27:#28;//  println:(Ljava/lang/String;)V
const #21 = Asciz	Test;
const #22 = Asciz	java/lang/Object;
const #23 = Asciz	java/lang/System;
const #24 = Asciz	out;
const #25 = Asciz	Ljava/io/PrintStream;;
const #26 = Asciz	java/io/PrintStream;
const #27 = Asciz	println;
const #28 = Asciz	(Ljava/lang/String;)V;

{
public Test();
  Signature: ()V
  Code:
   Stack=1, Locals=1, Args_size=1
   0:	aload_0
   1:	invokespecial	#1; //Method java/lang/Object."<init>":()V
   4:	return
  LineNumberTable: 
   line 3: 0


public static void main(java.lang.String[]);
  Signature: ([Ljava/lang/String;)V
  Code:
   Stack=2, Locals=1, Args_size=1
   0:	getstatic	#2; //Field java/lang/System.out:Ljava/io/PrintStream;
   3:	ldc	#3; //String test
   5:	invokevirtual	#4; //Method java/io/PrintStream.println:(Ljava/lang/String;)V
   8:	return
  LineNumberTable: 
   line 5: 0
   line 6: 8


}



所以别在意,import多余的东西不会对运行性能带来影响。JVM根本不知道你import了哪些类,只知道你用了哪些类。

import多余的东西主要带来的影响是污染了当前编译单元(也就是单个Java源代码文件)的命名空间而已,名字冲突的可能性变大了而已。例如说package A里有MyClass,你当前的文件在package B里,也有MyClass,这个时候直接写MyClass就容易有歧义,需要写成完整的A.MyClass或B.MyClass来区分。只是这个问题而已。

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值