1. 程式人生 > 其它 >Java基礎系列--static

Java基礎系列--static

技術標籤:Java(coding)

常用操作

設定靜態成員變數

package org.example.a;

class User{
    private static String name;

    public static void setName(String name) {
        User.name = name;
//        name = name;    
    }

    public static String getName() {
        return User.name;
//        return name;
    }
}

public class Demo {
    public static void main(String[] args) {
        User.setName("Tony");
        System.out.println(User.getName());
    }
}

執行結果

Tony

若set使用“name = name”,則輸出為null。因為這樣設定的name是物件成員而非類成員。
若get使用return name;跟return User.name效果是一樣的。

使用位置

用法1 修飾成員屬性

給屬性加了static關鍵字之後,物件就不再擁有該屬性了,該屬性會統一交給類去管理,即多個物件只對應一個屬性。

用法2 修飾成員方法

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

用法3 修飾程式碼塊

static { }就是靜態塊,當類載入器載入類的時候,這一部分程式碼被執行,常用於對靜態變數進行初始化工作。

程式碼只能執行一次,不能再呼叫。在靜態塊中,可以訪問靜態變數,呼叫靜態方法。

如果去掉static,{ }中的程式碼則會在建立類物件的時候才執行,(相當於把這部分程式碼複製到各個建構函式中),這樣可以實現塊中的內容在多個建構函式中的複用。

package com.example;

class Test{
    {
        System.out.println("This is Block");
    }

    public Test(){
        System.out.println("This is Test()");
    }

    public Test(String string){
        System.out.println("This is Test(String string)");
    }
}

public class Demo {
    public static void main(String[] args) {
        Test test1 = new Test();
        Test test2 = new Test("Hello");
    }
}

執行結果

This is Block
This is Test()
This is Block
This is Test(String string)

用法4 修飾內部類

static不能修飾普通類,但可以修飾內部類。原因如下:

static修飾的東西被我們成為類成員,它會隨著類的載入而載入,比如靜態程式碼塊,靜態成員,靜態方法(這裡只是載入,並沒有呼叫)等等。若把一個Class檔案中的外部類設為static,那目的何在呢?難道讓這個類隨著應用的啟動而載入嗎?如果我在這次使用過程中根本沒有使用過這個類,那麼是不是就會浪費記憶體。這樣來說設計不合理,總而言之,設計不合理的地方,Java是不會讓它存在的。

為什麼內部類可以使用static修飾呢,因為內部類算是類的成員了,如果我們沒有使用靜態來修飾,那麼我們在建立內部類的時候就需要先有一個外部類的物件,如果我們一直在使用內部類,那麼記憶體中就會一直存在外部類的引用,而我們有時候只需要使用內部類,不需要外部類,那麼還是會浪費記憶體,甚至會造成記憶體溢位。使用static修飾內部類之後,內部類在建立物件時就不需要有外部類物件的引用了。

例項:

單例模式的靜態內部類寫法(Java設計模式系列--單例模式的5種寫法_設計模式_feiying0canglang的部落格-CSDN部落格

public class Singleton {
    private static class SingletonHolder {
	private static final Singleton INSTANCE = new Singleton();
    }
    private Singleton (){}
    public static final Singleton getInstance() {
	return SingletonHolder.INSTANCE;
    }
}

public class Demo{
    public static void main(String[] args) {
        Singleton singleton = Singleton.getInstance();
        System.out.println(singleton);
    }
}

用法5 靜態導包

匯入時,使用static關鍵字,而且在引入類的最後還加上了“.*”,它的作用就是將PrintHelper類中的所有類方法直接匯入。不同於非static匯入,採用static匯入包後,在不與當前類的方法名衝突的情況下,無需使用“類名.方法名”的方法去呼叫類方法了,直接可以採用"方法名"去呼叫類方法,就好像是該類自己的方法一樣使用即可。

/* PrintHelper.java檔案 */
package com.dotgua.study;
 
public class PrintHelper {
    public static void print(Object o){
        System.out.println(o);
    }
}
import static com.dotgua.study.PrintHelper.*;

public class Demo{
    public static void main( String[] args )
    {
        print("Hello World!");
    }
}