1. 程式人生 > >java基礎(四)static修飾類

java基礎(四)static修飾類

在前面的部落格中,談到了static修飾類內部變數及程式碼塊的用法,卻忽略了其用來修飾內部類的情況。
為何會有用來修飾類的用法,及所有static用法的本質是什麼?這篇文章就解釋著兩個問題。
一、內部類
如果一個類要被宣告為static的,只有一種情況,就是靜態內部類。如果在外部類宣告為static,程式會編譯都不會過。在一番調查後個人總結出了3點關於內部類和靜態內部類(俗稱:內嵌類)

特點:
1.靜態內部類跟靜態方法一樣,只能訪問靜態的成員變數和方法,不能訪問非靜態的方法和屬性,但是普通內部類可以訪問任意外部類的成員變數和方法
2.靜態內部類可以宣告普通成員變數和方法,而普通內部類不能宣告static成員變數和方法。
3.靜態內部類可以單獨初始化:
Inner i = new Outer.Inner();
普通內部類初始化:
Outer o = new Outer();
Inner i = o.new Inner();

靜態內部類使用場景一般是當外部類需要使用內部類,而內部類無需外部類資源,並且內部類可以單獨建立的時候會考慮採用靜態內部類的設計。

public class Outer {
    private String name;
    private int age;

    public static class Builder {
        private String name;
        private int age;

        public Builder(int age) {
            this.age = age;
        }

        public Builder withName(String name) {
            this.name = name;
            return this;
        }

        public Builder withAge(int age) {
            this.age = age;
            return this;
        }

        public Outer build() {
            return new Outer(this);
        }
    }

    private Outer(Builder b) {
        this.age = b.age;
        this.name = b.name;
    }
}

靜態內部類呼叫外部類的建構函式,來構造外部類,由於靜態內部類可以被單獨初始化說有在外部就有以下實現。

public Outer getOuter()
{
    Outer outer = new Outer.Builder(2).withName("Yang Liu").build();
    return outer;
}

對於靜態類總結是:
1.如果類的構造器或靜態工廠中有多個引數,設計這樣類時,最好使用Builder模式,特別是當大多數引數都是可選的時候。
2.如果現在不能確定引數的個數,最好一開始就使用構建器即Builder模式。

二、本質問題
理解了之前的文章,你只是初步瞭解了static,要想更近一步的理解static,就要讀懂這句話:"static可以用來區分成員變數、方法是屬於類本身還是屬於類例項化後的物件。有static修飾的成員屬於類本身,沒有static修飾的成員屬於類的例項。"很多初學者會搞不懂類和類的例項有什麼不同?類是抽象的存在,而類的例項是類具體化的存在。兩者是有區別的,因此就會發生一種情況,那就是有些類例項化後沒有任何意義,也就是說沒有例項化的必要,只有作為類才有意義。這時候,就必須用static來修飾成員變數和方法,表明這些變數和方法只屬於類本身。比如:在做一個專案的時候,一個合格的軟體工程師都會封裝一個公共方法類,將經常用的公共方法放在裡面,以便隨時在專案中呼叫。這時候,你會發現,這個公共方法類,並沒有一個合適的具體化的例項可以來表示,只有作為類的時候,才有其意義。所以裡面的公共方法都可以用static來修飾,以表示這些方法都屬於類本身,就不需要每一次使用一個公共方法的時候都要例項化出一個具體的物件了。還有就是像做安全防範(sql注入過濾、xss過濾等)的時候,將其統一封裝成一個Security類,裡面的方法就需要用到static來修飾,不然難道每一次過濾都要例項化一次嗎?再開一個堆記憶體空間?類似的還有語言包、快取等等。

參考:
Java靜態類
靜態修飾符static的使用場景