java中import兩種導入類型比較

轉載地址:http://blog.sina.com.cn/s/blog_56f69c6601016erf.html


import導入聲明可分爲兩中: 
1>單類型導入(single-type-import) 
例:import java.util.ArrayList; 
2>按需類型導入(type-import-on-demand) 
例:import java.util.*;


以這樣兩種方式導入包中的任何一個public的類和接口(只有public類和接口才能被導入)


*導入聲明僅導入類型而不導入子包;這就是爲什麼稱它們爲單類型導入和按需類型導入聲明的原因.


*導入的類或接口的簡名(simple name)具有編譯單元作用域.這表示該類型簡名可以在導入語句所在的編譯單元的任何地方使用.這並不意味着你可以使用該類型所有成員的簡名,而只能使用類型自身的簡名. 
例如: java.lang包中的public類都是自動導入的,包括Math和System類.但是,你不能使用簡名PI()和gc(),而必須使用Math.PI()和System.gc().你不需要鍵入的是java.lang.Math.PI()和java.lang.System.gc().


程序員有時會導入當前包或java.lang包,這是不需要的,因爲當前包的成員本身就在作用域內,而java.lang包是自動導入的.java編譯器會忽略這些冗餘導入聲明(redundant import declarations).即使像這樣 
import java.util.ArrayList; 
import java.util.*; 
多次導入,也可編譯通過.編譯器會將冗餘導入聲明忽略.


使用按需導入聲明是否會降低Java代碼的執行效率?絕對不會! 
Java編譯器產生的類文件僅包含編譯單元實際使用到的類或接口的符號引用.


這是否意味着你總是可以使用按需導入聲明?是,也不是! 
在類似Demo的非正式開發中使用按需導入聲明顯得很有用. 
然而,有這四個理由讓你可以放棄這種聲明: 
1>編譯速度:在一個很大的項目中,它們會極大的影響編譯速度.但在小型項目中使用在編譯時間上可以忽略不計. 
2>命名衝突:解決避免命名衝突問題的答案就是使用全名.而按需導入恰恰就是使用導入聲明初衷的否定. 
3>說明問題:全名的使用是自說性的.畢竟高級語言的代碼是給人看的. 
4>無名包問題:如果在編譯單元的頂部沒有包聲明,Java編譯器首選會從無名包中搜索一個類型,然後纔是按需類型聲明.如果有命名衝突就會產生問題. 
Sun的工程師一般不使用按需類型導入聲明.這你可以在他們的代碼中找到: 
在java.util.Properties類中的導入聲明: 
import java.io.IOException; 
import java.io.printStream; 
import java.io.printWrite; 
import java.io.InputStream; 
import java.io.BufferedReader; 
import java.io.BufferedWriter; 
import java.util.Hashtable;


你可以看到有趣的是,她連java.util.Hashtable也導入,這可是在當前包中啊! 


-------------------------------------------------------------------------------------------------------------


原創作品,允許轉載,轉載時請務必以超鏈接形式標明文章 原始出處 、作者信息和本聲明。否則將追究法律責任。http://xgtian.blog.51cto.com/3844449/737269 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章