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後女程序員一枚,記錄工作中的點點滴滴,一起學習,共同進步,期待能和優秀的您交上朋友