原文鏈接:https://www.geeksforgeeks.org/static-import-java/
java中的靜態引用
直接解釋
-
一般引入類的方式:
import java.lang.Math.*; -
靜態引入類的方式:
import static java.lang.Math.*; -
區別在於:
-
一般引入需要使用
ClassName.method();的方式去調用類中的靜態方法; -
而靜態引入后,直接使用
method();即可使用靜態方法。 -
以下2張圖可以清晰的查看。


原文翻譯
Java中的靜態引入
在Java中,靜態引入的方式是jkd1.5開始有的。有了靜態引入功能,就可以直接拿到類中的靜態成員,不需要類名或者任何對象。
比如,我們經常使用Math類中的sqrt()方法,使用方式為:Math.sqrt(),但是通過使用靜態引入后,我們就可以直接使用sqrt()方法了。
根據SUN公司的微系統,這種寫法會提高代碼可讀性與效率。然而某些程序大佬說,這種寫法會使人迷惑,對於程序沒有什么好處。
如果沒有明確的要求,我們不應該使用靜態引入。
直接上代碼:
// Java程序說明
// 調用事先定義的方法
// 不使用靜態引入
class Geeks {
public static void main(String[] args)
{
System.out.println(Math.sqrt(4));
System.out.println(Math.pow(2, 2));
System.out.println(Math.abs(6.3));
}
}
---
Output:
2.0
4.0
6.3
// 使用靜態引入
import static java.lang.Math.*;
class Test2 {
public static void main(String[] args)
{
System.out.println(sqrt(4));
System.out.println(pow(2, 2));
System.out.println(abs(6.3));
}
}
Copy CodeRun on IDE
Output:
2.0
4.0
6.3
- 說明:
System是java.lang package中的類,out存在於是System類中的靜態變量。通過靜態引入的方式,我們可以不用類名去調用它。
靜態引入帶來的歧義
- 如果靜態導入了不同的類,然而他們的靜態成員名字恰好相同,編譯器就會拋出一個異常,它在沒有類名的條件下,無法決定到底要使用的到底是哪個成員。
- 代碼如下:
// Java程序說明
// 發生歧義
// 靜態引入
import static java.lang.Integer.*;
import static java.lang.Byte.*;
class Geeks {
public static void main(String[] args)
{
out.println(MAX_VALUE);
}
}
Output:
Error:Reference to MAX_VALUE is ambigious
說明:在上面的代碼中,我們試圖去拿MAX_VALUE 的值,但是每個在包裝類中預先生命的元數據類型都包含了MAX_VALUE 。這里,我們同時引入了Integer 和Byte 類,並且試圖企業訪問靜態變量,但是當編譯器看到兩個導入語句的時候,一定不知道去調用Integer 和Byte 其中哪個的靜態變量。因此編譯器拋了個錯誤,說引用哪個變量是不明確的。
普通引入與靜態引入之間的不同
- 使用
import,引入的是包中的類或者接口;而使用static import,可以不通過類名來拿到的是類中的成員(變量、方法)。 - 最大的不同是:可讀性。原文說靜態引入之后,調用時候的寫法可讀性更高? 我覺得是正常引入的時候,使用類名去調用的可讀性遠高於直接一個方法直接寫出來的形式
