import static和import的區別


import static靜態導入是JDK1.5中的新特性。一般我們導入一個類都用 import com.....ClassName;而靜態導入是這樣:import static com.....ClassName.*;這里的多了個static,還有就是類名ClassName后面多了個 .* ,意思是導入這個類里的靜態方法。當然,也可以只導入某個靜態方法,只要把 .* 換成靜態方法名就行了。然后在這個類中,就可以直接用方法名調用靜態方法,而不必用ClassName.方法名 的方式來調用。 

這種方法的好處就是可以簡化一些操作,例如打印操作System.out.println(...);就可以將其寫入一個靜態方法print(...),在使用時直接print(...)就可以了。 

但是這種方法建議在有很多重復調用的時候使用,如果僅有一到兩次調用,不如直接寫來的方便 

 
 
example:

在Java 5中,import語句得到了增強,以便提供甚至更加強大的減少擊鍵次數功能,雖然一些人爭議說這是以可讀性為代價的。這種新的特性成為靜態導入。

當你想使用static成員時,可以使
用靜態導入(在API中的類和你自己的類上,都可以使用該特性)。下面是靜態導入前后的代碼實例:

在靜態導入之前:

  1. public class TestStatic { 
  2.     public static void main(String[] args) { 
  3.         System.out.println(Integer.MAX_VALUE); 
  4.         System.out.println(Integer.toHexString(42)); 
  5.     } 
  6. }
在靜態導入之后:
 
  1. import static java.lang.System.out; 
  2. import static java.lang.Integer.*; 
  3.  
  4. public class TestStaticImport { 
  5.     public static void main(String[] args) { 
  6.         out.println(MAX_VALUE); 
  7.         out.println(toHexString(42)); 
  8.     } 
  9. }
兩個類都產生相同的輸出:
  1. 2147483647 
  2. 2a
讓我們看一下使用靜態導入特性的代碼中將發生什么:

1、雖然該特性通常稱為“靜態導入”,但語法必須是import static,后面跟你想導入的static成員的完全限定名稱,或者通配符。在本例中,我們在System類的out對象上進行靜態導入。

2、在本例中,我們可能想使用java.lang.Integer類的幾個static成員。該靜態導入語句使用通配符來表達“我想在此類中的所有靜態成員上進行靜態導入”。

3、現在我們終於看到靜態導入特性的好處!我們不必在System.out.println中鍵入System。太好了!另外,我們不必在Integer.MAX_VALUE中鍵入Integer。因此,在這行代碼中,我們能夠將快捷方式用於靜態方法和一個常量。

4、最后,我們進行更多的快捷操作,這次針對Integer類的方法。

關於該特性,我們已經有點兒諷刺意味兒了,但不僅我們是這樣的。我們不認為節省少量的擊鍵次數會讓代碼難於閱讀一點,但許多開發人員要求將它添加到語言中。

下面是使用靜態導入的幾條原則:

  • 你必須說import static, 不能說static import。
  • 提防含糊不清的命名static成員。例如,如果你對Integer類和Long類執行了靜態導入,引用MAX_VALUE將導致一個編譯器錯誤,因為Integer和Long都有一個MAX_VALUE常量,並且Java不會知道你在引用哪個MAX_VALUE。
  • 你可以在static對象引用、常量(記住,它們是static 或final)和static方法上進行靜態導入。

 

import 靜態成員(Static import)

在 J2SE 5.0  后新增了"import static" ,它的作用與 套件(package) 中介紹的"import"類似,都是為了讓您可以省一些打字功夫,讓編譯器多作一點事而存在的。

"import static"是使用時的語法,國外網站上的文章或原文書中介紹這個功能時,大都用static import描述這個功能,編譯器訊息也這么寫,這邊就還是用static import來作為原文時的描述,但為了比較彰顯這個功能的作用,我稱之為“import 靜態成員”。

使用"import static"語法,您可以import類別或介面中的靜態成員,例如來看看這個Hello! World!程式:

* HelloWorld.java

import static java.lang.System.out;

public class HelloWorld {
public static void main(String[] args) {
out.println("Hello! World!");
}
}



在這邊您將java.lang.System類別中的out靜態成員import至程式中,編譯時編譯器遇到out名稱,就會自動展開為System.out,所以這還是編譯器給的蜜糖(Compiler suger)。

再來看一個例子, Arrays 類別 中有很多的靜態方法,為了使用方便,可使用"import static"將這些靜態方法import至程式中,例如:

* UseImportStatic.java

import static java.lang.System.out;
import static java.util.Arrays.sort;

public class UseImportStatic {
public static void main(String[] args) {
int[] array = {2, 5, 3, 1, 7, 6, 8};

sort(array);

for(int i : array) {
out.print(i + " ");
}
}
}


如果您想要import類別下所有的靜態成員,可以使用 '*' 字元,例如:

* UseImportStatic.java

import static java.lang.System.*;
import static java.util.Arrays.*;

public class UseImportStatic {
public static void main(String[] args) {
int[] array = {2, 5, 3, 1, 7, 6, 8};

sort(array);

for(int i : array) {
out.print(i + " ");
}
}
}


與import一樣,import 靜態成員(static import)這個功能是為了方便,可以讓您少打一些字,您把少打的字交給編譯器來判斷並自動為您補上,但是您要注意名稱沖突問題,有些名稱沖突編譯器可能透過以下的幾個方法來解決:

* 成員覆蓋

如果類別中有同名的field或方法名稱,則優先選用它們。

* 區域變數覆蓋

如果方法中有同名的變數名或引數名,則選用它們。

* 重載(Overload)方法 上的比對

對於被使用import static的各個靜態成員,若有同名沖突,嘗試透用重載機制判斷,也就是透過方法名稱及引數列的比對來選擇適當的方法。


如果編譯器無法判斷,則會回報錯誤,例如若您定義的sort()方法與Arrays的sort()方法沖突,且編譯器也無法判別時,會出現以下的訊息:
reference to sort is ambiguous,

both method sort(float[]) in onlyfun.caterpillar.Arrays and

method sort(float[]) in java.util.Arrays match


總之,package與類別等可以用於管理一些資源,避免同名沖突發生,而"import"與"import staic"則是反其道而行,讓您可以獲得一些方便,如果同名沖突發生了,這種方便性的使用就有考慮的必要了。

 

 

http://blog.sina.com.cn/s/blog_625651900100kwul.html

http://hi.baidu.com/payapple/blog/item/8105941539ef380b4b90a710.html


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2026 CODEPRJ.COM