1、package、import的来龙去脉



有些人写了一阵子Java,可是对于Java的package 和 import 还是不太理解。很多人以为xx.java文件中的import会让编译器把所import的程序统统拷到.class文件中。或者是认为像c/c++中的#include预处理指令相似,实际上这是错误的。


(1)package


其实package的名称就像我们的姓,而class文件名称就像是我们的名字。在package中有很多包含点,其实理解不难,就下你给是我们的复姓一样。打个比方,比如java.lang.String就是复姓java.lang名为String。再比如java.io.InputStream复姓java.io名为InputStream。




在java中使用package这种机制其实原因也很简单,就像我们取名一样。在一个学校同一届学生中有很多同名(名同,姓不同)的学生,那么如何区分这些同名的学生呢,那么就出现了用姓来区分。所以sun公司就采取这种方式用了package。根据sun公司的命名规则,不允许同一个学校一届同学中有同姓同名的学生。也就是不允许package同名,以防止查找文件的时候产生冲突。


(2)import 


针对(1)中所述一个文件的全名(姓名)会很长,在写代码过程中会很累赘,很浪费写作时间,比如说


java.io.InputStream is = java.lang.System.in;
     java.io.InputStreamReader isr= new java.io.InputStreamReader(is);
     java.io.BufferedReader br = new java.io.BufferedReader(isr);


所以sun公司引进了import来解决上述问题。import会在.java 文件中的开头就先说明该文件中要使用的所有文件的姓名,在具体代码中只要简单的使用名就可了。比如:


import java.lang.System;
     import java.io.InputStream;
     import java.io.InputStreamReader;
     import java.io.BufferedReader;
这几行说明了这个四个文件的明名称,在程序中使用,只要直接使用名就可以使用,在程序中使用了System就是指java.lang.System,依此类推。可是即使这样已经使代码更加的简洁了,但是还有人不满足,认为敲太多的import是浪费时间。所以sun公司又提供了一个懒人的方法。
import java.lang.*;
     import java.io.*;
意思就是,等一下程序中提到的没有姓名的文件,不是姓 java.lang,就是姓 
java.io,如果这两个裡面有同样名字的类别,而不幸的你又只用名字称呼这
个类别,那编译器仍然会跟你抱怨,因為它还是不知道你说的这个类别指那一 
个姓的类别。那可不可以再懒一点呢,只写:
    import java.*;
历史告诉我们,人可以懒,但不能太懒,这样是不行的。因為那些类别是姓 
java.io 而不是姓 java。就像姓『诸葛』的人应该不会喜欢你称他為『诸』 
先生吧。


为什么我一开始说 import 跟 #include 不同呢?因為 import 的功能 
到此為止,它不像 #include 一样,会将文件内容全部载入进来。import 只是请 
编译器帮你打字,让编译器把没有姓的类别加上姓,并不会把别的类中的代码写进来。如果你想练习打字,可以不要使用 import,只要在用到类别的 
时候,用它的全部姓名来称呼它就行了(就像例子一开始那样),跟使用 
import 完全没有甚麼两样。
另外,虽然人不可以太懒,但是 Sun 还是帮我们多偷了一点懒。因為 
java.lang 这个套件实在是太常太常太常用到了,几乎没有程式不用它的, 
所以不管你有没有写 import java.lang;,编译器都会自动帮你补上,也就 
是说编译器只要看到没有姓的类别,它就会自动去 java.lang 裡面找找看, 
看这个类别是不是属於这个套件的。所以我们就不用特别去 
import java.lang 了。
import导入声明可分为两中: 
1>单类型导入(single-type-import) 
例:import java.util.ArrayList; 就是具体到集体的类和接口,包括他们的姓和名2>按需类型导入(type-import-on-demand) 
例:import java.util.*; 对于按需类型导入,有人误解为导入一个包下的所有类,其实不然,看名字就知道,他只会按需导入,也就是说它并非导入整个包,而仅仅导入当前类需要使用的类。(3)静态import java1.5之后引入了静态导入,所谓静态导入就是导入某个类中的静态方法或者所有静态方法。这是普通import是做不到的。比如 import java.lang.Math.max,或者是import java.lang.Math.*;