# 靜態導入(static imports)
在本節,你將會學習到關于靜態導入的知識。如何使用靜態導入。還有會看到一些例子,如何到如自定義的靜態成員。所以讓我們開始吧。
我已經創建了一個Project命名為 StaticImportsExample還有一些包和新的類。你可以暫停視頻,先創建一個project。
或者也可以使用舊的project,然后每節課創建新的類。
### 作用
所以靜態導入(static import)是用來導入靜態成員的。通常這些成員會是常量(constant)或者是方法(method) 。 我們會以Math類作為例子研究一下。 靜態導入的主要作用是,你不用指明類名。也就是那個常量或者是方法所在的類,不需要指明。 當你使用一些靜態方法,或者是靜態變量。有時候靜態變量會過度使用。尤其是在大型應用。太多靜態導入的話,有時候容易忘記某個變量或方法是導入自哪個類的。
那么讓我們打印一些Math方法里面的常量,你不用擔心 `static` 關鍵字,這個后面我們會詳細講解的。
首先,我們創建以下代碼:
```java
package io.zwt;
public class StaticImportsExample {
public static void main(String[] args) {
int min = Math.min(5, 7);
System.out.println("min= ", min);
System.out.println(Math.PI);
}
}
```
上面的兩個println 語句就打印了兩個整數其中較小值和常量 $\pi$ 的值。
接下來,我們開始使用靜態導入語句
```java
package io.zwt;
import static java.lang.Math.*;
public class StaticImportsExample {
public static void main(String[] args) {
int min = Math.min(5, 7);
System.out.println("min= ", min);
System.out.println(Math.PI);
}
}
```
這時候,import 語句會變灰色,因為沒有用到它。
我們可以移除min方法前的Math. 這時候我們就有使用min方法,import 語句起作用了。
```java
package io.zwt;
import static java.lang.Math.*;
public class StaticImportsExample {
public static void main(String[] args) {
int min = min(5, 7);
System.out.println("min= ", min);
System.out.println(PI);
}
}
```
對于PI這個常量,也做同樣的操作。
這樣每次我們要使用Math類里面的某個靜態方法,或者是常量,就不需要在前面寫 Math. 了。
如果我們使用 Ctrl + Shift + O 優化導入,那么 IntelliJ 會將原理的星號導入,變成兩個靜態導入。就像下面這樣:
```java
package io.zwt;
import static java.lang.Math.PI;
import static java.lang.Math.min;
public class StaticImportsExample {
public static void main(String[] args) {
int min = min(5, 7);
System.out.println("min= ", min);
System.out.println(PI);
}
}
```
因為這個Math類里面還有很多的靜態方法,我們不需要導入所有的靜態方法,只需要導入用到的。
### System.out
另一個使用靜態導入的例子是 System.out.
每次想要打印一些內容的時候,不需要總是輸入System.out 只需要敲 out.
注意到這個 out 是 static final 類型的變量,定義在 System 這個類里面。
所以如果我們再添加一個靜態導入語句(然后移除 System.)
```java
package io.zwt;
import static java.lang.Math.PI;
import static java.lang.Math.min;
import static java.lang.System.out;
public class StaticImportsExample {
public static void main(String[] args) {
int min = min(5, 7);
out.println("min= ", min);
out.println(PI);
}
}
```
關于靜態導入的考察點,主要是在是否正確地使用了靜態導入語句,靜態導入語句主要是用來導入靜態成員。然后普通的導入語句是用來導入類的。 靜態成員可以是變量或者是方法。
當使用普通的import 語句,你不可以導入兩個同名的類,同樣的規則也適用于靜態導入 static import。你不能導入兩個同名的變量,或者兩個同名的方法。
現在讓我們創建另外一個類,那么我就創建一個新的Java 類,命名為 Config 在這個類里面,我會創建一些靜態常量。例如
```java
package io.zwt;
public class Config {
public static final String NAME = "myName";
public static final int MAX_COLUMN_COUNT = 5;
public static void printConfig() {
System.out.println("name= " + NAME + " columnCount= " + MAX_COLUMN_COUNT);
}
}
```
靜態方法可以不用創建實例,直接調用。
現在我們回到 StaticImportsExample 這個類,開始使用靜態導入我們的Config類里邊的靜態成員。
```java
package io.zwt;
import static java.lang.Math.PI;
import static java.lang.Math.min;
import static java.lang.System.out;
import static io.zwt.Config.*;
public class StaticImportsExample {
public static void main(String[] args) {
int min = min(5, 7);
out.println("min= ", min);
out.println(PI);
// 靜態導入了這個方法
printConfig();
// 也可以打印靜態變量
out.println("name= " + NAME);
out.println("columnCount= " + MAX_COLUMN_COUNT);
}
}
```
在大型程序里邊,最好不要導入太多靜態變量和靜態方法。因為太多了很難清楚這些是從哪里導入的。
- 0.考試大綱解讀
- 1.內容簡介與環境搭建
- 1.1內容簡介
- 1.2.在Windows安裝JDK8
- 2.Java基礎
- 2.1.Java類結構
- 2.2.main方法
- 2.3.注釋
- 2.4.package與import
- 2.5.命名沖突與代碼格式
- 2.6.靜態導入
- 2.7.理解原始數據類型
- 2.8.整數型原始類型
- 2.9.小數型原始類型
- 2.10.原始char與boolean
- 2.11.聲明和初始化變量
- 2.12.理解原始類型變量的默認初始化
- 2.13.變量作用范圍
- 2.14.類里面元素的順序
- 2.15.理解null
- 2.16.原始類型的包裝類
- 2.17.Java的好處
- 2.18.考試題目舉例
- 3.操作符
- 3.1.理解操作符
- 3.2.算術操作符
- 3.3.數值類型提升以及類型轉換
- 3.4.一元操作符第一部分
- 3.5.一元操作符第二部分
- 3.6.賦值運算符
- 3.7.復合賦值運算符
- 3.8.關系操作符
- 3.9.關系操作符
- 3.10.相等操作符
- 3.11.理解 == 與 equals()方法
- 3.12.字符算術運算
- 3.13.考試題目舉例
- 4.基本程序控制流
- 4.1.if else語句
- 4.2.三元操作符
- 4.3.switch語句
- 4.4.while循環
- 4.5.do-while循環
- 4.6.for循環
- 4.7.考試題目舉例
- 5.理解字符串類型
- 5.1.創建字符串以及字符串連接
- 5.2.理解不可變性
- 5.3.字符串常量池和字符串相等
- 5.4.String類的方法第一部分
- 5.5.String類的方法第二部分
- 5.6.方法串聯
- 5.7.使用StringBuilder類
- 5.8.StringBuilder類的方法
- 5.9.理解相等性
- 5.10.考試題目舉例
- 6.數組
- 6.1.理解數組
- 6.2.使用數組
- 6.3.數組常見的問題
- 6.4.For-each循環
- 6.5.break語句和標簽
- 6.6.continue語句
- 6.7.數據排序
- 6.8.搜索數組
- 6.9.可變數量參數
- 6.10多維數組
- 6.11嵌套循環
- 6.12考試題目舉例
- 7.ArrayList
- 7.1.理解ArrayList
- 7.2.ArrayList的方法第一部分
- 7.3.ArrayList的方法第二部分
- 7.4.在ArrayList使用包裝類
- 7.5.ArrayList與數組之間的轉換
- 7.6.ArrayList元素排序
- 7.7.搜索ArrayList
- 7.8.遍歷List第一部分
- 7.9.遍歷List第二部分
- 7.10.考試題目舉例
- 8.方法
- 8.1.設計一個方法
- 8.2.方法的返回類型
- 8.3.方法的參數列表
- 8.4.帶有數量可變參數的方法
- 8.5.訪問修飾符
- 8.6.靜態方法和字段
- 8.7.使用靜態方法和字段第一部分
- 8.8.使用靜態方法和字段第二部分
- 8.9.final方法
- 8.10.靜態初始化
- 8.11.在方法之間傳輸數據
- 8.12.方法的返回數據
- 8.13.重載方法
- 8.14.考試題目舉例
- 9.類設計
- 9.1.類的構造函數
- 9.2.默認構造函數
- 9.3.構造方法重載
- 9.4.this 與 this()的區別
- 9.5.初始化的順序
- 9.6.數據封裝
- 9.7.不可變類
- 9.8.類與繼承第一部分
- 9.9.類與繼承第二部分
- 9.10方法重寫
- 9.11.super 與 super()的區別
- 9.12.重載與重寫的區別
- 9.13.抽象類
- 9.14.抽象方法
- 9.15.創建接口
- 9.16.實現接口
- 9.17.接口的默認方法
- 9.18.接口的靜態方法
- 9.19.抽象類與接口的區別
- 9.20.多態
- 9.21.虛方法
- 9.22.參數多態
- 9.23.考試題目舉例
- 10.Java 8的日期和時間API
- 10.1.創建日期與時間
- 10.2.使用日期與時間
- 10.3.Periods
- 10.4.格式化日期和時間
- 10.5.解釋日期和時間
- 10.6.考試題目舉例
- 11.異常處理
- 11.1.理解異常處理
- 11.2.Checked 與 Unchecked 異常的區別
- 11.3.處理異常
- 11.4.使用finally語句塊
- 11.5.捕獲不同的異常
- 11.6.return 和 finally塊
- 11.7.拋出異常的方法
- 11.8.考試題目舉例
- 12.簡單的Lambda表達式
- 12.1.理解Lambda
- 12.2.使用Lambda
- 12.3.Predicates
- 12.4.考試問題舉例
- 13.福利
- 13.1.Anki記憶卡片