java基礎之--static關鍵字

static關鍵字的介紹

  • 在類中用static聲明的成員變量爲靜態成員變量,是類的公用變量,在第一次使用時初始化,只初始化一次
  • 用static聲明的方法爲靜態方法,在static方法中不可以訪問非靜態成員
  • 可以通過對象引用和類名訪問靜態成員

在一個類裏面,每new一個對象,這個對象就有自己的成員變量,但是這些成員變量不是靜態的成員變量,對於static成員變量而言,這個成員變量只有一份,而且這一份是這個類所有成員變量的共享。

下面通過代碼示例說明:

package com.mlin;

public class Student {
    
    private static int pid = 0;//靜態成員變量
    
    private String name;//非靜態成員變量
    
    private int id;//非靜態成員變量
    
    public Student(String name){
        this.name = name;
        id = pid++;
    }
    
    public void info(){
        System.out.println("id="+id+",name="+name);
    }

    public static void main(String[] args){
        Student.pid = 10;
        Student s1 = new Student("andy");
        Student s2 = new Student("luce");
        
        s1.info();
        s2.info();
        
    }
}

打印結果如下:


通過代碼示例可以看出pid這個靜態成員變量被整個類共享,在這裏隨着對象的增加來增加,有計數功能。
  
這裏是new了兩個學生出來,這兩個學生分別有自己的成員變量name和id,所以這裏的id和name都是非靜態成員變量,即沒有static修飾。但對於靜態成員變量來說,不管new了多少個對象,靜態成員變量在數據區只有一份。就像上面代碼示例中的pid,他只有一份,兩個學生對象共享。

靜態成員變量是屬於整個類的,它不屬於專門的某個對象。那麼如何訪問這個靜態成員變量的值呢?
1,任何一個對象都可以訪問這個靜態的值,訪問的都是同一塊內存。
2,即便是沒有對象也可以訪問這個靜態的值,通過“類名.靜態成員變量名”來訪問這個靜態的值。

再看下面一個例子:

package com.mlin;

public class Student {
    
    private int pid = 0;//非靜態成員變量
    
    private String name;//非靜態成員變量
    
    private int id;//非靜態成員變量
    
    public Student(String name){
        this.name = name;
        id = pid++;
    }
    
    public void info(){
        System.out.println("id="+id+",name="+name);
    }

    public static void main(String[] args){
        Student s1 = new Student("andy");
        Student s2 = new Student("luce");
        
        s1.info();
        s2.info();
        
    }
}

這個例子和第一個例子唯一的區別就是這裏的pid不在是靜態的成員變量。看結果可以得知兩個學生對象的id都是爲0,意味着這裏的pid並沒有改變。因爲他是非靜態成員變量,每一個new 出來的對象都具有這個pid屬性,他不再是類的全局共享,也就是說沒new 一個學生對象他就有自己的pid屬性,而這個pid屬性初始化時就是0,所以兩個學生對象的id都是0。

總結

  • 靜態方法不再是針對某一個對象來調用,不能訪問非靜態的成員。

  • 非靜態成員專屬於某一個對象,訪問非靜態成員必須new一個對象出來才能訪問。

  • 靜態的變量可以通過對象名去訪問,也可以通過類名去訪問,兩者訪問的都是同一塊內存。如上面代碼中就是:s1.pid 或 Student.pid

  • 局部變量分配內存永遠在棧裏面,new出來的東西分配內存永遠是在堆裏,靜態的東西分配內存永遠是在數據區。剩下的代碼是在代碼區

原創作者:凌小樣
作品鏈接:https://www.jianshu.com/p/ea236f8075e3
【原創不易,轉載請註明出處,感謝理解】
一位愛生活,愛創作,愛分享,愛自己的90後女程序員一枚,記錄工作中的點點滴滴,一起學習,共同進步,期待能和優秀的您交上朋友

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