原文鏈接: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
,可以不通過類名來拿到的是類中的成員(變量、方法)。 - 最大的不同是:可讀性。原文說靜態引入之后,調用時候的寫法可讀性更高? 我覺得是正常引入的時候,使用類名去調用的可讀性遠高於直接一個方法直接寫出來的形式