1. 程式人生 > >java基礎(二)static四種應用場景

java基礎(二)static四種應用場景

一、修飾成員變數
static關鍵字可以修飾成員變數和方法,來讓它們變成類的所屬,而不是物件的所屬。

public class Person {
    private static int count = 0;
    int id;
    String name;
    int age;
    
    public Person() {
        id = ++count;
    }
    
    public String toString() {
        return "Id:" + id + ", Name:" + name + ", Age:" + age;
    }
    
    public static void main(String[] args) {
        Person p1 = new Person();
        p1.name = "zhangsan";
        p1.age = 10;
        Person p2 = new Person();
        p2.name = "lisi";
        p2.age = 12;
        System.out.println(p1);
        System.out.println(p2);
    }
}

二、修飾成員方法
static的另一個作用,就是修飾成員方法。相比於修飾成員屬性,修飾成員方法對於資料的儲存上面並沒有多大的變化,因為我們從上面可以看出,方法本來就是存放在類的定義當中的。static修飾成員方法最大的作用,就是可以使用"類名.方法名"的方式操作方法,避免了先要new出物件的繁瑣和資源消耗,我們可能會經常在幫助類中看到它的使用。

public class PrintHelper {

    public static void print(Object o){
        System.out.println(o);
    }
    
    public static void main(String[] args) {
        PrintHelper.print("Hello world");
    }
}

可以看到它的作用,使得static修飾的方法成為類的方法,使用時通過“類名.方法名”的方式就可以方便的使用了,相當於定義了一個全域性的函式(只要匯入該類所在的包即可)。不過它也有使用的侷限,一個static修飾的方法中,不能使用非static修飾的成員變數和方法,這很好理解,因為static修飾的方法是屬於類的,如果去直接使用物件的成員變數,它會不知所措(不知該使用哪一個物件的屬性)。
三、靜態塊(提前載入)
程式碼示例

    package com.dotgua.study;
    class Book{
        public Book(String msg) {
            System.out.println(msg);
        }
    }
    
    public class Person {
    
        Book book1 = new Book("book1成員變數初始化");
        static Book book2 = new Book("static成員book2成員變數初始化");
        
        public Person(String msg) {
            System.out.println(msg);
        }
        
        Book book3 = new Book("book3成員變數初始化");
        static Book book4 = new Book("static成員book4成員變數初始化");
        
        public static void main(String[] args) {
            Person p1 = new Person("p1初始化");
        }
        /**Output
         * static成員book2成員變數初始化
         * static成員book4成員變數初始化
         * book1成員變數初始化
         * book3成員變數初始化
         * p1初始化
         *///~
    }

1、當我們new一個Person物件時,static修飾的成員變數首先被初始化,隨後是普通成員,最後呼叫Person類的構造方法完成初始化。也就是說,在建立物件時,static修飾的成員會首先被初始化,而且我們還可以看到,如果有多個static修飾的成員,那麼會按照他們的先後位置進行初始化。
2、當我們沒有建立物件,而是通過類去呼叫類方法時,儘管該方法沒有使用到任何的類成員,類成員還是在方法呼叫之前就初始化了,這說明,當我們第一次去使用一個類時,就會觸發該類的成員初始化。
3、當我們使用了類方法,完成類的成員的初始化後,再new該類的物件時,static修飾的類成員沒有再次初始化,這說明,static修飾的類成員,在程式執行過程中,只需要初始化一次即可,不會進行多次的初始化。
4、看static的第三個作用就非常簡單了,那就是當我們初始化static修飾的成員時,可以將他們統一放在一個以static開始,用花括號包裹起來的塊狀語句中,可以按照順序統一載入:

class Book{
    public Book(String msg) {
        System.out.println(msg);
    }
}

public class Person {

    Book book1 = new Book("book1成員變數初始化");
    static Book book2;
    
    static {
        book2 = new Book("static成員book2成員變數初始化");
        book4 = new Book("static成員book4成員變數初始化");
    }
    
    public Person(String msg) {
        System.out.println(msg);
    }
    
    Book book3 = new Book("book3成員變數初始化");
    static Book book4;
    
    public static void funStatic() {
        System.out.println("static修飾的funStatic方法");
    }
    
    public static void main(String[] args) {
        Person.funStatic();
        System.out.println("****************");
        Person p1 = new Person("p1初始化");
    }
    /**Output
     * static成員book2成員變數初始化
     * static成員book4成員變數初始化
     * static修飾的funStatic方法
     * ***************
     * book1成員變數初始化
     * book3成員變數初始化
     * p1初始化
     *///~
}

四、靜態導包
直接用方法名呼叫方法。

/* PrintHelper.java檔案 */
package com.dotgua.study;

public class PrintHelper {

    public static void print(Object o){
        System.out.println(o);
    }
}
/* App.java檔案 */
import static com.dotgua.study.PrintHelper.*;
public class App 
{
    public static void main( String[] args )
    {
        print("Hello World!");
    }
    /**Output
     * Hello World!
     *///~
}

而在App.java檔案中,我們首先將PrintHelper類匯入,這裡在匯入時,我們使用了static關鍵字,而且在引入類的最後還加上了“.*”,它的作用就是將PrintHelper類中的所有類方法直接匯入。不同於非static匯入,採用static匯入包後,在不與當前類的方法名衝突的情況下,無需使用“類名.方法名”的方法去呼叫類方法了,直接可以採用"方法名"去呼叫類方法,就好像是該類自己的方法一樣使用即可。
五、總結
static是java中非常重要的一個關鍵字,而且它的用法也很豐富,主要有四種用法:
1、用來修飾成員變數,將其變為類的成員,從而實現所有物件對於該成員的共享;
2、用來修飾成員方法,將其變為類方法,可以直接使用“類名.方法名”的方式呼叫,常用於工具類;
3、靜態塊用法,將多個類成員放在一起初始化,使得程式更加規整,其中理解物件的初始化過程非常關鍵;
4、靜態導包用法,將類的方法直接匯入到當前類中,從而直接使用“方法名”即可呼叫類方法,更加方便。

參考:
[java]static關鍵字的四種用法