修飾符static的五種用法

被static修飾的類、方法等都是靜態的,也就是不依賴實例進行創建,在類被第一次訪問的時候就加載了。static出現的地方以及所起的作用大概有五種:

1. 修飾靜態屬性;
2. 修飾靜態方法;
3. 修飾靜態內部類;
4. 靜態導包(類或者方法,可以通配);
5. 標記靜態代碼塊。

我們用一個demo來測試一下。

建一個普通的java項目,建立一個包com.chris.demo.statictest

1. 創建一個工具類MyUtils,工具類一般放置我們封裝好的一般邏輯,方便我們使用,對於使用率比較高的,我們不需要依賴於實例,所以使用靜態方法。

package com.chris.demo.statictest;

import static java.lang.System.out;

/**
 * 模擬工具類
 * 工具類使用率較高的方法一般使用靜態方法
 */
public class MyUtils {
    //靜態方法
    public static void log(Object object) {
        out.println(object);
    }
}

可以看出我們在這個類裏面已經使用了靜態導包,靜態導包的好處就是可以直接使用對象或者方法,不用再依賴於對象對象或者類來調用,如:原來經常使用的System.out.println("Hello,World!");現在就變成out.println("Hello,World!");了。

2. 創建一個類MyClass,包含一個普通的內部類,一個靜態內部類,和一個靜態內部對象,還有普通方法和靜態方法。

package com.chris.demo.statictest;

import static com.chris.demo.statictest.MyUtils.log;

/**
 * 模擬一個複雜的類
 * 其中包含一個普通內部類和一個靜態內部類
 * 靜態內部類包含普通方法和靜態方法
 * 還有一個靜態內部對象
 * 類的實例化和方法的調用各不相同
 */
public class MyClass {
    public static MyStaticInnerClass cls = new MyStaticInnerClass();

    class MyInnerClass {
        public void show() {
            log("普通內部類實例 普通方法");
        }
    }

    static class MyStaticInnerClass {
        public void show() {
            log("靜態內部類實例 普通方法");
        }

        public static void showInfo() {
            log("靜態內部類或實例 靜態方法");
        }
    }
}

在這個類裏面我們調用了剛纔創建的工具類,使用靜態導包,直接導入方法,使用的時候不用指定類,直接使用方法。不過也只有靜態方法可以這樣。

3. 最後我們創建一個測試類StaticTest,來查看效果:

package com.chris.demo.statictest;

import static com.chris.demo.statictest.MyUtils.log;
import static java.lang.System.out;
/*
修飾符static的作用總結起來大概有五種:
1. 修飾靜態屬性;
2. 修飾靜態方法;
3. 修飾靜態內部類;
4. 靜態導包(類或者方法,可以通配);
5. 標記靜態代碼塊。
 */

public class StaticTest {
    private static String msg;

    static {
        msg = "在靜態代碼塊中給靜態屬性賦值";
    }

    public static void main(String[] args) {
        test1();
    }

    private static void test1() {
        out.println("靜態導包");
    }

    private static void test2() {
        log("導入靜態方法");
    }

    private static void test3() {
        log(msg);
    }

    private static void test4() {
        //普通內部類的實例化
        MyClass myClass = new MyClass();
        MyClass.MyInnerClass innerClass1 = myClass.new MyInnerClass();
        //MyClass.MyInnerClass innerClass2 = (new MyClass()).new MyInnerClass();
        innerClass1.show();
        //靜態內部類的實例化
        MyClass.MyStaticInnerClass staticInnerClass = new MyClass.MyStaticInnerClass();
        //靜態內部類實例的普通方法
        staticInnerClass.show();
        staticInnerClass.showInfo();
        //靜態內部類的靜態方法
        MyClass.MyStaticInnerClass.showInfo();
        //靜態成員的方法調用,類似System.out.println("Hello,World!");
        MyClass.cls.show();

    }
}

五種作用都包含其中,很容易看到效果。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章