java中额外导入类的效果

时间:2014-10-09 01:35:03

标签: java android import classloader

http://source.android.com/source/code-style.html

中的

我读过有关使用完全限定导入的内容。但我很好奇不明确使用进口的负面影响。例如,如果我使用以下代码

package blabla;
import foo.*;
import hee.*;
import lee.*;
...
...
public class ImportKing {
...
}

从我的理解,当这个类 - 在项目的任何地方使用ImportKing时,类加载器将加载它导入的任何类,因此将消耗额外的系统内存用于不必要的导入。

测试代码:

//import java.*;
public class ImportKing {
    public static void main(String[] args) {
        while(true) {
            System.out.println("running");
        }
    }
}

测试结果:

USER PID%CPU%MEM VSZ RSS TTY STAT START TIME COMMAND

shanwu 3316 39.8 0.6 3182012 52196 pts / 0 Sl + 09:25 0:03 java ImportKing with extra imports

shanwu 3440 43.7 0.6 3182012 52752 pts / 0 Sl + 09:27 0:03 java ImportKing无需额外进口

我没有看到额外进口对计划效果的任何负面影响。是否由java编译器处理额外的导入,所以我们没有像浪费系统内存那样的问题?

2 个答案:

答案 0 :(得分:2)

import语句在运行时完全没有任何作用。

import语句只是使您可以在源代码中使用简单的类型名称(及其成员)而不是完全限定名称。

答案 1 :(得分:2)

问:类加载器将加载它导入的任何类,

答:不,当需要类时(例如,调用构造函数),将调用类加载器。这与源代码中的“导入”无关。

问:因此会为不必要的导入消耗额外的系统内存。

<答>答:不:课程不会被不必要地加载;内存“浪费”。

建议:

以下是Java类加载基础知识的两个很好的链接:

以下是Java规范对“import”的评价:

  

http://docs.oracle.com/javase/specs/jls/se7/html/jls-7.html#jls-7.5

     

导入声明通过简单的方式使类型或成员可用   仅在实际包含的编译单元内的名称   进口申报。引入的类型或成员的范围   通过import声明特别不包含PackageName   包裹声明,当前的其他进口声明   编译单元或同一包中的其他编译单元。

“import”是一个编译时构造,用于简化识别“名称”(可能是许多不同中的一个)“类定义”。 会影响运行时行为;它与“类加载”完全分开