技术的进步往往缘自于人类的懒惰——至少软件业是如此
——Fantasy Dog
import的作用有两个:简化输入和方便阅读。前者成全了coder的懒惰,后者成全了读者的。
我们一直觉得把java.util.ArrayList写成ArrayList是一件很幸福的事情(除了那些希望用连续的噼里啪啦的键盘声装酷或者装做努力工作的人,然则写软件大部分时间是要思考的,手指太快只能做打字员,或者怪sdk要用户输入的太多),但是对于System.out.println恨之入骨却又万般无奈。更不幸的是,System.out.println通常用的比ArrayList多的多,特别是在test code里。
有了import static,生活环境又有了点起色。我们终于可以import某个类的某个静态成员或所有静态成员,而不用写类名了——现在看来是理所当然的事。public的某个static成员通常与类没有太大关系,仅仅是为了分门别类而被安排在这个类里,抛开束缚的感觉真好。
***注意这个static。非static的成员是不能被引用的,比如我们如果想更进一步抛开out直接写println,技术上并非不可能实现,但是这违背了面向对象的原则:非静态方法是与某个object交流的接口,离开了object,这个接口毫无意义。
成员包括了变量和方法,因此import static一个方法也是可以的。但是,方法是可以重载的。如下:
import static java.util.Arrays.sort;
我怎么知道这是import了哪一个sort方法呢?
实际上,这import了所有叫sort的方法。import static引进的是name,而非name所指代的某个具体的member。对于变量,一个变量名只能用来指代一个变量,因此这个区别无伤大雅。可是对于方法就不同了。import的作用就是告诉编译器,当你遇到无法解析的(can't be resolved)名字时,去某个路径找。所以当编译器遇到sort后,就在java.util.Arrays下找到了sort这个名字,然后再找是否有匹配的函数。结果以下的奇怪东西就有意思了:
import static java.util.Arrays.sort;
import static java.util.Collections.sort;
两个sort毫无冲突,因为这两个类没有相同的sort函数,邻里融洽。
java是没有如c一般的全局函数或变量的,因此用public的static成员解决了这个问题。有些牵强,也属无奈。而import static,只怕也是无奈中的无奈了吧。