首頁  >  文章  >  Java  >  Java 基礎入門隨筆(8) JavaSE版-靜態static

Java 基礎入門隨筆(8) JavaSE版-靜態static

黄舟
黄舟原創
2016-12-22 13:08:051304瀏覽

面向對象(2)

this:代表對象。代表哪個對象呢?當前對象。

當成員變數和局部變數重名,可以用關鍵字this來區分。

this就是所在函數所屬物件的參考。 (簡單說:哪個物件呼叫了this所在的函數,this就代表哪個物件。)

this也可以用來在建構子中呼叫其他建構子。注意:只能定義在建構函數的第一行。因為初始化動作要先執行。

        例如:person(String name){this.name = name;}

             到了本類的對象,通常都是用this。

static:

特點:1.static是一個修飾符,用來修飾成員。

          2.static修飾的成員為所有的物件所共享的。

          3. static優先於物件存在,因為static的成員隨著類別的載入就已經存在了。

          4.static修飾的成員多了一種調用方式,就是可以直接被類別名稱所調用,如:類別名稱.成員變數。

          5.static修飾的資料是共享數據,且物件中的儲存的時特有資料。

注意:成員變數也稱為實例變數;static修飾的變數稱為靜態變數或叫類變數。

 

成員變數與靜態變數的差異:

1.兩個變數的生命週期不同。

   成員變數隨著物件的創建而存在,隨著物件的回收而被回收和釋放;

   靜態變數隨著類別的載入而存在,隨著類別的消失而消失。

2.呼叫方式不同。

   成員變數只能被物件調用;

   靜態變數可以被物件調用,也可以被類別名稱調用(建議)。

3.別名不同。

   成員變數稱為實例變數;

   靜態變數稱為類別變數。

4.資料儲存位置不同。

成員變數資料儲存在堆記憶體的物件中,所以也叫物件的特有資料。

靜態變數資料儲存在方法區(共用資料區)的靜態區,所以也叫物件的共用資料。

 

靜態使用的注意事項:

1.靜態方法只能存取靜態成員。 (非靜態既可以存取靜態,又可以存取非靜態)(說明:注意此處針對同一個類別的環境下,靜態方法只能呼叫本類別中的靜態成員)

2.靜態方法中不可以使用this或者super關鍵字。

3.主函數是靜態的。

靜態什麼時候用?

1.靜態變數。

   當分析對像中所具備的成員變數都是相同的,這時這個成員變數可以被靜態修飾。

   只要數據在物件中都是不同的,那就是物件的特有數據,必須儲存在物件中,是非靜態的。

   如果是相同的數據,物件不需要做修改,只需要使用即可,不需要儲存在物件中,定義成靜態的。

2.靜態函數。

函數是否以靜態修飾,只要參考一點,就是該函數功能是否有存取到物件中的特有資料。

簡單點說,從原始碼看,該功能是否需要存取非靜態的成員變量,如果需要,該功能就是非靜態的,如果不需要,就可以將功能定義為靜態的。

當然,也可以將該功能定義成非靜態,但是非靜態需要被對象調用,而僅創建對象調用非靜態的沒有訪問特有數據的方法,該對象的創建時沒有意義的。

 

主函數特殊之處:

1.格式是固定的;2.被jvm所識別和調用。

public:因為權限必須是最大的。

static:不需要物件的,直接用主函數所屬類別名稱呼叫即可。

void:主函數沒有特定的回傳值。

main:函數名,不是關鍵字,只是一個jvm識別的固定的名字。

String[] args:這是主函數的參數列表,是一個陣列類型的參數,而且元素都是字串類型。 (可在呼叫主函數時傳入,例如:java mainDemo xx yy zz 即為傳入了3個元素的字串陣列)

靜態程式碼區塊建構程式碼區塊局部程式碼區塊:

靜態程式碼區塊:隨著類別的載入而執行。而且只執行一次。作用:用於給類別進行初始化。

建構程式碼區塊:隨著物件的建立而執行,物件建立幾次即呼叫幾次。作用:可以給所有物件初始化的。 (與建構子的區別:建構子是給對應的物件進行針對性的初始化。而建構程式碼區塊物件初始化的通用性。)

局部程式碼區塊的作用:限定局部變數的生命週期。

三者的呼叫順序如下:

class StaticCode
{
    static int num ;
    //静态代码块 (首先执行)
    static
    {
        num = 10;
//      num *=3;
        System.out.println("hahahah");
    }
    StaticCode(){}
 
    static void show()
    {
        System.out.println(num);
    }
}
 
class Person
{
    private String name;
     
     
 
    {//构造代码块。可以给所有对象进行初始化的。(如有调用对象,即其次调用,与局部代码块视情况而定)
 
        System.out.println("constructor code ");
//      cry();
    }
     
    static
    {
        System.out.println("static code");
    }
     
    Person()//是给对应的对象进行针对性的初始化。 
    {
        name = "baby";
//      cry();
    }
    Person(String name)
    {
        this.name  = name;
//      cry();
    }
    public void cry()
    {
        System.out.println("哇哇");
         
    }
 
    public void speak()
    {
        System.out.println("name:"+name);
    }
 
    static void show()
    {
        System.out.println("show run");
    }
}
 
 
class StaticCodeDemo 
{
    static
    {
//      System.out.println("a"); //先执行
    }
    public static void main(String[] args) 
    {
 
//      Person p = null;
//      p.speak();
 
//      Person.show();
//      Person p1 = new Person();
//      p1.speak();
//      Person p2 = new Person("旺财");
//      p2.speak();
//      new Person();
         
 
//      new StaticCode().show();
//      new StaticCode().show();
//      StaticCode.show();
//      System.out.println("b");    //后执行
    }
}

 以上就是Java 基礎入門隨筆(8) JavaSE版-靜態static的內容,更多相關內容請關注PHP中文網(www.php.cn)!


陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn